2015-01-19 4 views
2

나는 (0, 0, w, h)에 점 (x, y)과 바운딩 박스를두고 있으며 방향 벡터 (dx, dy) 무작위 방향, 내가 뭘 하려는지 경계 상자의 가장자리에 그 방향에서 그 지점에서 선을 만드는 것입니다.화면 가장자리에서 선까지 연장하기

아래 이미지를 보면 검정색 점이 점이고, 화살표가 방향성 벡터이고 빨간색 선이 내가 원하는 선이됩니다.

지금 내가하고있는 일은 단순히 벡터로 선을 연장하고 상자 밖으로 배치 한 다음 클립으로 클리핑 알고리즘을 사용하여 임의의 큰 숫자로 확장하는 것입니다. 그리고 이것은 완전히 작동하지만, 매우 해킹 된 솔루션처럼 느껴질 수 있습니다. 더 좋은 방법이 있습니까?

Example

+1

수족관이 축 정렬되어 있으면 dx, dy (어떤면이 교차 될 수 있는지 확인), (s1.x - x)/dx 및 (s2. y - y)/dy. – Borgleader

+0

1 년 전에 javascript 프로젝트에서 똑같이 필요했습니다. 관심이 있으시면 [코드 예] (http://i11www.iti.uni-karlsruhe.de/~algogeo14/team4/polygon.js)에서 'intersectScreenEdge' 함수를 볼 수 있습니다 (아래로 스크롤하여 코멘트 블록은 "수학"이라고 말함). 이 함수는 주어진 거리 (매개 변수 'o')로 상자 외부에 점을 배치 할 수 있으므로 예를 들어 둥근 뚜껑으로 그리는 경우 안전합니다. 필요없는 경우'o = 0'을 설정하거나 코드에서'o'를 무시하십시오. – leemes

+1

"임의의 큰 숫자"가 항상 가장자리에 부딪 칠 정도로 크고 (부동 소수점 정밀 문제 또는 다른 예기치 않은 문제를 도입하기에는 너무 커서는 안됨) 보장 할 수있는 한 솔루션을 찾지 못할 수도 있습니다. 길이를 'w + h'로 설정하면 안전합니다 ([삼각형 부등식] (http://en.wikipedia.org/wiki/Triangle_inequality), 대각선 길이에 가깝지만 제곱근이 필요합니다 이는 불필요하게 느리다). (이것을 정규화 된 * dx, dy 벡터로 곱한다고 가정하십시오.) – leemes

답변

1

첫째, 수직선과의 교점을 찾는 방법.

(x0, y0)을 상자 내부의 점으로하고 (dx, dy)를 기울기라고합시다. 그리고 수직선 y = b가있는 교차점을 찾으려고한다고 가정 해보십시오.

x0 + tdx 및 y0 + tdy는 라인상의 포인트입니다. 따라서 선은 y1 = y0 + tdy = b (t> = 0)와 같이 y1에서 수직선과 교차합니다. 그래서 t (t = (b-y0)/dy)를 풀고 같은 t를 사용하여 x1 = x0 + tdx를 구하십시오.

마찬가지로 가로선이있는 교차점을 찾을 수도 있습니다.

선이 두 모서리와 교차하는 4 개의 점을 찾아야합니다. 대부분의 경우 두 개가 음수 t를 가지며 폐기합니다. 다른 하나는 가장 낮은 t를 가진 것을 골라 내십시오.

또한 최적화 : DX와 DY의 부호를 바탕으로

이, 선이 두 개의 모서리 중 하나를 교차 할 수있다. 예를 들어 양 쪽 모두 양수이면 위쪽면 또는 오른쪽면과 교차 할 수 있습니다. 그 두 개의 모서리에 대해서만 t를 계산하고 가장 낮은 t로 하나를 선택할 수 있습니다.

+0

이것이 작동해야하는 것처럼 보입니다. 집에 갈 때 시도해 보겠습니다! – Anton

관련 문제