시작과 종말점과 거리가 주어지면 선을 따라 지점을 계산하십시오.

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

문제

선의 끝점에서 주어진 거리에있는 줄에있는 점을 계산하는 가장 빠른 방법을 찾고 있습니다.

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 = ???
}  

답변에 감사드립니다. 이것은 숙제가 아니라 내 정상적인 전문 분야에서 해킹하는 것입니다.

이것은 아래에 제안 된 기능입니다. 일에 가깝지 않습니다. 원의 오른쪽 상단 90도에서 5도마다 포인트를 출발점으로 계산하고 원의 중심을 x2, y2로 아래의 함수를 4 인 4의 거리는 끝점이 완전히 잘못되었습니다. 그들은 중앙의 아래와 오른쪽에 있으며 길이는 중심 지점만큼 길다. 누구든지 제안이 있습니까?

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) );

}

내가 찾았 어 이것 STACKOVERFLOW에 대한 솔루션이지만 완전히 이해하지 못합니다. 누구든지 명확히 할 수 있습니까?

도움이 되었습니까?

해결책

나는 이것이 MathoverFlow에 속한다고 생각하지만 이것이 첫 번째 게시물이기 때문에 대답하겠습니다. 먼저 X1Y1에서 X2Y2에서 벡터를 계산합니다.

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

그런 다음 길이를 계산합니다.

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

벡터를 단위 길이로 정규화하십시오.

vx /= mag;
vy /= mag;

마지막으로 x2y2 + vxvy * (mag + 거리) 인 새 벡터를 계산하십시오.

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

대신 거리 / 매기를 곱하는 일부 계산 중 일부를 생략 할 수 있습니다.

다른 팁

이 방정식은 잘못되었습니다.

px = (int) ( (double) x2 + vx * (mag + (double)distance) );

py = (int) ( (double) y2 + vy * (mag + (double)distance) );

올바른 방정식은 다음과 같습니다.

px = (int) ( (double) x2 + vx * (double)distance );

py = (int) ( (double) y2 + vy * (double)distance );

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top