2012-04-14 2 views
3

잠시 후 기하학적 코드가 지겨워집니다. 그러나이 라이브러리를 완성하고 싶습니다. 더 이상, B 서로 교차하도록하나의 선분이 다른 선분과 교차하는 것을 어떻게 중지합니까?

기본적으로, 하나의 선분하는 이동하는 가장 효율적인 방법은 무엇 없다?

두 선분이 시점 (X, Y)과 세그먼트가 그 시점 (예, EY)로부터 연장하는 방법을 설명하기위한 벡터로 정의된다. 선분을 설명하는 방법의 예는 아래와 같다 :

enter image description here

선분 가장 가까운 위치에 위치로 (그 범위를 어떠한 방식으로 수정되지 않음)로 이동되는 경우 I가 바라는 용액 그것은 교차하지 않습니다. 예 :

enter image description here

이 결과를 얻을 수있는 가장 효율적인 방법은 무엇입니까?

편집 : 사람들은 내가 "이동"에 의해 무엇을 의미하는지 물었다 - 나는 (X, Y)를 변경 선분의 시점의 좌표를 의미한다. 그러면 전체 세그먼트가 번역됩니다.

그리고 선분 직교 평면에 존재하고, 임의의 X/Y의 이동은 허용된다. 당신이하는 당신이 자유롭게 이동할 수있는 치수를 지정하지 않기 때문에

+0

방향을 이동할 수 있습니까? – j13r

+0

이동이란 무엇을 의미합니까? x, y를 변경하지만 ex, ey는 일정하게 유지 하시겠습니까? 세그먼트의 길이가 일정한 한 x, y, ex, ey를 변경할 수 있습니까? – emory

답변

4

어때? : 네 개의 벡터를 찾으십시오. 두 개는 검정 선에 수직으로가는 빨간색 선의 끝점에서 두 개, 빨간색 선에서 검정 선의 끝점까지 수직으로 두 개입니다. 이 벡터 중 가장 짧은 것을 가져 와서 빨간색 선을 따라 이동하십시오.

+0

아주 좋은 생각입니다. – CodeBunny

0

, 나는 어떤 잘 있다고 가정합니다.

나는 당신의 빨간 선은 시작 지점 (X, Y) 및 엔드 포인트 (예, EY)에 거기에서 벡터 특징입니다 가정합니다. 따라서 선상의 모든 점은 [0,1] * (eX, eY) + (x, y)입니다.

선이 교차하는 지점을 찾습니다. 그것은 a [0,1]이있는 a * (eX1, eY1) + (x1, y1) = (eX2, eY2) + (x2, y2)입니다.

이 교차점이 있으면이 교차점에서 끝나도록 선을 움직일 수 있습니다. 길이는 이동해야합니다.

은 (X1 ', Y1') = (X1, Y1)

- A * (EX1, eY1)

이 방법, 당신은 당신이 전에 발견 교차 지점까지 거리의 시작점을 이동은의 접촉 지점입니다 두 줄.

+0

이 방법의 문제점은 이동 거리가 최단 거리가 아니라는 것입니다. 예, 충돌을 해결하지만 매우 최적이 아닙니다. – CodeBunny

관련 문제