2013-04-26 11 views
9

Muszę narysować i uzyskać współrzędne krzywych Beziera dla każdego kroku z natywną wersją JavaScript bez metody ctx.bezierCurveTo.Jak narysować krzywe Beziera z natywnym kodem JavaScript bez ctx.bezierCurveTo?

Znalazłem kilka zasobów, ale byłem zdezorientowany. Esspecially this wygląda całkiem blisko, ale nie mogłem go wyraźnie zaimplementować.

Jak mogę to zrobić?

+0

To w jaki sposób to zrobić w C (z OpenGL), ale idea powinna być taka sama: http://pastebin.com/XuiPMSuZ – nhahtdh

+0

@nhahtdh Cóż, myślę, że muszę zobaczyć "bezierFunction", aby przesłać go do JS – Digerkam

+0

@Hydrangea Napisałem parser formatu AI, to wszystko .. – Digerkam

Odpowiedz

23

można wykreślić na zewnątrz Baziera:

bezier = function(t, p0, p1, p2, p3){ 
    var cX = 3 * (p1.x - p0.x), 
     bX = 3 * (p2.x - p1.x) - cX, 
     aX = p3.x - p0.x - cX - bX; 

    var cY = 3 * (p1.y - p0.y), 
     bY = 3 * (p2.y - p1.y) - cY, 
     aY = p3.y - p0.y - cY - bY; 

    var x = (aX * Math.pow(t, 3)) + (bX * Math.pow(t, 2)) + (cX * t) + p0.x; 
    var y = (aY * Math.pow(t, 3)) + (bY * Math.pow(t, 2)) + (cY * t) + p0.y; 

    return {x: x, y: y}; 
}, 

(function(){ 
    var accuracy = 0.01, //this'll give the bezier 100 segments 
     p0 = {x: 10, y: 10}, //use whatever points you want obviously 
     p1 = {x: 50, y: 100}, 
     p2 = {x: 150, y: 200}, 
     p3 = {x: 200, y: 75}, 
     ctx = document.createElement('canvas').getContext('2d'); 

    ctx.width = 500; 
    ctx.height = 500; 
    document.body.appendChild(ctx.canvas); 

    ctx.moveTo(p0.x, p0.y); 
    for (var i=0; i<1; i+=accuracy){ 
    var p = bezier(i, p0, p1, p2, p3); 
    ctx.lineTo(p.x, p.y); 
    } 

    ctx.stroke() 
})() 

Oto skrzypce http://jsfiddle.net/fQYsU/

+0

To, czego szukałem, dziękuję! – Digerkam

+0

Widzę wszystkie punkty, dzięki twojemu algorytmowi. :-) –

+0

Zachowujesz się, jakby to było trywialne, ale większość ludzi nie powinna znać tej konwersji – neaumusic

Powiązane problemy