2012-02-22 2 views
2

점이 원 안에 있는지 테스트하고 점이 둘레에 있으면 결과에 포함해야합니다. 그러나 Java의 구현은보다 작거나 같음 대신 작은 값을 사용합니다.모서리를 포함하여 타원 내에 점이 있는지 확인

false 
false 
false 
false 
true 

어떻게 그 모든 경우에 대한 true의 값을 얻을 수 있습니다

Ellipse2D.Double circle = new Ellipse2D.Double(0, 0, 100, 100); 

System.out.println(circle.contains(50, 0)); 
System.out.println(circle.contains(50, 100)); 
System.out.println(circle.contains(0, 50)); 
System.out.println(circle.contains(100, 50)); 
System.out.println(circle.contains(50, 50)); 

이 다음 인쇄 : 예를 들어이 조각을 고려?

답변

9

귀하의 방법에서 어떤 종류의 허용 오차를 사용할지 결정해야합니다. 귀하의 예제는 부동 소수점으로 표현 가능한 포인트를 사용하지만, 이 아닌 타원의 경계를 따라 많은 포인트가 있으므로이 아니므로 포인트가 "경계 상"인지 여부가 명확하지 않습니다. 별로 신경 쓰지 않는다면 난 타원을 실제로 "원한다"보다 약간 더 크게 만들고 내장 된 메서드를 사용하는 것이 좋습니다.

bool isInsideOfOrOnBorderOfEllipse = ((x*x)/(a*a) + (y*y)/(b*b)) <= 1; 
: 당신이 당신의 자신의 방법을 작성하려는 경우

, 그것은 결과를 테스트 할 점의 X에 연결하고 Y 값, 타원의 수식을 복용하고, 관찰로 간단합니다

이것은 여전히 ​​표현할 수없는 포인트의 문제로 이어 지므로 "국경에 있어야"한다고 생각하는 일부 포인트는 표시되지 않습니다.

업데이트 : 감안할 때 그냥 사용하고 있는지 타원 객체 내장 (때문에 오히려 일반 타원 매개 변수보다 더 높이/폭 지정)은 여기 contains()에 대한 소스를 볼 수 있습니다 할 가치가있을 것입니다 : http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/ffa98eed5766/src/share/classes/java/awt/geom/Ellipse2D.java

새 클래스를 파생 한 다음 을 재정의하십시오. 재정의 된 버전에서는 < 대신 <=을 사용하는 것을 제외하고 코드를 복사하면 좋을 것입니다.

-1

아마도 getDistance()가 도움이 될까요? 사전 리미터의 포인트는 0을 반환해야합니다.

0

intersects 메서드를 사용할 수 있습니다. javadoc라고하는대로 : 이 Ellipse2D의 내부가 지정된 구형 영역의 내부와 교차할지 어떨지를 판정합니다.

int size = 2; 
... 
ellipse.intersects(x - (size/2), y - (size/2), size, size); 

그냥 직사각형이다 : 그것은 비록는 원 (포인트 주위에 오차의 최고의 표현) 검사 할 Y,이 조각은 어떤 X에 대한 작업을해야 꽤 잘

작동하지 않습니다 관심 지점 주변. 더 많은 크기, 허용 오차 없음

관련 문제