Question

Je dois trouver les 2 points du horizon visuel , d'une face incurvée.

Je:

  • XYZ des 4 points d'angle
  • XYZ des 2 points de Bézier de bord courbe

Et je dois calculer soit:

  • XY des points d'horizon
  • XYZ des points d'horizon
Était-ce utile?

La solution

Tout d'abord, vous devez convertir vos beziers 3D en 2D. Si je me souviens bien, il suffit d'projeter les courbes comme vous projetez des points 3D pour le rendu.

Ensuite, vous devez trouver les extrema des courbes.

Un petit HowTo:

Convertir votre Bézier courbe de représentation de Bézier à une polyonomial du formulaire

  x(t) = a*t^3 + b*t^2 + c*t + d
  y(t) = e*t^3 + f*t^2 + g*t + g

  Here t is your interpolation variable that goes from 0 to 1.
  a to d are the coefficients for the curve along the x-axis
  e to g are the coefficients for the curve along the y-axis.

Maintenant, vous construisez la dérivée première de la courbe (facile car il est un polynomail). Cela vous donnera une équation du second degré. Résoudre ces pour les racines et jeter toutes les racines qui sont en dehors de la plage de 0..1. Encore une fois trouver les racines est facile car il est juste un polynôme quadratique.

Vous avez comment un tas de racines. Branchez tous ces nouveau dans la courbe de Bézier d'origine, d'évaluer leur position et vous obtenez un tas de points. Extrema - si elles existent - sera parmi ces points.

Maintenant, tout ce que vous avez à faire est de rechercher celui qui a le plus haut (ou plus bas - dunno comment votre système de coordonnées ressemble). Coordonnée y

Notez que vous ne pouvez pas obtenir un extrema du tout. Ce happends si votre Bézier est par exemple une ligne droite. Dans ces cas, vous pouvez inclure le premier et le dernier point de contrôle de Bézier dans votre recherche d'extrema ainsi.


EDIT:

Vous avez demandé comment transformer le Bézier en un polynôme. Eh bien, vous commencez avec l'équation de la courbe de Bézier normale:

 x(t) = x0 * (1-t)³ + 3*x1*(1-t)²*t + 3*x2*(1-t)*t² +x3*t³

(x0 à x3 sont les valeurs x des quatre points de contrôle de la courbe).

Ensuite, vous multipliez sur tous les termes les uns après les autres et les trier par les puissances de t. Malheureusement, je n'ai pas mon paquet de mathématiques en cours d'exécution sur l'ordinateur que je vous écris, et je suis paresseux pour le faire sur papier :-) Donc, si quelqu'un a en cours d'exécution Matlab, pourriez-vous s'il vous plaît modifier cette réponse et ajoutez le décompressé version plus récente?

Quoi qu'il en soit, puisque vous n'êtes pas vraiment intéressé par le polynôme mais juste le dérivé de celui-ci les choses sont un peu plus facile. Vous pouvez obtenir les coefficients directement (représenté ici pour x seulement):

A = 3.0f*(x[1] - x[0]);
B = 6.0f*(x[2] - 2.0f*x[1] + x[0]);
C = 3.0f*(x[3] - 3.0f*x[2] + 3.0f *x[1] - x[0]);

L'utilisation de ces trois valeurs (A, B, C) le polynôme du premier dérivé ressemble à ceci:

  x(t) = A*t^2 + B*t + C

Maintenant, branchez A, B et C dans un solveur de racine pour polynômes du second degré et vous avez terminé. Pour référence, j'utilise le code C-solveur ci-dessous:

int GetQuadraticRoots (float A, float B, float C, float *roots)
{
  if ((C < -FLT_EPSILON) || (C > FLT_EPSILON))
  {
    float d,p;
    // it is a cubic:
    p = B*B - 4.0f * C*A;
    d = 0.5f / C;
    if (p>=0)
    {
      p = (float) sqrt(p);
      if ((p < -FLT_EPSILON) || (p > FLT_EPSILON))
      {
        // two single roots:
        roots[0] = (-B + p)*d;
        roots[1] = (-B - p)*d;
        return 2;
      } 
      // one double root:
      roots[0] = -B*d;
      return 1;
    } else {
      // no roots:
      return 0;
    }
  } 
  // it is linear:
  if ((B < -FLT_EPSILON) || (B > FLT_EPSILON))
  {
    // one single root:
    roots[0] = -A/B;
    return 1;
  }
  // it is constant, so .. no roots.
  return 0;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top