我使用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);
}
答案 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