Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何找到一组连接线的中心坐标?_C#_Unity3d - Fatal编程技术网

C# 如何找到一组连接线的中心坐标?

C# 如何找到一组连接线的中心坐标?,c#,unity3d,C#,Unity3d,我有一个数组,它定义了一个完整的路径,如下所示 var path = new [] { new Vector2(0.4f, 0.2f), new Vector2(1f, 1.1f), new Vector2(2f, 1f), new Vector2(2.5, 0.6f) } 这将导致以下可视化 路径中的点数是可变的。如何确定代表该路径中心的坐标?在这种情况下,中心被定义为其中一条线上的坐标,在该点拆分路径将导致两条长度相等的路径 求和点并求平均值不是一

我有一个数组,它定义了一个完整的路径,如下所示

var path = new [] { 
    new Vector2(0.4f, 0.2f), 
    new Vector2(1f, 1.1f), 
    new Vector2(2f, 1f), 
    new Vector2(2.5, 0.6f)
}
这将导致以下可视化

路径中的点数是可变的。如何确定代表该路径中心的坐标?在这种情况下,中心被定义为其中一条线上的坐标,在该点拆分路径将导致两条长度相等的路径

求和点并求平均值不是一个解决方案,因为这会导致坐标不在路径上


有没有什么东西可以提供这个值,或者我需要写出一些时髦的数学知识?

对于每个片段,计算(并存储)片段的长度。将所有长度相加,然后将总和除以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)));
}
Vector2获取中点(Vector2[]路径)
{
var总长度=0d;
对于(var i=0;i
性能可能不最佳,但功能正确是从哪里开始。“性能可能不最佳”-您想解释一下原因吗。我认为你的说法不正确。这取决于可用的时间和空间的权衡。也许可以以需要更多空间为代价执行单次传递,这在某些体系结构上可能会稍微有效一些。只有二阶或三阶效应,不是批评而是思想刺激。这显然是一个正确的起点。它可以一次完成。请注意我在括号“(和存储)”中的注释。我应该说存储累积长度您还需要将尾随路径存储回最近计算的中点,该中点在分段总数中是线性的,以便在一次传递中运行。