Domanda

Ho bisogno di trovare i 2 punti di orizzonte visivo, di una superficie curva.

Io ho:

  • XYZ di 4 punti d'angolo
  • XYZ del 2 sponda curva di bezier punti

E ho bisogno di calcolare:

  • XY dell'orizzonte punti
  • XYZ dell'orizzonte punti
È stato utile?

Soluzione

Prima di tutto devi convertire il tuo 3D beziers a 2D.Se ricordo bene è sufficiente per proiettare le curve e basta, come progetto di punti 3D per il rendering.

Poi devi trovare la extrema delle curve.

Un piccolo HowTo:

Convertire il vostro bezier curve-curve di bezier rappresentazione di un polyonomial di forma

  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.

Ora è costruire la prima derivazione della curva (facile in quanto è un polynomail).Questo vi darà una equazione quadratica.Risolvere questi per le radici ed eliminare tutte le radici che sono al di fuori della 0..1 gamma.Ritrovare le radici è facile in quanto è solo una funzione polinomiale.

È come avere un sacco di radici.Collegare tutti questi back into the original curva di bezier, valutare la loro posizione e si ottiene un sacco di punti.L'extrema - se esiste - sarà tra questi punti.

Ora tutto quello che dovete fare è cercare quello con il più alto (o più basso - so come sistema di coordinate sembra) coordinata y.

Nota che non si può ottenere una extrema a tutti.Questo accade se il bezier, per esempio, è una linea retta.In questi casi si consiglia di includere il primo e l'ultimo controllo di bezier punto di extrema ricerca.


EDIT:

Hai chiesto come attivare la di bezier in un polinomio.Bene, si inizia con la normale curva di bezier equazione:

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

(x0 a x3 sono i valori di x di controllare quattro punti della curva).

Quindi moltiplicare tutti i termini, uno dopo l'altro e li ordina dal potenze di t.Purtroppo non ho il mio pacchetto di matematica in esecuzione sul computer che sto scrivendo, e io sono pigro per farlo, sulla carta :-) Quindi, se qualcuno ha mathlab in esecuzione, si potrebbe si prega di modificare questa risposta e aggiungere la versione estesa?

Comunque, dato che non siete realmente interessati nel polinomio, ma solo il derivato di esso le cose sono un po ' più facile.È possibile ottenere i coefficienti direttamente (qui mostrato per x):

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'utilizzo di questi tre valori (A,B,C) il polinomio di primo derivato simile a questo:

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

Ora il connettore A,B e C in una radice risolutore di equazioni polinomiali di secondo grado e il gioco è fatto.Per riferimento, io uso il risolutore C-codice riportato di seguito:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top