【问题标题】:Drawing a path between two points绘制两点之间的路径
【发布时间】:2010-11-22 17:24:51
【问题描述】:

我正在开发一款基于触摸的游戏,但在绘制用户触摸过的路径时遇到问题。 我正在尝试模仿这些应用程序 http://www.youtube.com/watch?v=G3CECr6mT1Qhttp://www.youtube.com/watch?v=r34-_0wrVC4

我在 XNA/C# 中这样做。

我的问题是:我有一组定义用户触摸路径的路标。我不确定如何在所有这些点之间获得一条风格化的线,所以我想“嘿,我将有一个非常小的图像,即'线',并在航点之间的每个点绘制它,并相应地旋转它. 我不确定这是否是最好的解决方案。

但我被卡住了,因为我不知道如何获得这两点之间的所有坐标。我有两点,我可以从第一点到第二点得到一个向量,等等,但我似乎无法正确计算。

有什么建议或帮助吗? 谢谢!

【问题讨论】:

    标签: c# math windows-phone-7 xna


    【解决方案1】:

    要计算两点之间的中间点,请找到从一个点到另一个点的方向矢量以及两点之间的距离。按 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 连接您的积分。

    另一个建议是set up a textured rotated quad

    【讨论】:

    • Empyrean - 谢谢!这就像一个魅力!非常感激!你知道你的代码是否或多或少与 XNA 绘制基元的方式相同,还是我会受到性能影响?另外,我将发布我的代码 sn-p 以防将来有人在此线程上冒险。另外,roundLine 看起来很酷,我去看看。
    • 计算向量的长度是一项昂贵的操作。但对于你在这里做的事情来说并不太贵。 XNA 不会将此作为其线描原语的一部分。但是,我不建议使用线条图原语。正如您在问题中所建议的那样,它根本无法自定义。
    【解决方案2】:
    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 的转换。尽量避免在数学运算中混合类型以获得最佳性能。
    • 感谢您的反馈,我会记住的。只是为了继续学习练习,如果我想在上面应用贝塞尔曲线或 catmull-rom 样条 - 为此调整上面是否容易? :)
    【解决方案3】:

    查看http://create.msdn.com/en-US/education/catalog/sample/primitives 的示例,详细了解如何绘制包括线条在内的简单“原语”。

    【讨论】:

    • 谢谢,但实际上我之前已经看过了。从这个角度来看,我不确定如何定制他们的产品线以使其更具吸引力——我发现的唯一定制是颜色选项。我还认为他们让 XNA 进行了很多绘图计算,因此我看不出他们是如何做到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多