Определение, находится ли точка в эллипсе, включая ребро - PullRequest
2 голосов
/ 23 февраля 2012

Я пытаюсь проверить, лежит ли точка внутри круга, и если точка находится по периметру, она должна быть включена в результаты. Однако реализация Java contains() использует меньше чем вместо меньше или равно. Например, рассмотрим этот фрагмент:

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));

Это печатает следующее:

false
false
false
false
true

Как мне получить значение true для всех этих случаев?

Ответы [ 3 ]

9 голосов
/ 23 февраля 2012

Вы должны решить, какую толерантность будет использовать ваш метод. Хотя в вашем примере используются точки, которые можно выразить в плавающей точке, на границе эллипса есть много точек, которые будут , а не , поэтому решение о том, находится ли точка «на границе», неясно. резать. Если вам все равно, то я бы предложил сделать эллипс немного «больше», чем вы на самом деле хотите, и использовать встроенный метод contains().

Если вы хотите написать свой собственный метод, это так же просто, как взять формулу для эллипса, вставить значения X и Y точки, которую вы хотите проверить, и наблюдать результат:

bool isInsideOfOrOnBorderOfEllipse = ((x*x)/(a*a) + (y*y)/(b*b)) <= 1;

Обратите внимание, что это все еще сталкивается с проблемой непредставимых точек, поэтому некоторые точки, которые, по вашему мнению, должны быть "на границе", не будут.

Обновление : Учитывая, что вы просто используете встроенный объект эллипса (и, следовательно, задаете высоту / ширину, а не общие параметры эллипса), было бы целесообразно взглянуть на источник для contains() здесь: http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/ffa98eed5766/src/share/classes/java/awt/geom/Ellipse2D.java

Извлечь новый класс и затем переопределить contains(). В переопределенной версии просто скопируйте код, за исключением того, что используйте <= вместо <, и все будет хорошо.

0 голосов
/ 12 августа 2012

Вы можете использовать метод пересекает . Как говорит javadoc: Проверяет, пересекает ли внутренняя часть этого Ellipse2D внутреннюю часть заданной прямоугольной области. Хотя это не круг (лучшее представление допуска вокруг точки), работает довольно хорошо

Этот фрагмент должен работать для любого x, y, который вы хотите проверить:

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

Это просто прямоугольник вокруг точки интереса. Больше размера, допуск нор

0 голосов
/ 23 февраля 2012

Может быть, getDistance () может помочь вам здесь? Точки на прериметре должны возвращать 0.

...