在两个点之间绘制路径

7
我正在开发一个基于触摸的游戏,但是我在绘制用户触摸路径时遇到了问题。我试图模仿这些应用程序的功能:http://www.youtube.com/watch?v=G3CECr6mT1Qhttp://www.youtube.com/watch?v=r34-_0wrVC4
我使用XNA/C#进行开发。
我的问题是:我有一组定义用户触摸路径的路标。我不确定如何在所有这些点之间获得一个样式化的线条,所以我想,“嘿,我只需要有一张非常小的代表‘线条’的图片,并在路标之间的每个位置上绘制它,并相应地旋转它。但我不确定这是否是最好的解决方案。
但是我被卡住了,因为我不知道如何获得这两个点之间的所有坐标。我有这两个点,我可以从第一个点到第二个点得到一个向量等,但我似乎无法得到正确的数学计算。
有什么建议或帮助吗? 谢谢!
3个回答

6

要计算两点之间的中间点,需要找到从一个点到另一个点的方向向量和两点之间的距离。将距离按0到1之间的因子t进行缩放,其中t = 0对应于第一个点,t = 0.5是它们之间的一半,t = 1对应于第二个点。然后将方向向量按此值进行缩放并加到原始点上。

Vector2 IntermediatePoint(Vector2 p0, Vector2 p1, float t)
{
    Vector2 delta = p1 - p0;

    float distance = delta.Length();

    if (distance == 0.0f)
    {
        return p0;
    }
    else
    {
        Vector2 direction = delta / distance;

        return p0 + direction * (distance * t);
    }
}

如果您计算p0和p1之间的多个点,则应仅计算距离和方向一次。

您还可以尝试使用XNA RoundLine连接您的点。

另一个建议是设置纹理旋转的四边形


Empyrean - 谢谢!那个方法非常有效!非常感谢!你知道你的代码是否与XNA绘制基元的方式相同,还是会影响性能?此外,我将发布我的代码片段,以防未来有人遇到类似问题。另外,roundLine看起来很酷,我会去试试。 - Steve
计算向量的长度是一项昂贵的操作。但对于您在此处所做的工作来说并不太昂贵。XNA不会将其作为其线条绘制原语的一部分进行处理。然而,我不建议使用线条绘制原语。正如您在问题中所建议的那样,它根本无法定制。 - Empyrean

1
pointA = waypointsToDraw.ElementAt(i);
pointB = waypointsToDraw.ElementAt(i + 1);
deltaVector = pointB - pointA;
distance = deltaVector.Length();
direction = deltaVector / distance;
for (int z = 1; z < distance; z++)
{
    newPoint = pointA + direction * (distance * (z/distance));
    //this is the newPoint - it will be every point/pixel between pointA and pointB. Put drawing code here

}

上面是代码示例。PointA和pointB是两个端点,newPoint将是它们之间的每个点。


我建议将z定义为float类型,以避免在每次循环中将int转换为float,当你除以距离时。尽量避免在数学运算中混合使用不同类型,以获得最佳性能。 - Empyrean
谢谢您的反馈,我会记在心里。为了继续学习,如果我想将贝塞尔曲线或卡特穆勒姆样条应用于上述内容,是否很容易调整上述内容呢? :) - Steve

0

谢谢,但是我之前已经看过了。从那个的例子里,我不确定如何将其定制为更具吸引力的样式——我发现唯一的自定义选项就只有颜色而已。我也觉得他们使用XNA来完成绘图计算的很多工作,因此我无法看到他们具体是如何实现的。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接