2012-07-16 14 views
12

questa situazione è difficile da spiegare, quindi cerchiamo di illustrare con una foto: pixel lighteningPerché lineTo() cambia i pixel interni?

quei pixel all'interno della prima forma creata sono alleggerite. Lo schermo viene cancellato con il nero, le caselle rosse e verdi sono disegnate, quindi il tracciato viene disegnato. L'unica soluzione che ho trovato finora è stata l'impostazione della larghezza della linea delle caselle a 2 pixel, per i motivi indicati here.

Ecco il codice utilizzato per disegnare le piazze:

sctx.save(); 
sctx.strokeStyle = this.color; 
sctx.lineWidth = this.width; 
sctx.beginPath(); 
sctx.moveTo(this.points[0].x, this.points[0].y); 
for (var i = 1; i < this.points.length; i++) 
{ 
    sctx.lineTo(this.points[i].x, this.points[i].y); 
} 
sctx.closePath(); 
sctx.stroke(); 
sctx.restore(); 

e le linee:

sctx.save(); 
sctx.strokeStyle = 'orange'; 
sctx.lineWidth = 5; 
console.log(sctx); 
sctx.beginPath(); 
sctx.moveTo(this.points[0].x, this.points[0].y); 
for (var i = 1; i < this.points.length; i++) 
{ 
    sctx.lineTo(this.points[i].x, this.points[i].y); 
} 
sctx.closePath(); 
sctx.stroke(); 
sctx.restore(); 

e una foto della stessa situazione in cui le scatole sono disegnati in larghezza 2px: Second awkwardness

lineTo() forse ha problemi con i valori alfa? Qualsiasi aiuto è molto apprezzato.

MODIFICA: per chiarire, la stessa cosa si verifica quando viene omesso sctx.closePath(); dal percorso in corso.

+1

C'è qualche possibilità che tu possa lanciare un jsfiddle? – jcolebrand

+0

Forse, se davvero devo. Sto usando una libreria piuttosto considerevole (di mia creazione): https://github.com/Bloodyaugust/SugarLab, quindi dovrei ridurne un sacco per renderlo utile. – Bloodyaugust

+0

Direi che la tua analisi è corretta, i riquadri vengono disegnati a opacità ridotta e disegnando la forma sopra di esso è possibile ripristinare quelle caselle "all'interno" della forma in piena opacità. Temo di non conoscere abbastanza le tecnologie coinvolte per speculare sul perché. –

risposta

1

Sembra che si tratti di un bug di rendering non documentato che per qualche motivo appare su tutte le piattaforme. Ci sono pochissime informazioni a riguardo, e si spera che vengano prese in considerazione prima che HTML5 sia lo standard ufficiale.

Come soluzione temporanea, non utilizzare lineTo(), utilizzare più set di linee singole.

0

Supponiamo di avere: http://jsfiddle.net/g3Kvw/ Come puoi vedere sembra essere largo 2px. Ma se lo cambi per usare fillRect() invece di lineTo(), hai http://jsfiddle.net/g3Kvw/1/ che sembra buono.

Problema: con questo metodo non è possibile disegnare qualcosa che non sia un rettangolo.

Ma se sommi 0,5 a OGNI coordinata int (x, y): http://jsfiddle.net/g3Kvw/3/ otterrai la linea regolare.

Penso che questa sia una sorta di bug di calcolo antialiasing su FF & webkit ... Ma non l'ho trovato nel bug tracker, e questa "strana" soluzione per convertire il numero in float, al fine di ottenere una linea continua è abbastanza confusa. Perché usare gli interi dovrebbe essere sufficiente.

+0

Mentre questo effettivamente serve per risolvere l'anti-aliasing, non spiega il problema con lineTo() cambiando i pixel all'interno della sua area. Infatti, anche quando le righe all'interno della lineaTo() sono il colore corretto cambiando la loro larghezza a 2, si sovrappongono di una piccola quantità alla linea arancione. – Bloodyaugust

+0

@Bloodyaugust a causa dei motori di rendering. Stai impostando la larghezza e l'altezza della tela in ENTRAMBI i lati CSS e JS? –

+0

L'unica volta che tocco la larghezza e l'altezza sono nella dichiarazione HTML: '' – Bloodyaugust

Problemi correlati