0

我在用一些贝塞尔曲线构建的 Javascript 中有一个贝塞尔曲线。我可以移动手柄,它们保持对称。我通过首先计算贝塞尔曲线上的手柄和点之间的距离来做到这一点。然后我比较两个手柄的距离,计算一个乘数并将其应用于未拖动的手柄。这适用于保持对称。

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

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;

谢谢您的回答。

4

1 回答 1

0

我现在用循环计算来做。

    //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);
于 2012-12-11T15:03:43.657 回答