당신은 분석적 불평등과의 파라 메트릭 방정식을 사용하여이 문제를 해결할 수 있음 선분 (우리가 xb-xa/yb-ya
을 표시하기 위해 dx/dy
사용) :
x0 < xa + t.dx < x1
y0 < xb + t.dy < y1
0 < t < 1
그런 다음 같은 기간의 세 bracketings을 수 있도록 재 작성이 나타납니다
(x0 - xa).dy < t.dx.dy < (x1 - xa).dy
(y0 - ya).dx < t.dx.dy < (y1 - ya).dx
0 < t.dx.dy < dx.dy
주의 : 음수 인 d
을 곱하면 부등식의 멤버가 스왑되어야합니다. 따라서 4 가지 경우가 있습니다. (사실 9
d
'으로들도 0
할 수있다이 경우 쉽게 여기에 무시됩니다..)
마지막으로, 이러한 bracketings 즉, 호환되는 적어도 하나의 가능한 t
값이 있음을 표현 :
Max((x0 - xa).dy, (y0 - ya).dx, 0) < Min(x1 - xa).dy, (y1 - ya).dx, dx.dy)
가
밀접하게 살펴보면 접근 방식의 요소를 인식 할 수 있습니다. 예를 들어 0 < (x1 - xa).dy
은 오른쪽을 비교 한 것이고 (x0 - xa).dy < (y1 - ya).dx
은 대각선을 비교 한 것입니다.
이 방법은 경사 세그먼트 결론 4 -
, 5 *
및 5 <>
위해 그리고, 9
가지 경우에 대해 논의 dx/dy
다음 4 <>
(비교)를 계산하는 2 -
걸린다.
이와 비슷한 것 (주의, 선택 취소!) :
dx= xb - xa; dy= yb - ya;
if (dx > 0)
{
if (dy > 0) return Max((x0 - xa).dy, (y0 - ya).dx, 0) < Min(x1 - xa).dy, (y1 - ya).dx, dx.dy);
else if (dy < 0) return Max((x1 - xa).dy, (y0 - ya).dx, 0) < Min(x0 - xa).dy, (y1 - ya).dx, dx.dy);
else return Max(y0 - ya, 0) < Min(y1 - ya, dy);
}
else if (dx < 0)
{
if (dy > 0) return Max((x0 - xa).dy, (y1 - ya).dx, 0) < Min(x1 - xa).dy, (y0 - ya).dx, dx.dy);
else if (dy < 0) return Max((x1 - xa).dy, (y1 - ya).dx, 0) < Min(x0 - xa).dy, (y0 - ya).dx, dx.dy);
else return Max(y1 - ya, 0) < Min(y0 - ya, dy);
}
else
{
if (dy > 0) return Max(x0 - xa, 0) < Min(x1 - xa, 0);
else if (dy < 0) return Max(x1 - xa, 0) < Min(x0 - xa, 0);
else return false;
}
이것은 훌륭하고 올바른 생각입니다. –
내가 오해하면 미안하지만 왜 안의 a 또는 b는 교차로를 의미합니까? a와 b가 양쪽에 있다면? – shole
@shole 나는 사각형의 전체 도메인과 경계를 확인하고있다. 따라서 a와 b 내부는 모두 교차로로 계산됩니다. – user1778856