2013-03-19 5 views
5

Ich versuche gerade, Bögen mit dem KineticJS-Canvas-Framework zu zeichnen. Das Problem, das ich habe, ist, dass diese Bögen nicht annähernd so "perfekt" kreisförmig wie erforderlich sind.Zeichnen von perfekten Kreisbögen mit HTML5 Canvas + KineticJS

Sie sind werden wie folgt gezogen:

var redArc = new Kinetic.Shape({ 
    drawFunc: function (canvas) { 
     var ctx = canvas.getContext(); 
     ctx.beginPath(); 
     ctx.arc(x, y, r, 0, Math.PI/2, true); // Arc of 270° 
     canvas.fillStroke(this); 
    }, 
    x: x, 
    y: y, 
    stroke: 'rgb(255,0,0)', 
    strokeWidth: 20, 
    offset: [x, y] 
}); 

Ich wusste, dass dies ein Problem gewesen, da ist es nicht so etwas zu einem nahezu perfekten Kreis auf einem Pixel-basierten Medium ohne die Verwendung als Rendering Anti-Aliasing auf dem Strich

Ich war herumwandern, wenn dieses Problem durch Rendern mit Vektorgrafiken gelöst werden könnte oder wenn es eine alternative Lösung gab?

Ich habe eine JSFiddle enthalten, um dieses Problem zu skizzieren, die Kreise werden animiert, sich um ihre Achse zu drehen. Dieser Effekt ist offensichtlicher, wenn der (die) Bogen (Bogen) beim Drehen "wackeln".

JSFiddle: http://jsfiddle.net/EHDFV/

+0

Leider ich nichts beim Thema sagen kann, aber wenn man ctx.beginPath() Sie sollte auch ctx.endPath() nach fillstroke Aufruf. – Philipp

+0

Diese Bögen sehen gut aus für mich. Ich sehe kein "Wackeln". Was genau meinst du, wenn du sagst, dass sie unvollkommen sind? – Pointy

+0

@Philipp Ich kann sehen, woher du kommst, aber aus diesem Beispiel muss 'endPath()' nicht wirklich aufgerufen werden, da es keinen "Endpfad" gibt, der Bogen selbst wird innerhalb der Grenzen gezeichnet von seinen Parametern. – zesda

Antwort

0

Könnte die Wobble eine optische Täuschung sein.

Fügen Sie einen stationären schwarzen Kreis um Ihre Animation hinzu.

var blackCircle = new Kinetic.Shape({ 
    drawFunc: function (canvas) { 
     var ctx = canvas.getContext(); 
     ctx.beginPath(); 
     ctx.arc(x, y, (r + 10), 0, 2 * Math.PI, true); 
     canvas.fillStroke(this); 
    }, 
    x: x, 
    y: y, 
    stroke: 'rgb(0,0,0)', 
    strokeWidth: 1, 
    offset: [x, y] 
}); 

Kann Ihr Wobble den schwarzen Kreis an irgendeiner Stelle kreuzen oder eine Lücke hinterlassen?

Neue Geige http://jsfiddle.net/EHDFV/1/

+0

Sie haben diesen schwarzen Kreis auf einer Ebene über dem roten Bogen hinzugefügt, es scheint, dass der "Wobble" innerhalb von +/- 1 Pixel auftritt (da die Breite des Strichs 1 Pixel beträgt), aber es ist definitiv da. Wenn Sie den schwarzen Kreis zu einem Layer hinter dem des roten Bogens hinzufügen, wird dies bemerkbar. – zesda