拖动贝塞尔曲线进行编辑

时间:2010-02-23 09:01:04

标签: edit bezier curve

如果您使用像Gimp或Photoshop这样的图形编辑程序,您将明白我的意思。要编辑这些程序的曲线(可能是贝塞尔曲线),我们可以单击曲线,拖动鼠标并相应地更改曲线。我怀疑这个机制背后的所有事情都与向量有关,但我找不到任何提及如何做到的文件。有人能告诉我怎么做吗?非常感谢你。

[edit]我的意思是选择 - 曲线本身来改变(编辑)它(点击曲线,然后拖动曲线进行编辑)。通常,我们选择控制点来改变曲线。我知道要改变曲线,我需要编辑控制点,但是如何将曲线上的变化解释为对控制点的变化?

6 个答案:

答案 0 :(得分:3)

有许多方法可以完成您所看到的内容,具体取决于您的行为方式。我将解释一些通过曲线操作点修改贝塞尔曲线的简单方法。

要做的第一件事是弄清楚用户点击曲线的参数值(t)。这通常是近似值。如果你正在对Bezier进行像素或子像素渲染,那么只需为每个像素记录t值是什么并使用它。如果要细分为线段,请查看最接近的线段,找到两个端点的t值,并根据沿线的距离来调整t值。

获得t值后,可以将其插入Bezier曲线方程。你最终会得到一些形式:

P = k0*P0 + k1*P1 + k2*P2 + k3*P3

其中P是曲线上的点,P0,P1,P2和P3是输入控制点,k0,k1,k2和k3是给定t的常数。我将k值称为“贡献”,或者更具体地说是控制点对曲线P(t)上的点的贡献。要记住的一个很好的属性是k0 + k1 + k2 + k3 = 1。

所以,假设你有一个向量V = P' - P,其中P'是新位置,P是原始位置。我们需要移动一些控制点以获得P'所需的位置,但我们对于我们想要移动的控制点有一些灵活性。可以使用具有非零贡献的任何点,或者某种组合。

假设用户在t = 0时点击曲线。在这种情况下,只有k0非零,所以

P0 := P0 + V

将产生正确的结果。这也可以写成

P0 := P0 + k0 * V

在所有贡献都非零的一般情况下,您可以对每个点应用相同的变换,这将产生非常平滑的展开变形的效果。

另一种选择是简单地移动控制点,使其具有整个距离的最大贡献。我认为使用的等式将类似于

Pmax := Pmax + 1/kmax * V

但无论哪种方式,它都归结为查看给定t值的贡献,并移动控制点以使新点位于所需位置。

这种方法非常通用,适用于NURBS和大多数其他样条,甚至是曲面。还有另一种使用Greville Abscissae的方法很常见,它尽可能多地插入点,但根据我的经验,它很容易振荡。

答案 1 :(得分:1)

编辑 - 回答您的问题编辑

为了能够选择曲线本身来移动控制点,我建议Bezier曲线绝对不是前进的方向 - 你必须反向求解方程才能找到正确的控制点位置。您还会发现,在某些情况下,实际上无法移动控制点以使曲线移动到您想要的位置。

如果您使用B样条曲线,则只需在最靠近用户单击位置的曲线上插入一个新控制点,然后移动新控制点。所以,实际上,你将添加一个新的控制点。

原始文字

假设您已经实现了贝塞尔曲线,给定一组控制点(贝塞尔通常为三个,但可以是您想要的多个),可以生成一组与显示设备上的线连接的点(通常使用0 >= u <= 1参数方程式),这很容易。

您的控制点确定曲线的位置,因此您只需要实现选择反馈并拖放这些控制点。

但是,如果您正在寻找精确的点匹配,贝塞尔曲线并不理想,因为它们只通过第一个和最后一个控制点。并且您添加到曲线的点越多,它们的准确度就越低。

B-Splines会更好,这些变化就是你在photoshop等人中实际看到的。

答案 2 :(得分:0)

拖动只会更改贝塞尔曲线的控制点,并相应地重新计算曲线。有关它们如何工作的详细说明,请参阅Wikipedia

答案 3 :(得分:0)

请澄清你想做什么?您想在应用程序中编辑贝塞尔曲线吗?你对它背后的一般数学感兴趣吗?

通常,您操纵用于生成贝塞尔曲线的控制点。

答案 4 :(得分:0)

好的,我们假设您必须使用Bezier曲线,因为您正在使用将它们作为基元的渲染库。如果您完全赞同在曲线上使用控制点的想法,您可以使用此处概述的方法插入控制点:How to find control points for a BezierSegment given Start, End, and 2 Intersection Pts in C# - AKA Cubic Bezier 4-point Interpolation

换句话说,对于曲线上的每组4个点,您将运行上述算法并获得绘制三次贝塞尔曲线所需的4个控制点。

答案 5 :(得分:0)

有关对象模型,请参阅github.com/bootchk/freehandTool

用户拖动。将阻力投影到最近的控制点或控制点之间的臂上。将拖拽解释为所述最近控制点的旋转和/或平移(变换)。注意复数:最近可能是两个段的重合控制点(末端),或贝塞尔曲线臂的控制点。