Dato un punto iniziale e finale e una distanza, calcola un punto lungo una linea
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?
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