优化电场线绘制算法
Optimizing electric field lines drawing algorithm
我写了一个算法来绘制电荷的电场线 i space。当有多个电荷时,大多数线都是弯曲的。由于Starling没有drawLine(x1,y1,x2,y2)
种功能。
我正在使用一个小的线条图像并在屏幕上反复绘制它以获得一条曲线。当绘制完所有场线后,我可能最终会在屏幕上绘制数千条小线段。由于它们具有相同的纹理,这应该不是问题,但我仍然不确定这是否是个好主意。
我正在考虑的另一种技术是,我首先制作一个闪光精灵并在其中绘制所有线条,然后将其绘制在位图中并从该位图中创建纹理。我仍然认为每次 ENTER_FRAME
事件都这样做不是一个好主意。
var s:flash.display.Sprite = new flash.display.Sprite();
//drawing inside sprite goes here
var bmd:BitmapData = new BitmapData(w, h, true, 0xffffff);
bmd.draw(s);
var texture:Texture = Texture.fromBitmapData(bmd);
var img:Image = new Image(texture);
addChild(img)
据我所知,您正在绘制可用作短边多段线的平滑曲线,并且您希望通过用弯曲基元替换多段线来压缩表示来进行优化。
首先,您可以通过折线简化算法(例如 Douglas-Peucker)来最小化线段的数量。
您还可以通过递归拆分多段线并选择一个或两个中间点(一个用于 圆弧 或 贝塞尔二次曲面,两个用于 Bezier cubic),并检查是否满足偏差标准。
您会看到所需的弧数急剧下降。
如果您的曲线已知 angular 个点,请确保在那里强制拆分,因为平滑曲线无法轻易渲染它们。
我写了一个算法来绘制电荷的电场线 i space。当有多个电荷时,大多数线都是弯曲的。由于Starling没有drawLine(x1,y1,x2,y2)
种功能。
我正在使用一个小的线条图像并在屏幕上反复绘制它以获得一条曲线。当绘制完所有场线后,我可能最终会在屏幕上绘制数千条小线段。由于它们具有相同的纹理,这应该不是问题,但我仍然不确定这是否是个好主意。
我正在考虑的另一种技术是,我首先制作一个闪光精灵并在其中绘制所有线条,然后将其绘制在位图中并从该位图中创建纹理。我仍然认为每次 ENTER_FRAME
事件都这样做不是一个好主意。
var s:flash.display.Sprite = new flash.display.Sprite();
//drawing inside sprite goes here
var bmd:BitmapData = new BitmapData(w, h, true, 0xffffff);
bmd.draw(s);
var texture:Texture = Texture.fromBitmapData(bmd);
var img:Image = new Image(texture);
addChild(img)
据我所知,您正在绘制可用作短边多段线的平滑曲线,并且您希望通过用弯曲基元替换多段线来压缩表示来进行优化。
首先,您可以通过折线简化算法(例如 Douglas-Peucker)来最小化线段的数量。
您还可以通过递归拆分多段线并选择一个或两个中间点(一个用于 圆弧 或 贝塞尔二次曲面,两个用于 Bezier cubic),并检查是否满足偏差标准。
您会看到所需的弧数急剧下降。
如果您的曲线已知 angular 个点,请确保在那里强制拆分,因为平滑曲线无法轻易渲染它们。