我正在尝试模拟Adobe Photoshop中使用的图像扭曲效果。

矩形图像根据三次贝塞尔曲面变形(在2D中,所有Z分量均为0)。具有任何贝塞尔曲面,可以应用垂直失真$ d \ in [0,1] $。

左:输入贝塞尔曲面,$ d = 0 $,右:输出曲面,$ d = 0.8 $




当您将Bézier表面上的版本转换为16点时,您有什么想法吗?左边到右边的输出?

#1 楼

编辑:根据新图像和说明更改答案。

for every control point p(k, n)
   p'(k, n) = ( p(k, n) - p(k) ) * d * l(k) + p(k, n)


其中k是行索引,n是控制点的列索引。 l是高程因子,等于{-1,-1/3,1/3,1}。 p(k)是第k行的中心。

比率:

从新图像中,红色和蓝色线从该行的中心绘制(p(k ),基本上就是(k,0))。在第一行上,所有控制点,包括图形上的控制点(红线)都移至该线上的同一点。 p(k,n)-p(k)给出将点从p(k)移到p(k,n)的向量,现在应将其应用于另一种方法,将点移至所需位置。在图形上,d = 1,这样所有第一线点都将移到中心。您可以轻松地求解方程来验证这一点。 d * l(0)是-1,所以它将是-p(k, n) + p(k) + p(k, n),它将给出p(k)。 。我无法确定它是否真的从1/3切下,但这将是一个很好的起点。因此,相同的公式仍然适用。 l是-1/3 d是1,所以该点将以1/3的方式移动。第三个与第二个相同,但是现在向外移动,因此l为1/3。

在最后一行上,所有控制点都从该行的中心点移出。这很清楚,因为您的直线在该中心相遇。

注意:我在索引时使用了行,列,因此,如果您使用x,y,则应切换其位置。

评论


$ \ begingroup $
它保留垂直线,这是正确的。但是我正在使用Bézier曲面(在一个平面中有16个点)进行工作,并且我相信仅通过移动这16个点就可以实现,而无需在bézier曲线等上计算点。沙箱/BezierSurface/bin/BezierSurface.swf
$ \ endgroup $
–伊万·库基(Ivan Kuckir)
16年7月19日在15:02

$ \ begingroup $
如果我理解正确,我想我找到了解决该问题的方法。您在问如何在d参数为0.8的情况下将贝塞尔曲面A变形为贝塞尔曲面B或将C变形为D,是否正确?
$ \ endgroup $
–Cem Kalyoncu
16年7月19日在15:22

$ \ begingroup $
看来这不是确切的公式,但很接近。我会再考虑一下。公式至少对于曲线点是正确的。
$ \ endgroup $
–Cem Kalyoncu
16年7月19日在15:32



$ \ begingroup $
您越来越近了:)但是对于第二个示例,Y坐标也发生了变化。正如我提到的那样,所有点都沿着直线移动,因此对于每个点d = 1都可以找到新位置,然后可以进行线性插值。
$ \ endgroup $
–伊万·库基(Ivan Kuckir)
16 Jul 19 '15:33



$ \ begingroup $
我添加了另一张图片,可能会对您有所帮助。
$ \ endgroup $
–伊万·库基(Ivan Kuckir)
16年7月19日在15:46