2013-01-22 2 views
1

2 개의 직사각형 프리즘이 만지거나 겹치는 지 알아 내는데 문제가 있습니다. 나는 두 개의 직사각형 프리즘의 highX, Y, Z와 lowX, Y, Z만을 가지고 있습니다. 여기까지 내가 지금까지 가지고있는 것입니다 :2 개의 직사각형 프리즘이 터치/교차하는 경우 알아 내기

public boolean overlaps(AreaSelection other) { 
    boolean Xs = (lowX <= other.getHighestX()) && (other.getLowestX() <= highX); 
    boolean Ys = (lowY <= other.getHighestY()) && (other.getLowestY() <= highY); 
    boolean Zs = (lowZ <= other.getHighestZ()) && (other.getLowestZ() <= highZ); 
    return (Xs && Ys && Zs);   
} 

이것이 맞는지 아닌지 아는 사람이 있습니까? 그리고 그렇지 않다면, 해결책은 무엇입니까? 감사!

+0

인스턴스 변수를 사용할 때 getter 메서드를 사용할 필요가 없습니다. 그렇지 않으면 나에게 잘 보입니다. –

답변

2

좌표 축과 평행 한 모서리가있는 두 개의 직사각형 프리즘이 중첩됩니다. 좌표 축의 투영 간격이 각각 겹치는 경우에만 해당합니다.

그래서 우리는 프리즘의 중첩을 검사하기 위해 세 번 호출하는 간격의 중복을 검사하는 "유틸리티"방법을 사용하는 것이 좋습니다. 이 방법에 중복 교차로의 단일 지점으로 구성 될 수 있음을

public boolean overlaps(AreaSelection other) 
{ 
    boolean Xs = overlap_1D(lowX,highX,other.getLowestX(),other.getHighestX()); 
    boolean Ys = overlap_1D(lowY,highY,other.getLowestY(),other.getHighestY()); 
    boolean Zs = overlap_1D(lowZ,highZ,other.getLowestZ(),other.getHighestZ()); 
    return (Xs && Ys && Zs);   
} 

참고 : 원래 코드는 다음 될 것

public boolean overlap_1d(double aLow, double aHigh, double bLow, double bHigh) 
{ 
    if (aLow <= bLow) return (bLow <= aHigh); 
    /* else aLow > bLow */ 
    return (aLow <= bHigh); 
} 

: 우리는이 방법이 제대로 정렬 간격 '엔드 포인트와 호출됩니다 가정 (1 차원 또는 3 차원).

+0

와우, 좋은 생각이야. 고마워, 나는 이것을 시험 할 것이다! – JNorr44

+0

좋은 아이디어. 크 누스의 말을 바꾸기 위해, 나는 그 프로그램이 정확하다는 것을 입증했다. 실제로 작동 하는지를보기 위해 실제로 실행하지 않았다! – hardmath

1

프리즘이 회전하지 않으면 올바른 방법이며, 그렇지 않으면 해당 값과 겹치는 지 계산할 방법이 없습니다.

+0

좋아요, 내 프리즘은 항상 90 *입니다. – JNorr44

+0

프리즘이 다른 프리즘보다 작고 프리즘 B 내에 프리즘이있는 경우주의해야하지만 방법은 실패합니다. 따라서 측면은 겹치지 않지만 A는 B 내부에 있습니다. 따라서 이것을 겹치는 것으로 계산하려면이 유효성을 검사해야합니다. – Gustavo

+0

어떻게 해결할 수 있습니까? – JNorr44