2012-04-11 2 views
0

Как найти точку на прямой, которая находится на определенном расстоянии от заданной точки. Я пишу этот код в C, но я не получаю правильный ответ. Можете ли вы кого-нибудь известить меня о том, что я делаю неправильно.Точка на прямой на определенном расстоянии от C

Получаю значения x1, y1, x2, y2 и расстояние, оставшееся до конца. Используя их, я могу найти наклон m и y-перехват также отлично. Теперь мне нужно найти точку на прямой, соединяющей эти две точки, расположенную на расстоянии 10 единиц от точки x1, y1. Кажется, я ошибаюсь. вот код, который я написал.

int x1 = node[n].currentCoordinates.xCoordinate; 
int y1 = node[n].currentCoordinates.yCoordinate; 
int x2 = node[n].destinationLocationCoordinates.xCoordinate; 
int y2 = node[n].destinationLocationCoordinates.yCoordinate; 

int distanceleft = (y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1); 
distanceleft = sqrt(distanceleft); 
printf("Distance left to cover is %d\n",distanceleft); 
int m = (y2 - y1)/(x2 - x1); // slope. 
int b = y1 - m * x1; //y-intercept 


//find point on the line that is 10 units away from 
//current coordinates on equation y = mx + b. 
if(x2 > x1) 
{ 
    printf("x2 is greater than x1\n"); 
    int tempx = 0; 
    int tempy = 0; 
    for(tempx = x1; tempx <= x2; tempx++) 
    { 
      tempy = y1 + (y2 - y1) * (tempx - x1)/(x2 - x1); 
      printf("tempx = %d, tempy = %d\n",tempx,tempy); 
      int distanceofthispoint = (tempy - y1) * (tempy - y1) + (tempx - x1) * (tempx - x1); 
      distanceofthispoint = sqrt((int)distanceofthispoint); 
      if(distanceofthispoint >= 10) 
      { 
       //found new points. 
       node[n].currentCoordinates.xCoordinate = tempx; 
       node[n].currentCoordinates.yCoordinate = tempy; 
       node[n].TimeAtCurrentCoordinate = clock; 
       printf("Found the point at the matching distance\n"); 
       break; 
      } 
    } 
} 
else 
{ 
    printf("x2 is lesser than x1\n"); 
    int tempx = 0; 
    int tempy = 0; 
    for(tempx = x1; tempx >= x2; tempx--) 
    { 
      tempy = y1 + (y2 - y1) * (tempx - x1)/(x2 - x1); 
      printf("tempx = %d, tempy = %d\n",tempx,tempy); 
      int distanceofthispoint = (tempy - y1) * (tempy - y1) + (tempx - x1) * (tempx - x1); 
      distanceofthispoint = sqrt((int)distanceofthispoint); 
      if(distanceofthispoint >= 10) 
      { 
       //found new points. 
       node[n].currentCoordinates.xCoordinate = tempx; 
       node[n].currentCoordinates.yCoordinate = tempy; 
       node[n].TimeAtCurrentCoordinate = clock; 
       printf("Found the point at the matching distance\n"); 
       break; 
      } 
    } 
} 
printf("at time %f, (%d,%d) are the coordinates of node %d\n",clock,node[n].currentCoordinates.xCoordinate,node[n].currentCoordinates.yCoordinate,n); 

ответ

7

Вот как это в математике, у меня нет времени, чтобы написать что-то в С.

У вас есть точка (x1,y1) и еще один (x2,y2), когда связано это дает вам сегмент.

Таким образом, у вас есть вектор направления v=(xv, yv), где xv=x2-x1 и yv=y2-y1.

Теперь вам нужно разделить этот вектор на ее норму, вы получите новый вектор: вектор = v/SQRT (ХV + уг).

Теперь, вы просто должны добавить к вашей исходной точке вектор, умноженный на расстояние, на котором вы хотите, чтобы ваша точка:

Позиция = (х происхождения, у происхождения) + расстояние × вектор

Надеюсь, это поможет!

+0

согласен. Я не думаю, что вам действительно нужна петля. На самом деле это алгебра, а не алгоритм. – FlavorScape

+0

Является ли это последним 'v' в векторном уравнении, которое должно быть под sqrt или под фракцией или вне фракции? Вы забыли закрыть скобу :) –

+0

О, хорошо, неважно. Я понимаю. Это снаружи, вы просто умножаете v на 1/.. вместо того, чтобы делать v/... –

0

Или проще,

Найти угол наклона от

θ = arctan(y2-y1/x2-x1) 

Вы можете изменить квадрант & thetas на основе числителе и знаменателе склона. Затем вы можете найти любую точку на линии на расстоянии D от (x1, y1)

x_new = x1 + d×cos(θ) 
y_new = y1 + d×sin(θ) 

В этом случае вы d = 10

Смежные вопросы