贝齐尔曲线通过三点

时间:2011-01-29 18:37:25

标签: geometry drawing bezier

我已经阅读了类似的主题以找到解决方案,但没有成功。 我正在尝试做的是使工具与CorelDraw中的相同,名为“钢笔工具”。我是通过连接Bezier三次曲线完成的,但仍然缺少一个特征,即拖动曲线(不是控制点)以编辑其形状。

我可以成功确定曲线上应该开始拖动的“t”参数,但不知道如何重新计算该曲线的控制点。

在这里,我想强调一些与CorelDraw的PenTool行为相关的事情,可以用作constaints。我注意到,当严格垂直或水平拖动曲线时,Bezier曲线的控制点会相应地表现,即它们分别在垂直方向或水平线上移动。

那么,如何在曲线拖动时重新计算控制点的位置?

3 个答案:

答案 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偏移重新计算新的控制点。

抱歉我的英文