2012-01-10 2 views
6

Ho appena iniziato con fabric.js e ho una (probabilmente principiante) errore:coordina Canvas in Fabric.js hanno compensato

Sto usando tessuto con jQuery con il seguente codice:

$(document).ready(function() { 

canvas = new fabric.StaticCanvas('scroller'); 

canvas.add(
    new fabric.Rect({ top: 0, left: 0, width: 140, height: 100, fill: '#f55' }) 
); 

}); 

Questo codice dovrebbe disegnare un rettangolo 140x100 sulla tela. Purtroppo, appare solo un quarto del rettangolo. Se cambio i valori superiore e sinistro in numeri più alti, sulla tela viene visualizzato un numero maggiore di rettangoli.

Quindi sembra che l'origine della tela non sia a 0/0, ma a sth. più alto.

Qualcuno sa come risolvere questo o quello che sto facendo male?

Grazie in anticipo, McFarlane

+0

Ciao McFarlane =) Benvenuti in SO. Ogni volta che pubblichi un codice riceverai sempre una risposta più rapida se pubblichi il codice completo (o un esempio minimo) su jsfiddle.net, vai lì, incolla il tuo codice, salvalo e incolla il link qui = = – puk

+0

che taglia è la tua tela? forse è più piccolo di '140x100'. Prova a disegnare qualcos'altro come un cerchio o un'immagine per sapere quale quadrante viene tagliato. – puk

risposta

8

Ecco un link jsfiddle con alcuni esempi http://jsfiddle.net/pukster/sdQ7U/2/

La mia ipotesi è che fabric.js calcola tutto dall'origine (punto medio), in quanto è il disegno esattamente un quarto di un rettangolo anche con una tela 10 volte la dimensione del rettangolo. La mia ipotesi è che top e left si riferiscano effettivamente all'origine e non ai lati superiore e sinistro del riquadro di selezione immaginario. Il problema è che c'è poca documentazione su fabricjs. C'è un motivo che si sta utilizzando fabricjs e non easeljs

EDIT Ecco lo stesso violino ma con quadrati al posto dei rettangoli (è più chiaro) http://jsfiddle.net/pukster/sdQ7U/3/

EDIT OK ora sono quasi assolutamente certo che fabric.js utilizza il centro come top/left. Ho strappato il loro example off of their site e lo ho sovrapposto con il couterpart trasparente a quelle forme se fossero stati codificati in tela pura http://jsfiddle.net/pukster/uathZ/2/ (il bordo blu è il limite dell'elemento canvas).

Overlayed Pure Canvas images

Quello che vedete è che le caselle sono esattamente compensata dalla metà, ma il cerchio (ho disegnato solo un semicerchio altrimenti non sarebbe stato percepibile) è perfettamente sovrapposti. Questo è b/c in HTML Canvas, le coordinate del cerchio (x,y) si riferiscono all'origine e non in alto a sinistra. Non mi sono preoccupato del triangolo b/c la mia trigonometria è un po 'arrugginita. Personalmente ritengo che sia fuorviante utilizzare i termini top e left, quando x e sarebbero stati più rappresentativi e più brevi.

+1

Grazie per la tua risposta dettagliata. Hai ragione, fabricJS Object Origins si trova nel mezzo dell'oggetto. Attualmente sto usando fabricJS perché è un framework all-in-one con un sacco di ottime funzionalità (ad esempio il supporto SVG, che userò in seguito). Forse passerò a processingjs. Proverò a confrontare i due più tardi. – McFarlane

+0

@ McFarlane: hai proceduto con questo e qual è stato il risultato? Sarei interessato a un follow-up, incluso il confronto che menzioni. –

+3

FWIW, stiamo pianificando di passare all'origineX/originY in modo che restino a sinistra/in alto nella versione 1.4 successiva. La maggior parte degli utenti ritiene che questo sia più intuitivo. – kangax

5

Sì, questo è altamente inaspettato e anche più non documentato.

Soluzione:

Set

originX: "left" 
originY: "top" 

per ogni oggetto creato.

modifica: o utilizzare kangax soluzione più semplice nel commento qui sotto.

+3

Non è necessario impostarlo per ciascun oggetto. Fabric ha un grande vantaggio dell'ereditarietà, quindi puoi semplicemente fare 'fabric.Object.prototype.originX = true; fabric.Object.prototype.originY = true; ' – kangax

+2

Detesto l'autore di una libreria riguardo al suo commento, ma non dovrebbe essere' fabric.Object.prototype.originX = "left"; fabric.Object.prototype.originY = "top"; '? – markerikson

+1

kangax, rispetto per il progetto e il suggerimento. lasciatemi fare un'altra battuta costruttiva: gli oggetti leggeri come gli oggetti da disegno dovrebbero essere gli ultimi che usano l'ereditarietà per motivi di prestazioni. – citykid

1

Voglio commentare ma mi manca la reputazione di farlo. Comunque, ecco cosa succede quando faccio la seguente:

fabric.Object.prototype.originX = "left"; 
fabric.Object.prototype.originY = "top"; 

La forma viene reso bene, ma quando seleziono per il ridimensionamento o lo spostamento, si arriva Offset per una posizione diversa. L'approccio migliore sembra essere quello di impostare le coordinate per ogni oggetto separatamente usando il metodo set().