2012-12-09 64 views
0

我有一个贝塞尔曲线在Javascript中用一些贝塞尔曲线构建。 我可以移动手柄并保持对称。我首先计算 Handle和Point onBeziér之间的距离。然后我比较两个手柄的距离 ,计算一个乘数并将其应用于未拖动的 句柄。这适用于保持对称性。贝塞尔手柄保持半径和对称性,但不是长度

但我想实现的是,未拖动的句柄的长度保持不变。

http://cl.ly/image/0c1z00131m2y(解释我的意思的小图片)。

的代码,我目前使用计算运动是这样的:

dx = Math.abs(drag.x - point.p[(draggedItemIndex)/2].x); 
    dy = Math.abs(drag.y - point.p[(draggedItemIndex)/2].y); 
    dx2 = Math.abs(point.cp[draggedItemIndex-1].x - point.p[draggedItemIndex/2].x); 
    dy2 = Math.abs(point.cp[draggedItemIndex-1].y - point.p[draggedItemIndex/2].y); 

    dxdx = dx2/dx; 
    dydy = dy2/dy; 

    point.cp[draggedItemIndex-1].x -= dragX*dxdx; 
    point.cp[draggedItemIndex-1].y -= dragY*dydy; 

谢谢您的回答。

回答

0

我现在正在用ciruclar计算。

//Circle Center Point 
       cx = point.p[(draggedItemIndex)/2].x; 
       cy = point.p[(draggedItemIndex)/2].y; 

       //Dragged Point Position (To Circle Origin) 
       x1 = drag.x - cx; 
       y1 = drag.y - cy; 

       //Mirrored Point Position (To Circle Origin) 
       x2 = point.cp[draggedItemIndex-1].x - cx; 
       y2 = point.cp[draggedItemIndex-1].y - cy; 

       //Angle Dragged Point 
       a1 = Math.atan2(-y1,x1)*(180/Math.PI); 

       //Mirrored Angle 
       a2 = (a1-180)*(Math.PI/180)*(-1); 

       //Mirrored Point Radius 
       r = Math.sqrt(Math.pow(x2, 2)+Math.pow(y2, 2)); 

       //Apply new Position to Point 
       point.cp[draggedItemIndex-1].x = cx + r * Math.cos(a2); 
       point.cp[draggedItemIndex-1].y = cy + r * Math.sin(a2);