2009-11-25 31 views
15

Cercando il modo più rapido per calcolare un punto che si trova su una linea di una certa distanza dal punto finale della linea:Dato un punto di inizio e di fine, e una distanza, calcolare un punto lungo una 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 questo non è compito a casa, solo un po 'di hacking di mia normale area di competenza.

Questa è la funzione suggerita di seguito. Non è vicino al lavoro. Se I calcola i punti ogni 5 gradi nella porzione di 90 gradi in alto a destra 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 completamente sbagliati. Si trovano sotto e alla destra del centro e la lunghezza è lunga quanto il punto centrale. Qualcuno ha dei suggerimenti?

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 this soluzione su StackOverflow, ma non lo capisco completamente, chiunque può chiarire?

+4

Forse si dovrebbe usare carri/doppie, perché si otterrà roundi ng errori. Questa potrebbe essere una preoccupazione. – Lucas

+1

Cosa disse Lucas. Inoltre, probabilmente hai letto il mio post mentre avevo un refuso. Se x1y1 è l'origine, vuoi x1y1 + vxvy * (mag + distanza), non x2y2. Ovvero, partendo dall'origine, si desidera percorrere la distanza da _ a x2y2_ più la distanza aggiuntiva, usando la direzione da x1y1 a x2y2. Anche se penso che potresti voler riformulare la tua domanda. Cosa vuoi esattamente fare? La domanda così com'è ora sembra più un problema intermedio. –

+0

[Geometria: trova un punto lungo una linea a una certa distanza da un altro punto!] (Http://math.stackexchange.com/questions/175896/finding-a-point-along-a-line-a-certain- distanza-da-un altro punto/1630886 # 1630886) –

risposta

33

Penso che questo appartenga a MathOverflow, ma risponderò poiché questo è il tuo primo post. In primo luogo si calcola il vettore da X1Y1 a X2Y2:

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

quindi calcolare la lunghezza:

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

normalizzare il vettore di unità di lunghezza:

vx /= mag; 
vy /= mag; 

Infine calcolare il nuovo vettore, che è x2y2 + vxvy * (mag + distanza).

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

È possibile omettere alcuni calcoli moltiplicando con distanza/mag.

+16

sfortunatamente, mathoverflow è troppo snob per intrattenere questo tipo di domanda; appartiene qui. –

+0

Questo è un peccato. –

+1

Scusa se sono ragazzi troppo semplici, totalmente fuori dalla mia normale area di competenza. Grazie per l'aiuto. – amanda

1

Queste equazioni sono sbagliate:

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

Problemi correlati