【问题标题】:Uniform Distribution Algorithm On A Shape形状上的均匀分布算法
【发布时间】:2012-05-04 21:19:03
【问题描述】:

我很难将其优雅地公式化为算法。

所以我有一个给定的直边形状(即正方形,尽管最终形状并不重要,只有端点)。我得到笛卡尔坐标系上的边界端点:(2,-2) (2,2) (-2,2) (-2,-2)

我得到了任意数量的点(即 7 个​​),我想将这些点 (x,y) 沿着形状的边缘均匀分布(在本例中为正方形)。

我目前的想法是获取所有端点的总长度,然后将其除以点数以获得段长度(然后我根据边缘对其进行归一化)。然后我从一个端点到另一个端点找到这个数量之间的点并累积归一化切片,当这个总数超过 1.0 时,我迭代端点并取余数并从那里开始......或类似的东西。

有人可以帮我把它放到算法中(最好是 C#),或者如果你有更好的解决方案,请告诉我。我想有一种排序或分布/除法算法可能会产生相同的影响,但我找不到。我希望这不是很明显。

【问题讨论】:

  • 统一在什么意义上?弧长测量?
  • 关于直线路径均匀分布,我有一个单独的算法来处理弧长和圆

标签: c# algorithm distribution division


【解决方案1】:

这需要多普遍?另外,如何表示您的形状和点?你的算法似乎没问题;您需要帮助将其转换为代码吗?


好的,这是我想出的东西。 代码注释:

  • distance 方法采用两个 Points 并返回它们之间的距离。
  • normalize 方法接受两个点,并返回从第一个点指向第二个点的法线向量。
  • Point 类具有将点乘以标量的 multiply 方法
  • Point 类具有浮点(或双精度)精度

我顺便用Point类来表示向量。

我没有对此进行测试,所以可能存在错误。该算法如何处理精确区域可能存在问题(例如,您的正方形上正好有 4 个点)。如果有问题或有任何疑问,请告诉我! :)

Point[] shapePoints; //already initialized
int numPoints; //already initialized
Point[] retPoints = new Point[numPoints];
int totalLength;
for(int i = 1; i < shapePoints.length; i++){
    totalLength += distance(shapePoints[i], (shapePoints[i-1]));
}
float segLength = ((float) totalLength) / numPoints);
Point currShape = shapePoints[0];
Point nextShape = shapePoints[1];
Point prev = currShape;
int counter = 2;
while(numPoints > 0){
    Point norm = normalize(new Point(nextShape.x - currShape.x, nextShape.y - currShape.y));
    if(distance(nextShape, prev) < segLength){
        int tempLength = segLength;
        tempLength -= distance(nextShape, prev);
        currShape = nextShape;
        nextShape = shapePoints[counter];
        counter ++;
        norm = normalize(new Point(nextShape.x - currShape.x, nextShape.y - currShape.y));
        norm.multiply(tempLength);
    }
    else{
        norm.multiply(segLength);
    }       
    retPoints[numPoints - 1] = norm;
    prev = retPoints[numPoints - 1];
    numPoints --;
}

Point normalize(Point p){
    int scale = Math.sqrt(p.x * p.x + p.y * p.y);
    p.x = p.x / scale;
    p.y = p.y / scale;
    return p;
}

【讨论】:

  • 现在我只想得到点 (x,y)。这很笼统,因为(直线)形状没有区别。我真的只处理端点。是的,我无法优雅地将其转换为代码 =)
  • 好的。我现在正在写东西 :) 应该很快就完成了。
  • 规范化的实现是什么?
  • norms 似乎重复了值 (0,8),不确定这是否是我自己的错误。但我相信基本面都在那里,我可以接受剩下的路,我会考虑回答这个问题。再次感谢您!
  • 尝试自己调试。如果您对算法的工作原理有任何疑问,请发表评论,我会回复。
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2020-10-08
  • 2020-08-15
  • 1970-01-01
  • 2012-05-21
相关资源
最近更新 更多