我有一个数组定义了一条完整的路径,如下所示;
var path = new [] {
new Vector2(0.4f, 0.2f),
new Vector2(1f, 1.1f),
new Vector2(2f, 1f),
new Vector2(2.5, 0.6f)
}
这导致以下可视化;
路径中的点数是可变的。如何确定代表该路径中心的坐标?在这种情况下,中心被定义为其中一条线上的坐标,其中在该点处分割路径将导致两条相等长度的路径。
对点进行求和并求平均值不是解决方案,考虑到这会导致坐标不在路径上。
答案 0 :(得分:3)
对于每个细分,计算(并存储)细分受众群的长度。将所有长度相加并将总数除以2.
按路径顺序迭代所有段,从此减半总数中减去每个段的长度,直到当前段长度大于剩余总数。
然后沿该线段计算该长度的点。
答案 1 :(得分:2)
以下是获取中间点的快速代码示例:
Vector2 GetMidPoint(Vector2[] path)
{
var totalLength = 0d;
for(var i = 0; i < path.Length - 1; i++)
totalLength += GetDistanceBetween(path[i], path[i + 1]);
var halfLength = totalLength / 2;
var currLength = 0d;
for(var i = 0; i < path.Length - 1; i++)
{
var currentNode = path[i];
var nextNode = path[i+1];
var nextStepLength = GetDistanceBetween(currentNode, nextNode);
if (halfLength < currLength + nextStepLength)
{
var distanceLeft = halfLength - currLength;
var ratio = distanceLeft / nextStepLength;
return new Vector2(currentNode.x + (nextNode.x - currentNode.x) * ratio, currentNode.y + (nextNode.y - currentNode.y) * ratio);
}
else
currLength += nextStepLength;
}
throw new Exception("Couldn't get the mid point");
}
public double GetDistanceBetween(Vector2 a, Vector2 b)
{
var x = Math.Abs(a.x - b.x);
var y = Math.Abs(a.y - b.y);
return (Math.Sqrt(Math.Pow(x,2) + Math.Pow(y, 2)));
}