我正试图在Java中编写agorythm以在任何多边形中找到90度角。
我有一个表示多边形的PointList(double x,double y)。 最后一点和第一点是相同的。
结果应该是包含这些顶点的ArrayList,其中是90度角。
我试图通过使用垂直线来计算出某些东西并计算它们之间的角度,但这没有用。
你知道怎么做吗?
如何确定我只想检查多边形内部的角度?
如果我有这样的情况:
我只想获得绿色的90个角度
答案 0 :(得分:1)
正如Axel Kemper在评论中所提到的,你可以利用两个正交(即彼此相差90度)向量的点积为0的事实。
// set tolerance to some small value to handle floating point errors
static final int TOLERANCE = 0.01;
ArrayList<Point> find90degCorners(ArrayList<Point> points)
{
ArrayList<Point> corners = new ArrayList<Point>();
for(int i = 1; i < points.size() - 1; i++)
{
Point prev = points.get(i - 1);
Point current = points.get(i);
Point next = points.get(i + 1);
// To get vector, subtract previous point from each point.
// vector A = next - current
// vector B = current - prev
// Multiply element-wise for dot product A.B:
double dotProduct = ((next.x - current.x) * (current.x - prev.x)) +
((next.y - current.y) * (current.y - prev.y));
// normal of 2D vector is found by swapping x and y
// and flipping sign of second component
// to check whether it is an exterior or interior angle,
// take the dot product of one vector with the
// normal of the other
double direction = ((next.x - current.x) * (current.y - prev.y)) +
((next.y - current.y) * (prev.x - current.x));
// check if the product is within the tolerance of zero:
if((dotProduct > -TOLERANCE) && (dotProduct < TOLERANCE) && (direction > 0.0))
{
corners.add(current);
}
}
return corners;
}
通过使用矢量法线进行第二个点积并与零比较,可以区分内角或外角是否为90度。您的测试是否应该> 0或&lt; 0取决于多边形绕组(顺时针或逆时针)和正X轴和Y轴的方向。