2012-12-09 18 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);