Java 如何迭代多边形的顶点并将两个顶点相互比较?

Java 如何迭代多边形的顶点并将两个顶点相互比较?,java,Java,我有一个定义多边形边的xy坐标(顶点)的XML列表。我读取此文件并将顶点保存在ArrayList中。现在,我想迭代完成的ArrayList并比较两个顶点,以确定连接两个顶点的边是简单多边形的北边、西边、南边还是东边 这是我可以用来测试组成两个点的边是北边、西边、东边还是南边的代码 enum EdgeType {TOP, BOTTOM, LEFT, RIGHT, EMPTY} public EdgeType orthoEdgeTypeCCW(double x0, double y0, doubl

我有一个定义多边形边的xy坐标(顶点)的XML列表。我读取此文件并将顶点保存在ArrayList中。现在,我想迭代完成的ArrayList并比较两个顶点,以确定连接两个顶点的边是简单多边形的北边、西边、南边还是东边

这是我可以用来测试组成两个点的边是北边、西边、东边还是南边的代码

enum EdgeType {TOP, BOTTOM, LEFT, RIGHT, EMPTY}

public EdgeType orthoEdgeTypeCCW(double x0, double y0, double x1, double y1)
{
if(x0 == x1) // vertical
{           
    return (y0 < y1) ? EdgeType.RIGHT : 
           (y0 > y1) ? EdgeType.LEFT : 
                       EdgeType.EMPTY;
}
else if(y0 == y1) // horizontal
{
    return (x0 < x1) ? EdgeType.BOTTOM : 
           (x0 > x1) ? EdgeType.TOP : 
                       EdgeType.EMPTY;
}
else
{
    throw new IllegalArgumentException("Edge not orthogonal");
}
}
enum EdgeType{TOP,BOTTOM,LEFT,RIGHT,EMPTY}
公共边缘类型orthoEdgeTypeCCW(双x0、双y0、双x1、双y1)
{
如果(x0==x1)//垂直
{           
返回(y0y1)?边缘类型左:
EdgeType.EMPTY;
}
else如果(y0==y1)//水平
{
返回(x0x1)?EdgeType.TOP:
EdgeType.EMPTY;
}
其他的
{
抛出新的IllegalArgumentException(“边不正交”);
}
}
我有两个问题没有找到解决方案:

首先我想测试顶点是顺时针排序还是逆时针排序。因此,我必须更改边缘类型的代码

第二步我不知道如何迭代顶点数组列表,以便在每一步比较两个顶点。
例如,在第一步中,v1与v2、第二步中v2与v3、第三步中v3与v4,依此类推。。我可以用它们的索引来描述ArrayList中的顶点吗?

关于第一个问题,有很多方法可以找到多边形的方向。请参阅关于SO的讨论

至于比较多边形中的点,可以执行以下操作:

List<Point2D.Float> points = new ArrayList<>(); //your initial set of points
for (int i = 0; i < points.size(); i++) {
    Point2D.Float current = points.get(i);
    Point2D.Float next = points.get((i + 1) % points.size());
    //do your comparison between the two points here
}
List points=new ArrayList()//您的初始点集
对于(int i=0;i
这将每个点与下一个点进行比较,包括将最后一个点与第一个点进行比较,以“闭合回路”。如果不需要这样做,您可以在到达最后一点时进行小更改以停止:

List<Point2D.Float> points = new ArrayList<>(); //your initial set of points
for (int i = 0; i < points.size() - 1; i++) {
    Point2D.Float current = points.get(i);
    Point2D.Float next = points.get((i + 1));
}
List points=new ArrayList()//您的初始点集
对于(int i=0;i
对于没有自相交的简单正交多边形,可以通过查找左下角点并确定下一点的y值是否等于(CCW)或大于(CW)来确定其方向(CW | CCW)

enum方向{CW,CCW}
公众导向(列表点)
{
int minIdx=0;
for(inti=1;ip2.getX())返回1;
否则返回0;
}
一旦确定了方向,就可以遍历边以确定其类型

for(int i=0, j=points.size()-1; i<points.size(); j=i++)
{
    EdgeType edgeType = orthoEdgeTypeCCW(points.get(j), points.get(i));
    System.out.format("%s -> %s : %s%n", points.get(j), points.get(i), edgeType);
}
for(int i=0,j=points.size()-1;i p2.getY())?EdgeType.LEFT:
EdgeType.EMPTY;
}
else if(p1.getY()==p2.getY())//水平
{
return(p1.getX()p2.getX())?EdgeType.TOP:
EdgeType.EMPTY;
}
其他的
{
抛出新的IllegalArgumentException(“边不正交”);
}
}

显然,CW多边形的类型是相反的。

右、左、下、上边缘-这听起来不像多边形,这听起来像矩形。不完全符合这些名称的边缘怎么办?另外,您知道java.awt.Polygon(和Polygon2D)吗?它是一个正交多边形,因此所有边都平行于x轴或y轴。我不能使用java.awt.Polygon,因为x和y坐标是浮点值谢谢!然后我可以访问“当前”和“下一个”点的x和y值?是的,应该是类似于current.getX(),next.getY()等的值。
for(int i=0, j=points.size()-1; i<points.size(); j=i++)
{
    EdgeType edgeType = orthoEdgeTypeCCW(points.get(j), points.get(i));
    System.out.format("%s -> %s : %s%n", points.get(j), points.get(i), edgeType);
}
public EdgeType orthoEdgeTypeCCW(Point2D p1, Point2D p2)
{
    if(p1.getX() == p2.getX()) // vertical
    {           
        return (p1.getY() < p2.getY()) ? EdgeType.RIGHT : 
               (p1.getY() > p2.getY()) ? EdgeType.LEFT : 
                                         EdgeType.EMPTY;
    }
    else if(p1.getY() == p2.getY()) // horizontal
    {
        return (p1.getX() < p2.getX()) ? EdgeType.BOTTOM : 
               (p1.getX() > p2.getX()) ? EdgeType.TOP : 
                                         EdgeType.EMPTY;
    }
    else
    {
        throw new IllegalArgumentException("Edge not orthogonal");
    }
}