Я думаю, что я сделал примерно то, что вы хотите: http://dl.dropbox.com/u/169269/resistor.svg
Нажмите и перетащите резистор, чтобы масштабировать и повернуть его в это положение мыши. В этой версии толщина линий и окружностей также масштабируются, но избежать этого не должно быть слишком сложно.
Требуется тригонометрия и преобразования. Ключевой частью является функция перетаскивания, которую я объясню более подробно по адресу: http://www.petercollingridge.co.uk/interactive-svg-components/draggable-svg-element
function drag(evt)
{
if(selected_element != 0)
{
var resistor_x = 200;
var resistor_y = 100;
var mouse_x = evt.pageX;
var mouse_y = evt.pageY;
dx = resistor_x - mouse_x;
dy = resistor_y - mouse_y;
d = Math.sqrt(dx*dx + dy*dy); // Find distance to mouse
theta = 90+Math.atan2(dy, dx)*180/Math.PI; //Find angle to mouse in degrees
transform = "translate(200, 100) rotate(" + theta + ") scale(" + d/310 + ")" ;
selected_element.setAttributeNS(null, "transform", transform);
}
}
Обратите внимание, что в этом коде предполагается, что резистор имеет длину 310 пикселей и вращается примерно на (200, 100). Преобразования масштабирования и вращения работают с центром в (0,0), поэтому вы должны нарисовать резистор со статической точкой в (0,0), а затем перевести его туда, куда вы хотите.