【问题标题】:How to draw a smooth curve between user touched points?如何在用户触摸点之间绘制平滑曲线?
【发布时间】:2016-09-02 19:05:41
【问题描述】:

我正在开发一款游戏。用户用手指在屏幕上绘制曲线,然后我得到用户触摸点。

我想在这些点之间画一条曲线。它们分散,当我使用画布并在它们之间画线时,结果不是平滑的曲线。

我正在寻找通过这些点绘制平滑曲线的方法(可能通过修改或删除一些与其他点的趋势不同的点)。

谁能帮帮我?

在这里我添加一个picture 来表明我的意思

【问题讨论】:

  • Bézier curve。查一下,资源挺多的。移动或删除“不适合”的点本身就是一门科学,需要对这些点进行相当多的统计分析......在这个阶段可能不值得这么麻烦。
  • @ppeterka 谢谢,但这对我没有帮助,我的游戏需要绘制准确的用户触摸路径。
  • 了解splines,它使用一组贝塞尔曲线连接一组点。如果您从很多点开始,以至于曲线呈锯齿状,那么您可以牺牲一些点并应用path simplification algorithm。
  • @markE 谢谢,我看到了链接,但我很困惑!你能帮我更多吗?也许可以通过 android 中的一些代码或其他什么。
  • 图片链接无效。已删除。

标签: java android canvas curve smooth


【解决方案1】:

我从 Adob​​e Photoshop 和 Illustrator 中了解到,添加的点越多,图像看起来就会越锯齿。绘图时,您可以跳过所有其他点或其他内容。如果用户快速移动,这可能会提供不准确的绘图,因此您可以检查跳过的点是近还是远。

final int len = pointsX.length, far = 50;
for (int i = 0; i < len; i++)
{
    if (i % 2 == 0)  //If even, draw
    {
        //Draw code
    }
    else if (Math.abs(pointsX[i] - pointsX[i-1]) > far || Math.abs(pointsY[i] - pointsY[i-1]) > far)
    {   //If the index is odd, check if the distance from the current to the last point is far.
        //If it is far, draw. If not far, skip the draw, so it doesn't appear as jagged.
        //Draw code
    }
}

【讨论】:

  • 谢谢,我以前也有同样的想法,每两个跳过一个点,效果不好。但是检查两个点的距离然后确定skip或不,似乎是个好主意。我稍后会尝试并告知结果。也许在其他解决方案之外使用这种方法会很好:) 再次感谢。(抱歉英语不好)
  • 哦,不,它没有帮助。我真的需要修改锯齿点,但还是谢谢
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2017-06-10
相关资源
最近更新 更多