我已经阅读了类似的主题以找到解决方案,但没有成功。 我正在尝试做的是使工具与CorelDraw中的相同,名为“钢笔工具”。我是通过连接Bezier三次曲线完成的,但仍然缺少一个特征,即拖动曲线(不是控制点)以编辑其形状。
我可以成功确定曲线上应该开始拖动的“t”参数,但不知道如何重新计算该曲线的控制点。
在这里,我想强调一些与CorelDraw的PenTool行为相关的事情,可以用作constaints。我注意到,当严格垂直或水平拖动曲线时,Bezier曲线的控制点会相应地表现,即它们分别在垂直方向或水平线上移动。
那么,如何在曲线拖动时重新计算控制点的位置?
答案 0 :(得分:3)
我只是查看Inkspace资源并找到这样的代码,可能对它有所帮助:
// Magic Bezier Drag Equations follow!
// "weight" describes how the influence of the drag should be distributed
// among the handles; 0 = front handle only, 1 = back handle only.
double weight, t = _t;
if (t <= 1.0 / 6.0) weight = 0;
else if (t <= 0.5) weight = (pow((6 * t - 1) / 2.0, 3)) / 2;
else if (t <= 5.0 / 6.0) weight = (1 - pow((6 * (1-t) - 1) / 2.0, 3)) / 2 + 0.5;
else weight = 1;
Geom::Point delta = new_pos - position();
Geom::Point offset0 = ((1-weight)/(3*t*(1-t)*(1-t))) * delta;
Geom::Point offset1 = (weight/(3*t*t*(1-t))) * delta;
first->front()->move(first->front()->position() + offset0);
second->back()->move(second->back()->position() + offset1);
在你的情况下,“first-&gt; front()”和“second-&gt; back()”将意味着两个控制点
答案 1 :(得分:2)
贝塞尔曲线只不过是两个多项式:X(t), Y(t)
。
立方体:
x = ax*t^3 + bx*t^2 + cx*t + dx
0 <= t <= 1
y = ay*t^3 + by*t^2 + cy*t + dy
因此,如果你有一条曲线 - 你有多边形系数。如果你移动你的观点并且你知道它是t
参数 - 那么你可以简单地重新计算多边形的系数 - 它将是一个由6个线性方程组成的系数(对于每个点)。系统按照两个系统(x和y)细分,可以精确解决或使用一些数值方法 - 它们也不难。
因此,您现在的任务是在知道曲线的显式方程时计算曲线的控制点。
它也可以带到线性系统。我不知道如何对广义Bezier曲线进行处理,但对于三次曲线或二次曲线并不难。
通过控制点的三次曲线:
B(t) = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3
您需要做的就是生成标准多项式形式(只需打开括号)并将系数等同。这将为控制点提供最终系统!
答案 2 :(得分:0)
当您点击曲线时,您已经知道当前控制点的位置。因此,您可以计算从该点到鼠标位置的偏移X和偏移Y.在鼠标移动的情况下,您可以借助X / Y偏移重新计算新的控制点。
抱歉我的英文