À partir d'un point de départ et d'arrivée et d'une distance, calculez un point le long d'une ligne

StackOverflow https://stackoverflow.com/questions/1800138

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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top