Domanda

Cerca il modo più veloce per calcolare un punto che si trova su una linea una data distanza dal punto finale della linea:

void calculate_line_point(int x1, int y1, int x2, int y2, int distance, int *px, int *py) 
{
    //calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2
    *px = ???
    *py = ???
}  

Grazie per le risposte, no, non si tratta di compiti a casa, ma solo un po 'di hacking la mia normale area di competenza.

Questa è la funzione suggerita di seguito. Non è vicino al lavoro. Se io calcolare i punti ogni 5 gradi nella parte in alto a destra di 90 gradi di un cerchio come punti di partenza e chiama la funzione in basso con il centro del cerchio come x2, y2 con una distanza di 4 i punti finali sono totalmente errati. Si trovano sotto e a destra del centro e la lunghezza è lunga quanto il punto centrale. Qualcuno ha qualche suggerimento?

void calculate_line_point(int x1, int y1, int x2, int y2, int distance)
{

//calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2

  double vx = x2 - x1; // x vector
  double vy = y2 - y1; // y vector

  double mag = sqrt(vx*vx + vy*vy); // length

  vx /= mag;
  vy /= mag;

// calculate the new vector, which is x2y2 + vxvy * (mag + distance).

  px = (int) ( (double) x2 + vx * (mag + (double)distance) );
  py = (int) ( (double) y2 + vy * (mag + (double)distance) );

}

Ho trovato questa soluzione su StackOverflow ma non lo capisco completamente, qualcuno può chiarire?

È stato utile?

Soluzione

Penso che questo appartenga a MathOverflow, ma risponderò poiché questo è il tuo primo post. Innanzitutto si calcola il vettore da x1y1 a x2y2:

float vx = x2 - x1;
float vy = y2 - y1;

Quindi calcola la lunghezza:

float mag = sqrt(vx*vx + vy*vy);

Normalizza il vettore alla lunghezza dell'unità:

vx /= mag;
vy /= mag;

Infine calcola il nuovo vettore, che è x2y2 + vxvy * (mag + distance).

*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));

Puoi invece omettere alcuni dei calcoli che si moltiplicano per distance / mag.

Altri suggerimenti

Queste equazioni sono errate:

px = (int) ( (double) x2 + vx * (mag + (double)distance) );

py = (int) ( (double) y2 + vy * (mag + (double)distance) );

Le equazioni corrette sono:

px = (int) ( (double) x2 + vx * (double)distance );

py = (int) ( (double) y2 + vy * (double)distance );

Tom

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top