Ho creato un tutorial che utilizza una seconda tela invisibile per eseguire il test degli oggetti/hit test. Disegna tutte le forme, una alla volta, sulla seconda area di disegno fino a quando una di esse ha un pixel nero in cui si trova la posizione del mouse. Allora hai trovato il tuo oggetto!
Ecco un po 'dal tutorial che ho scritto sulla selezione di oggetti con la tela:
// gctx is ghost context, made from the second canvas
// clear(gctx)
// ...
// run through all the boxes
var l = boxes.length;
for (var i = l-1; i >= 0; i--) {
// draw shape onto ghost context
drawshape(gctx, boxes[i], 'black', 'black');
// get image data at the mouse x,y pixel
var imageData = gctx.getImageData(mx, my, 1, 1);
var index = (mx + my * imageData.width) * 4;
// if the mouse pixel exists, select and break
if (imageData.data[3] > 0) {
mySel = boxes[i];
offsetx = mx - mySel.x;
offsety = my - mySel.y;
mySel.x = mx - offsetx;
mySel.y = my - offsety;
isDrag = true;
canvas.onmousemove = myMove;
invalidate();
clear(gctx);
return;
}
}
mio demo completa utilizza solo rettangoli, ma in una versione successiva che useranno cerchi/percorsi/testo.
Se si desidera vedere la demo e il mio codice completo è here.
fonte
2010-08-23 15:27:33
Grazie. Alla fine ho fatto qualcosa di simile, anche se sono rimasto sulla tela di salvataggio, non facendo alcun tratto o riempimento durante il ridisegno delle forme. – Brousselaine
@Simon Sarris Ho usato il tuo tutorial per fare questo: http://edumax.org.ro/extra/new/mindmap/ (usa la griglia come mappa e tasto destro del mouse per il menu) Sto cercando di rendere i percorsi selezionabili anche usando il tuo metodo Capisco che tu abbia un tutorial su questo aspetto, ma c'è un modo in cui potresti darci un suggerimento su alcuni passaggi fondamentali che seguirai? (in particolare per la funzione path .contains()) –
Mi spiace, quasi tutto il mio tempo libero in questo momento è dedicato alla scrittura di un libro, tornerò alla mia serie di tutorial web probabilmente verso la fine di quest'anno. La creazione di percorsi selezionabili può essere eseguita con la funzione 'isPointInPath' del contesto, ma è necessario salvare tutti i passaggi necessari per rendere ogni percorso e caricare il percorso corrente del contesto ogni volta che è necessario testare. –