2013-03-19 15 views
5

Attualmente sto cercando di disegnare gli archi utilizzando la struttura di canvas KineticJS. Il problema che sto avendo è che questi archi non sono così circolari "perfettamente" come richiesto.Disegno di archi perfettamente circolari con HTML5 Canvas + KineticJS

Stanno essendo attirato come segue:

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] 
}); 

sapevo che questo sarebbe stato un problema dato che non esiste una cosa come il rendering di un cerchio quasi perfetto su un supporto a base di pixel senza l'uso di anti-aliasing sulla corsa

stavo vagando se questo problema potrebbe essere risolto mediante rendering con grafica vettoriale o se ci fosse una soluzione alternativa?

Ho incluso un JSFiddle per delineare questo problema, i cerchi sono animati ruotando intorno al proprio asse. Questo effetto è più evidente con gli archi che appaiono "oscillare" mentre ruotano.

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

+0

purtroppo non posso dire nulla in argomento, ma quando si ctx.beginPath() si dovrebbe anche ctx.endPath() dopo la chiamata fillStroke. – Philipp

+0

Questi archi mi stanno bene. Non vedo alcuna "oscillazione". Cosa ** esattamente ** intendi quando dici che sono imperfetti? – Pointy

+0

@Philipp Posso vedere da dove vieni, ma per questo esempio 'endPath()' non ha davvero bisogno di essere chiamato perché non esiste un "end path", l'arco stesso viene disegnato entro i limiti dei suoi parametri. – zesda

risposta

0

Potrebbe l'oscillazione essere un'illusione ottica.

È stato aggiunto un cerchio nero stazionario attorno all'animazione.

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] 
}); 

La tua oscillazione attraversa il cerchio nero in qualsiasi punto o lascia uno spazio?

Nuovo violino http://jsfiddle.net/EHDFV/1/

+0

Hai aggiunto quel cerchio nero su un livello sopra l'arco rosso, sembra che la "oscillazione" si verifichi in +/- 1px (poiché la larghezza del tratto è 1px), ma è sicuramente lì. Se si aggiunge il cerchio nero a un livello dietro a quello dell'arco rosso, questo diventa evidente. – zesda