1

好的,所以我会尽量做到描述性。

我正在为需要上传图像的 jibjab 样式遮罩功能的客户开发一个项目。

我希望能够生成一个包含贝塞尔形状的锚点/控制位置的数据库可存储对象,因此我可以稍后将其拉出并重新屏蔽该对象。这一切都很容易做到,除了一个问题:我需要从用户绘制的轮廓创建贝塞尔对象。

到目前为止,这是我想象的过程:

在鼠标按下时,创建一个新的精灵、beginFill 和 moveTo 鼠标位置。

在鼠标移动时,lineTo 是一个 XY 坐标。

在鼠标上,endFill。

这一切都很好。我可以在这里存储信息,但我会看到一个巨大的对象,里面装满了大量非常无用的 x/y 坐标,除了在每个像素上放置句柄之外,没有办法真正进行微调更改。(我不妨给最终用户一个铅笔工具......)

就贝塞尔曲线计算而言,这就是我的想法:

1:弄清楚何时需要开始一条新曲线,并在此间隔上跟踪像素的 xy。我想象这只是一个像素数,也许只是在每次鼠标移动时增加一个计数变量,然后每 x 个像素创建一个新变量。这里的问题是一些曲线不准确,而另一些则不必要,但我真的只需要一个一般区域,而不是一个精确的表示,所以它可以工作。不过,我会更高兴一些更聪明的东西。

2:获取每个新的 x/y,将其存储为锚点,并计算出控件将在何处生成此锚点和最后一个锚点之间的直线曲线。这是我真正挂断电话的地方。我敢肯定有人已经在 Flash 中完成了这项工作,但似乎再多的谷歌搜索也无法帮助我找到完成这项工作的方法。我已经画了很多草图,还有什么小数学可以让我的大脑环绕,但似乎无法找到将像素转换为贝塞尔曲线的方法。

这可能吗?我真正需要的是接近相同形状的东西。我正在考虑可能只在下一个像素的角度相对于当前线或其他东西的角度超过 180 度时才放置锚点,并且只是抓住这些变化之间的弧线边缘,但无论我多么努力,我似乎无法弄清楚如何让它工作!

感谢您的帮助,我一定会在这里发布我的进展,我认为这在许多应用程序中都非常有用,只要它实际上是可行的......

杰西

4

3 回答 3

1

将像素变成贝塞尔曲线听起来需要做很多工作。您可以尝试使用线性最小二乘算法之类的方法。http://en.wikipedia.org/wiki/Linear_least_squares

换一种方式,你能让你的用户画矢量图形吗?这样您就可以将形状存储在数据库中。

将光栅转换为矢量的另一种很酷的方法是这样的迭代程序:http ://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

祝你好运

于 2009-06-19T03:01:20.937 回答
1

在我对这个问题的回答中,我讨论了使用自动跟踪将位图转换为贝塞尔曲线。我建议通过服务器上的这个程序传递您的用户绘图。Autotrace 在跟踪和简化方面做得非常出色,因此无需在这里尝试重新发明轮子。

于 2009-06-19T03:15:10.847 回答
0

感谢您的回答,虽然我想我可能应该更具体地了解应用程序,但我真的只需要遮罩的轮廓,因此将图像转换为矢量或多边形,尽管这很酷,并不能真正解决我的问题问题。线性最小二乘算法非常酷,我认为这可能更接近我正在寻找的东西。

我现在有一个基本的解决方法,我只是计算鼠标移动,然后每个 X(玩它以获得最理想的曲线)移动,我抓住 xy 位置。然后,我把所有其他存储的 xy 变成一个锚,剩下的 xy 变成控件。这产生了一些理想的结果,但有一些小问题,因为绘制蒙版的速度会影响手柄的数量,而且它实际上只是获得一个一般区域,而不是精确拟合。有趣的是,对于更精确的形状,用户似乎画得更慢,所以这个解决方案比我想象的要好得多,但它并没有想象中的那么好。这将适用于客户,所以虽然没有理由进一步追求它,但我喜欢学习新事物,并且会花一些下班时间研究线性最小方程,看看我是否可以召集一个可以为我做这些计算的类。如果有人遇到此类事情的一些 AS3 代码,或者想要我的一些代码,请告诉我,这是一个有趣的谜题。

于 2009-06-27T16:25:29.553 回答