2012-04-24 215 views
0

我很难将此优雅地表达到算法中。一个形状上的均匀分布算法

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

我给定点的任意数(即。7)我想沿着形状的边缘(在这种情况下是一个正方形)均匀地分布这些点(x,y)。

我现在的想法是让所有端点的总长度,通过点的数量除以该得到一个段长(然后我对标准化的边缘)。然后我从端点到终点,找到这个数量之间的点,并累加归一化的切片,当这个总数超过1.0时,我迭代终点并取其余部分并从那里开始......或类似的东西。

有人能帮帮我(最好是C#)把这个变成一个算法,或者如果你有一个更好的解决方案请不要告诉。我可以想象有一个排序或分配/划分算法,可能会有相同的影响,但我找不到任何。我希望这不是显而易见的。

+0

在何种意义上的统一?弧长测量? – Mikola 2012-04-24 08:46:24

+0

关于直线路径均匀间隔,我有一个单独的算法来处理弧长和圆 – user1229895 2012-04-24 08:51:33

回答

2

这需要多大?另外,如何表示你的形状和点?你的算法似乎没问题;你需要帮助把它变成代码吗?


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

  • 距离方法需要两个点并返回它们之间的距离。
  • 的标准化的方法需要两个点,并返回从第一点到第二点指向的法线矢量。
  • Point类具有由一个标量
  • 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; 
} 
+0

以及现在我想要得到的就是点(x,y)。这是相当普遍的,因为(直线)形状没有区别。我真的只处理端点。是的,我无法将其优雅地转换成代码=) – user1229895 2012-04-24 08:50:04

+0

好的。我现在正在写东西:)应该尽快完成。 – moowiz2020 2012-04-24 08:55:55

+1

哈哈,你是比我更聪明的人,谢谢! ;-) – user1229895 2012-04-24 08:57:19