Проверка, лежит ли точка на треугольнике - PullRequest
0 голосов
/ 09 марта 2012

Я использовал класс Polygon, чтобы выяснить, находится ли точка с заданными точками ВНУТРИ треугольника, но я не уверен, как определить, находится ли она снаружи или ВКЛЮЧЕНА в треугольнике. Вот мой код.

    public static void main(String[] args) {

    Scanner s = new Scanner(System.in);
    int c =0;
    Polygon p = new Polygon();

    p.addPoint(s.nextInt(), s.nextInt());
    p.addPoint(s.nextInt(), s.nextInt());
    p.addPoint(s.nextInt(), s.nextInt());

    int y = 3;
    while(y-->0)
    {
    if(p.contains(s.nextDouble(),s.nextDouble()))
        c++;
    }
    System.out.print(c);

}

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html

В соответствии с определением «внутренности», которое использует полигон, точка на границе должна рассматриваться внутри и, следовательно, содержаться.1007 * Провел несколько базовых тестов, чтобы убедиться:

public static void main(String[] args)
{
    Polygon p = new Polygon();
    p.addPoint(1, 1);
    p.addPoint(3, 1);
    p.addPoint(2, 2);
    System.out.println(p.contains(2, 1));
    System.out.println(p.contains(2.5, 1));
    System.out.println(p.contains(2.9999, 1));
    System.out.println(p.contains(2.9999, 1.00));
}

Все выходные данные были верны.Я не могу гарантировать для вас, как класс обрабатывает int / double математику внутри, так что вы можете проверить некоторые дополнительные случаи с двойными значениями.

1 голос
/ 09 марта 2012

Подумайте об использовании Line2D для представления краев треугольника.

Line2D a = new Line2D.Double();
Line2D b = new Line2D.Double();
Line2D c = new Line2D.Double();

a.setLine(x1, y1, x2, y2);
b.setLine(x2, y2, x3, y3);
c.setLine(x3, y3, x1, y1);

double pntX = s.nextDouble();
double pntY = s.nextDouble();

if (a.ptLineDist(pntX, pntY) == 0 || b.ptLineDist(pntX, pntY) == 0 || c.ptLineDist(pntX, pntY) == 0)
    c++;
0 голосов
/ 09 марта 2012

Если вы хотите различить три разных случая (внутри, на краю, снаружи), вы всегда можете выполнить тест самостоятельно:

использовать барицентрическую технику, описанную здесь http://www.blackpawn.com/texts/pointinpoly/default.html используемые формулы находятся внизу этой страницы

псевдокод для внутреннего / наружного / обнаружения края:

if 0<=u<=1 && 0<=v<=1
    // inside, maybe on edge
    if    u==0 || v==0  || u+v==1
       //edge1 || edge2 || edge3
    else
       //inside
    end
else
    //outside
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...