gpt4 book ai didi

c# - 形状上的均匀分布算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:03:48 27 4
gpt4 key购买 nike

我很难将其优雅地表述为算法。

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

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

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

有人可以帮助我将其转化为算法(最好是 C#),或者如果您有更好的解决方案请告诉我。我想有一种排序或分布/划分算法可能会产生同样的影响,但我找不到。我希望这不是显而易见的。

最佳答案

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


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

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

顺便说一句,我正在使用 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;
}

关于c# - 形状上的均匀分布算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com