2012-04-15 77 views
2

给定一条由多个点组成的线,如何通过添加中间点使线更平滑/更加曲线/柔和 - 同时保持原始点完整无损并且无法移动?如何“软化”折线的边缘?

为了说明问题,我想从上面去下面这个例子:

enter image description here

注意如何在上面的图片,如果我们开始在底部将有一个更清晰的右转。然而,在底部图像中,通过添加位于两个点中间的中间点并使用其他线的角度的平均值,使得这个尖锐的右转变得更“柔和”。 (不同的是,想象一下赛车会驾驶的路线,因为它不会突然改变方向。)但是请注意,原始点没有被“触及”,我只是增加了更多的点。

谢谢!对于它的价值,我正在使用JavaScript和Canvas来实现它。

+0

你可以沿着内插,如果它是一个贝塞尔曲线:http://en.wikipedia.org/wiki/B%C3%A9zier_curve – 2012-04-15 15:26:34

+0

刚刚发现了相关线索(没有拿起答案了) :http:// sta ckoverflow.com/questions/7891740/drawing-smooth-lines-with-canvas – 2012-04-16 22:48:49

回答

-2

下面的代码中发现elsewhere here做这项工作对我来说,在JavaScript的画布的具体情况我使用的 - 但请参见安格斯答案更普遍做法:

var max = points.length; 
context.beginPath(); 
var i = 0; 
context.moveTo(points[i].x, points[i].y); 
for (i = 1; i < max - 2; i++) { 
    var xc = (points[i].x + points[i + 1].x) * .5; 
    var yc = (points[i].y + points[i + 1].y) * .5; 
    context.quadraticCurveTo(points[i].x, points[i].y, xc, yc); 
} 
context.quadraticCurveTo(points[max - 2].x, points[max - 2].y, points[max - 1].x,points[max - 1].y); 
context.closePath(); 
context.stroke(); 
+0

你在那里做的是根据你的(控制)顶点创建一个二次贝塞尔曲线,也称为CV曲线。如果这对你有用,请随时接受你自己的答案。 :] – 2012-04-19 23:36:08

+0

它在我的具体情况下工作,再次感谢您的意见!好的,我会继续,然后将其标记为答案。 – 2012-04-20 09:30:52

4

与每个边缘(E1 & E2)相邻的 '中间' 边缘(我)做的 '我'

  • 发现超出端部的2点X距离

    • 设X =一半长度触摸e1和e2的'me'(见下文)
    • 让这2个点变成更加卑鄙的控制点。
    • 使用DeCasteljau算法(example here)找到的三次Bezier的中点(2个控制点和“我”的每一端)
    • 插入我的两个坐标之间新的“中点”。

    example

    FloatPoint ExtendLine(const FloatPoint A, const FloatPoint B, single distance) 
    { 
        FloatPoint newB; 
        float lenAB = sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)); 
        newB.X = B.x - (B.x - A.x)/lenAB * distance; 
        newB.Y = B.Y - (B.Y - A.Y)/lenAB * distance; 
        return newB; 
    } 
    
  • +0

    +1以获得完整的解决方案。 – 2012-04-16 02:40:12

    +0

    非常感谢您添加代码!你能再解释一下距离参数需要什么吗? – 2012-04-16 22:13:10

    +1

    看起来像JavaScript-Canvas确实具有一些本地功能,看起来很有帮助,我只是在阅读它:http://w3schools.com/html5/canvas_quadraticcurveto.asp和http://w3schools.com/html5/canvas_beziercurveto .asp – 2012-04-16 22:44:07