Это было бы проще сделать с SVG, чем с canvas, особенно с использованием такой библиотеки, как Raphaël . Смотрите эту демонстрацию - это не очень отличается от того, что вы хотите сделать. Если вы используете Raphaël, то он будет гораздо более переносимым, чем canvas, потому что он будет работать даже в IE 6 (с использованием VML).
Обновление:
(Исправлен пример Fiddle - он имел некоторые устаревшие зависимости - теперь он исправлен)
Хорошо, см. ЭТО ДЕМО . Это должно быть в значительной степени то, что вы объяснили, или, по крайней мере, это должно помочь вам начать. Вот код:
var R = Raphael(10, 10, 400, 400);
var l = R.path("M100 200L200 200L300 200");
l.attr({
stroke: 'red',
'stroke-width': 4
});
var c = R.circle(200, 200, 10).attr({
fill: 'white',
stroke: 'red',
'stroke-width': 4
});
function move(dx, dy) {
var x = 200 + dx, y = 200 + dy;
this.attr({cx: x, cy: y});
l.attr({path: "M100 200L"+x+" "+y+"L300 200"});
}
function start() {
c.stop();
l.stop();
}
function end() {
this.animate({cx: 200, cy: 200}, 2000, "elastic");
l.animate({path: "M100 200L200 200L300 200"},
2000, "elastic");
}
c.drag(move, start, end);