【问题标题】:Do order of coordinates affect the drawing of polygon in Java坐标顺序会影响Java中多边形的绘制吗
【发布时间】:2013-02-28 09:08:08
【问题描述】:

我在问是否有任何特定的顺序,我需要输入我的一组坐标以使用 Java 中的 Graphics2D 类绘制多边形。

例如,对于 X 和 Y 坐标数组,我的坐标 (X,Y) 的值是否需要按降序/升序排列?

或者另一个例子是,如果我想绘制一个多边形并且我有 4 组点,topleft、topright、bottomright 和 bottomleft,我只需按此顺序将它们输入到 Java 中的 drawPolygon 方法中,以获得一个具有对应角的绘制多边形所有这 4 点。

或者我可以按任意顺序排列我的坐标?

提前致谢。

【问题讨论】:

    标签: polygon


    【解决方案1】:

    多边形从每个点绘制到下一个点。

    因此,一条边的两个点必须是您提交给 DrawPolygon 的点列表中的相邻点。

    如果要在点A、B、C和D之间绘制多边形,则需要按顺序提交这些点

    • A、B、C、D 或
    • D、A、B、C 或
    • C、D、A、B 或
    • B、C、D、A 或
    • D、C、B、A 或
    • A、D、C、B 或
    • B、A、D、C 或
    • C、B、A、D 或

    A、B、C 和 D 的所有其他组合将生成具有相同点但不同边的多边形

    如果您使用上述命令之一,这是您得到的多边形

    A------B
    |      |
    |      |
    |      |
    D------C
    

    如果您使用例如 A、B、D、C,这是您得到的多边形

    A------B
     \    /
      \  /
       *
      / \
     /   \
    D-----C
    

    【讨论】:

    • 我还有一个问题,如果我的多边形按 A、B、C、D 顺序排列,但如果原始坐标构成我的多边形,例如,旋转..这样我就得到了一个形状这就像您展示的 A、B、D、C 顺序,但仍处于 A、B、C、D 顺序,我仍然希望获得您展示的第一个形状多边形。有没有办法检查坐标以确保可以更改顺序来获得它?
    【解决方案2】:

    要了解一般的多边形填充,您必须了解边缘方向缠绕顺序和选定的多边形填充规则

    边的方向由声明顶点的顺序决定。比如……

    Polygon poly= new Polygon();
    poly.addPoint(10, 10);
    poly.addPoint(100, 10);
    poly.addPoint(100, 100);
    poly.addPoint(10, 100);
    

    多边形是通过连接相邻的顶点(从一个有序的顶点列表中)形成的边来绘制的。列表中的最后一个顶点也加入了第一个顶点(好像列表是圆形的)。上面多边形中的第一条边是由前两个顶点构成的——Point(10,10) 和 Point(100,10)。

    每当多边形自相交或重叠时,要了解如何绘制多边形,您需要了解缠绕顺序和应用的多边形填充规则。当多边形重叠时,会创建多边形子区域 - 由边缘包围的离散区域。这些子区域的缠绕顺序和应用的多边形填充规则决定了这些子区域是否被填充。


    (来源:angusj.com

    任何给定多边形子区域的缠绕数可以通过以下方式得出:

    • 将绕组计数设置为零
    • 从给定子区域内的一个点 (P1),画一条假想的水平线到一个或多个多边形 (P2) 之外的另一个点
    • 在从 P1 穿过这条线到 P2 时,对于穿过这条假想线的每个多边形边 - 如果它朝上,则增加缠绕计数,否则减少缠绕计数。

    根据 Java Graphics2D documentationfillPolygon 仅使用 奇偶填充规则,其中仅填充奇数子区域。


    (来源:angusj.com

    【讨论】:

    • 谢谢你的回答,我问的是边缘方向,我明白了。
    • 我还有一个问题,如果我的多边形按 A、B、C、D 顺序排列,但如果构成我的多边形的原始坐标是旋转的……这样我就得到了一个形状这就像您展示的 A、B、D、C 顺序,但仍处于 A、B、C、D 顺序,我仍然希望获得您展示的第一个形状多边形。有没有办法检查坐标以确保可以更改顺序来获得它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2017-12-11
    • 2021-12-06
    相关资源
    最近更新 更多