【问题标题】:How to add n points between vertices when creating a polygon创建多边形时如何在顶点之间添加n个点
【发布时间】:2017-07-30 14:26:27
【问题描述】:

假设我正在使用以下代码在六边形多边形中创建顶点:

hexagonPoints = new Array<Vector2>();
for (int a = 0; a < 6; a++)
{
  float x = r * (float)Math.cos(a * 60 * Math.PI / 180f);
  float y = r * (float)Math.sin(a * 60 * Math.PI / 180f);
  hexagonPoints.add(new Vector2(x, y));
}

如何沿多边形的每一边添加额外的点,以便在每个连接的顶点集之间有 n 个额外的点?所有顶点的距离必须相等(包括形成初始形状的顶点)。例如。之前:

.   .

.   .

之后(其中 n = 1):

. . .
.   .
. . .

编辑:这是我目前根据 Volker 的建议编写的代码:

float r = 3.0f;
int n = 1 + 2; // number of additional vertices between the main shape vertices
for (int a = 0; a < 6; a++)
{
    float xe = r * (float)Math.cos(a * 60 * Math.PI / 180f);
    float ye = r * (float)Math.sin(a * 60 * Math.PI / 180f);

    if (a > 0)
    {
        for (int i = 1; i < n; ++i)
        {
            float xs = ((n - i) * hexagonPoints.get(a - 1).x + i * xe) / n;
            float ys = ((n - i) * hexagonPoints.get(a - 1).y + i * ye) / n;
            hexagonPoints.add(new Vector2(xs, ys));
        }
    }

    hexagonPoints.add(new Vector2(xe, ye));
}

这会绘制额外的顶点,但它们的位置不正确。

编辑:似乎这不起作用,因为我没有考虑第一个顶点位置。

【问题讨论】:

    标签: java math polygon


    【解决方案1】:

    按照你已经在做的那样计算每一边的端点。然后用一个内循环引入额外的分裂点。

    for (int i=1; i<n: ++i)
    {
       float xs = ((n-i)*xb + i*xe)/n;
       float ys = ((n-i)*yb + i*ye)/n;
       hexagonPoints.add(new Vector(xs, ys));
    }
    hexagonPoints.add(new Vector(xe, ye));
    

    其中 xb, yb 是六边形边的起点,xe, ye 是终点。

    【讨论】:

    • 不错。 @lepton 请注意,Volker 代码中的 n 应该等于顶点之间所需的段数,即 1 + 额外点数(想想栅栏和栅栏柱)
    • 谢谢大家。我按照 Volker 的建议添加了内部循环(请参阅编辑的 OP),但是额外的顶点没有被绘制在正确的位置,它们被绘制在六边形内部而不是主顶点之间。有什么想法我哪里出错了吗?
    • 当您将 xe,ye 添加到 hexagonPoints 时,您必须切换到下一行的开头,即 x = xe; y= 是的;
    【解决方案2】:

    根据 Volker 的建议,这是一个可行的解决方案:

    int size = 6;
    int npoints = 2;
    int nsegs = npoints + 1;
    
    float xb = r;
    float yb = 0;
    hexagonPoints.add(new Vector2(xb, yb));
    
    for (int a = 1; a <= size; a++)
    {
        float xe = r * (float) Math.cos(a * 60 * Math.PI / 180f);
        float ye = r * (float) Math.sin(a * 60 * Math.PI / 180f);
    
        for (int i = 1; i < nsegs; ++i)
        {
            float xs = ((nsegs - i) * xb + i * xe) / nsegs;
            float ys = ((nsegs - i) * yb + i * ye) / nsegs;
            hexagonPoints.add(new Vector2(xs, ys));
        }
    
        if (a < size) hexagonPoints.add(new Vector2(xe, ye));
        xb = xe;
        yb = ye;
    }
    

    【讨论】:

    • 谢谢,现在可以使用了。看起来我的不起作用,因为我没有正确设置第一个起点。您需要在代码中将
    • 不客气。对于六边形,a
    • 对不起,你是对的。我已将循环终止测试编辑为a &lt;= size。现在我们还需要添加一个测试来添加端点。如果a == size 则不添加它,因为它将等于我们添加的第一个点(除非您希望第一个点和最后一个点相等)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2015-03-26
    • 2018-11-23
    • 2018-04-30
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多