2017-08-15 5 views
-3

J'essaie de prendre deux points et deux tangentes et de résoudre pour y donné x. Cependant, toutes les ressources que j'ai trouvées en ligne pour le faire en ligne sont un peu différentes de ce dont j'ai besoin. Toutes les ressources m'ont permis de trouver x et y avec un pourcentage compris entre 0 et 1. Ce n'est pas ce dont j'ai besoin. Je vais essayer d'expliquer ce que je veux dire avec l'image ci-dessous:Courbe de Bézier - Utiliser (Graphique) X pour résoudre Y

curve

Je sais que cette courbe est plusieurs lignes de Bézier, mais je suis juste en train de faire un point. C'est un peu plus facile à démontrer sur une ligne très sinueuse. Si j'essaie d'obtenir la sortie y pour un pourcentage de 0,5 sur les formules que j'ai trouvées en ligne, je vais (probablement) approximativement le point rouge. Ce n'est pas ce que je veux. Je veux résoudre pour .5 sur le graphique, et ne pas utiliser le pourcentage du graphique. Je veux résoudre pour la ligne bleue. Est-ce que quelqu'un sait comment je peux accomplir cela? Aussi, si je fais une boucle avec les lignes, est-il possible de trouver les deux valeurs y?

Si quelqu'un est assez aimable pour me écrire un petit échantillon, je suis en utilisant C#, et les variables: Vecteur2 commence, TAN1, fin, tan2; // Chaque contiennent x et float y temps de flotteur; // la temps sur le graphique que nous voulons résoudre pour (entre 0 et 1)

 Vector2 start = new Vector2(50, 150), end = new Vector2(150, 150), tan1 = new Vector2(65, 30), tan2 = new Vector2(90, 160), delta; 
    float t = .5f; 
    delta = end - start; 
    GLDraw.DrawBezier(start, tan1, end, tan2, Color.red, 1); 
    GLDraw.DrawBox(new Rect(tan1.x - 1, tan1.y - 1, 2, 2), Color.red, 1); 
    GLDraw.DrawBox(new Rect(tan2.x - 1, tan2.y - 1, 2, 2), Color.red, 1); 
    float X = Mathf.Pow((1 - t), 3) * start.x + 3 * Mathf.Pow((1 - t), 2) * t * tan1.x + 3 * (1 - t) * Mathf.Pow(t, 2) * tan2.x + Mathf.Pow(t, 3) * end.x; 
    float Y = Mathf.Pow((1 - t), 3) * start.y + 3 * Mathf.Pow((1 - t), 3) * t * tan1.y + 3 * (1 - t) * Mathf.Pow(t, 2) * tan2.y + Mathf.Pow(t, 3) * end.y; 
    GLDraw.DrawBox(new Rect(X - 1, Y - 1, 2, 2), Color.red, 1); 

[drawnCurve[2]

+0

spécifiquement quel genre de problèmes rencontrez-vous avec le code. nous ne sommes pas un service d'écriture de code. –

+0

Vous ne pouvez pas résoudre les courbes de Bézier pour une valeur 'x' spécifique car ce ne sont pas des graphes de fonctions classiques. Vous pouvez définir une seule courbe bezier qui a 3 solutions pour le même 'x'. Vous pouvez cependant croiser la courbe avec une ligne verticale commençant par '(x, 0)' et récupérer toutes les intersections possibles. – Psi

+0

Le problème est que je ne connais pas les mathématiques nécessaires pour réaliser une telle tâche. Mais j'utilise Unity et je ne crée pas directement la courbe de Bézier, j'utilise une fonction que je n'ai pas écrite. Je vais coller le code comme une modification ci-dessus momentanément. – TheNoobieWaffle

Répondre

1

Vous avez équation inconnue t et donné XValue. Il suffit d'ouvrir les parenthèses et de résoudre l'équation cubique résultante pour t. Notez que l'équation peut avoir jusqu'à trois solutions.

(1 - t)^3 * start.x + 
3 * (1 - t)^2 * t * tan1.x + 
3 * (1 - t) * t^2 * tan2.x + 
t^3 * end.x - XValue    = 0 

t^3 * (-start.x + 3 * tan1.x - 3 * tan2.x + end.x) + 
t^2 * (3*start.x - 6 * tan1.x + 3 * tan2.x) + 
t * (-3*start.x + 3 * tan1.x) + 
     (start.x - XValue)   = 0 
0

Cet article explique ce que j'avais besoin de savoir. Pendant tout ce temps, je cherchais un moyen d'accomplir cela, je cherchais des choses liées à «la courbe de bezier résoudre y de x», mais trouver des intersections était beaucoup plus proche de ce dont j'avais besoin. Désolé d'être très peu clair. https://www.particleincell.com/2013/cubic-line-intersection/