À partir d'un point de départ et d'arrivée et d'une distance, calculez un point le long d'une ligne
Question
Recherche du moyen le plus rapide de calculer un point situé sur une ligne une distance donnée du point final de la ligne:
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 = ???
}
Merci pour les réponses, non ce n’est pas un devoir, mais un peu de piratage mon domaine d'expertise habituel.
C’est la fonction suggérée ci-dessous. Ce n'est pas près de travailler. Si je calculer des points tous les 5 degrés dans la partie supérieure droite de 90 degrés de un cercle comme points de départ et appelez la fonction ci-dessous avec le centre du cercle x2, y2 avec une distance de 4, les points finaux sont totalement faux. Ils se trouvent en dessous et à droite du centre et la longueur est aussi longue que le point central. Quelqu'un a des suggestions?
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) );
}
J'ai trouvé la solution sur stackoverflow mais ne le comprenez pas complètement, est-ce que quelqu'un peut clarifier?
La solution
Je pense que cela appartient à MathOverflow, mais je vais vous répondre puisqu'il s'agit de votre premier message. Commencez par calculer le vecteur de x1y1 à x2y2:
float vx = x2 - x1;
float vy = y2 - y1;
Calculez ensuite la longueur:
float mag = sqrt(vx*vx + vy*vy);
Normaliser le vecteur en unité de longueur:
vx /= mag;
vy /= mag;
Enfin, calculez le nouveau vecteur, qui est x2y2 + vxvy * (mag + distance).
*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));
Vous pouvez omettre certains calculs en multipliant par distance / mag.
Autres conseils
Ces équations sont fausses:
px = (int) ( (double) x2 + vx * (mag + (double)distance) );
py = (int) ( (double) y2 + vy * (mag + (double)distance) );
Les équations correctes sont les suivantes:
px = (int) ( (double) x2 + vx * (double)distance );
py = (int) ( (double) y2 + vy * (double)distance );
Tom