Ich habe ein Tutorial erstellt, das eine zweite unsichtbare Leinwand verwendet, um Objektauswahl/Treffertests durchzuführen. Zeichnen Sie alle Ihre Formen nacheinander auf die zweite Leinwand, bis eine von ihnen ein schwarzes Pixel hat, an dem sich die Maus befindet. Dann hast du dein Objekt gefunden!
Hier ist ein bisschen aus dem Tutorial ich auf der Auswahl von Objekten mit Leinwand geschrieben:
// 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;
}
}
Meine volle Demo verwendet nur Rechtecke, aber in einer späteren Version werde ich Kreise/Pfade/Text verwenden.
Wenn Sie die Demo und meinen vollständigen Code sehen möchten, ist es here.
Dank. Ich habe endlich etwas Ähnliches gemacht, obwohl ich auf der sicheren Leinwand blieb, keine Striche oder Füllungen machte, während ich die Formen neu zeichnete. – Brousselaine
@Simon Sarris Ich habe dein Tutorial verwendet, um dies zu machen: http://edumax.org.ro/extra/new/mindmap/ (benutze Gitter als Karte und rechter Mausklick für das Menü) Ich versuche Pfade auch mit Hilfe von auswählbar zu machen deine Methode. Ich verstehe, dass Sie ein Tutorial zu diesem Thema haben, aber geben Sie uns einen Hinweis auf einige grundlegende Schritte, die Sie befolgen werden? (speziell für den Pfad .contains() Funktion) –
Entschuldigung, fast meine ganze Freizeit verbringt ich gerade damit, ein Buch zu schreiben, ich werde wahrscheinlich gegen Ende dieses Jahres zu meiner Web Tutorial Serie zurückkehren. Die Auswahl von Pfaden kann mit der 'isPointInPath'-Funktion des Kontexts erfolgen, aber Sie müssen alle Schritte speichern, die für jeden Pfad erforderlich sind, und den aktuellen Pfad des Kontexts bei jedem Test neu laden. –