测试点是否位于三角形上

时间:2012-03-08 22:23:33

标签: java geometry

我使用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 个答案:

答案 0 :(得分:3)

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

根据Polygon使用的“内在性”的定义,边界上的一个点应该被认为是内部的,因此包含在内。

编辑:

进行一些基本测试以确保:

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数学,但我不能保证你,所以你可能想要测试一些带有double值的边缘情况。

答案 1 :(得分:1)

考虑使用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++;

答案 2 :(得分:0)

如果你想区分三种不同的情况(内部,边缘,外部),你可以自己实施测试:

使用此处描述的重心技术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