Realicé un tutorial que utiliza un segundo lienzo invisible para realizar la selección de objeto/prueba de golpe. Dibuja todas tus formas, una por una, en el segundo lienzo hasta que una de ellas tenga un píxel negro donde esté la ubicación del mouse. ¡Entonces has encontrado tu objeto!
Aquí hay un poco del tutorial que escribí en la selección de objetos con una lona:
// 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;
}
}
mi demo completo solamente utiliza rectángulos, pero en una versión posterior que va a utilizar círculos/caminos/texto.
Si quiere ver la demostración y mi código completo es here.
Gracias. Finalmente hice algo similar, aunque me quedé en el lienzo de salvar, sin hacer ningún trazo o relleno mientras volvía a dibujar las formas. – Brousselaine
@Simon Sarris He usado su tutorial para hacer esto: http://edumax.org.ro/extra/new/mindmap/ (use la cuadrícula como mapa y haga clic con el botón secundario para ver el menú) Estoy tratando de hacer rutas seleccionables también mediante el uso de tu método Tengo entendido que tiene un tutorial sobre este tema, pero, ¿hay alguna manera de darnos una pista sobre algunos pasos básicos que seguirá? (específicamente para la función .contains() de ruta) –
Lo siento, casi todo mi tiempo libre en este momento lo paso escribiendo un libro, volveré a la serie de tutoriales web probablemente hacia fines de este año. Hacer rutas seleccionables se puede hacer con la función 'isPointInPath' del contexto, pero debe guardar todos los pasos necesarios para realizar cada ruta y cargar la ruta actual del contexto cada vez que necesite realizar una prueba. –