Вы можете получить мировое положение / вращение объектов, рекурсивно применяя эту формулу:
worldX = parentX + x * Math.cos( parentR ) - y * Math.sin( parentR );
worldY = parentY + x * Math.sin( parentR ) + y * Math.cos( parentR );
worldR = parentR + r;
Реализация javascript будет:
var deg2rad, rad2deg, getXYR;
deg2rad = function ( d ) { return d * Math.PI / 180 };
rad2deg = function ( r ) { return r / Math.PI * 180 };
getXYR = function ( node ) {
var x, y, r,
parentXYR, pX, pY, pR,
nX, nY;
x = y = r = 0;
if ( node ) {
parentXYR = getXYR( node.parent );
pX = parentXYR.x;
pY = parentXYR.y;
pR = deg2rad( parentXYR.r );
nX = node.x;
nY = node.y;
x = pX + nX * Math.cos( pR ) - nY * Math.sin( pR );
y = pY + nX * Math.sin( pR ) + nY * Math.cos( pR );
r = rad2deg( pR + deg2rad( node.r ) );
}
return { x:x, y:y, r:r };
};
Попробуйте это с этими объектами:
el1 = {x:3,y:0,r:45};
el2 = {x:0,y:0,r:45};
el1.parent = el2;
getXYR(el1);
Это не займет много времени, прежде чем вы захотите рассчитать кратчайший угол между двумя объектами, если вы получите deltaX (x2-x1) и deltaY (y2-y1) между двумя объектами, вы можете получить угол с помощью этой функции :
var getAngle = function ( dx, dy ) {
var r = Math.atan2( dy, dx ) * 180 / Math.PI;
return ( r > 180 ) ? r-360 :
( r < -180 ) ? r+360 :
r;
}
В долгосрочной перспективе лучше учиться с использованием матриц. Эквивалентность получения мира pos / rot - это мировая матрица. Вот немного полезной информации о матрицах (в документе SVG, но это не актуально): http://www.w3.org/TR/SVG/coords.html#NestedTransformations
Вот как вы это сделаете с матрицами (и с gl-matrix lib https://github.com/toji/gl-matrix):
var getWorldMatrix = function ( node ) {
var parentMatrix;
if ( !node )
return mat4.identity();
parentMatrix = getWorldMatrix( node.parent );
return mat4.multiply( parentMatrix, node.matrix );
};
О, я забыл, теперь, чтобы, наконец, зарегистрировать щелчок, достаточно получить координаты экрана мыши и сравнить их с положением объектов + смещением области просмотра холста.