gpt4 book ai didi

flash - 从不规则数量的 x,y 点制作平滑路径以模拟手写

转载 作者:行者123 更新时间:2023-12-04 11:32:24 24 4
gpt4 key购买 nike

我正在尝试在 AS3(纯,而不是 Flex)中制作一个“画笔”工具来模拟手写,使笔画变得平滑而不是角落。然后,轨迹必须减少为三次贝塞尔曲线,可以拖动和变形,影响先前绘制的路径(如插画家的钢笔工具)。

我正在跟踪鼠标移动以获得一组绘制路径的点。据我所知,我需要使用这组点来做 B-Spline 路径。然后我应该将其减少为三次贝塞尔曲线(将“钢笔工具”功能添加到路径中)。

我已经开发了钢笔工具,使用一种算法将三次贝塞尔减少到二次贝塞尔(然后使用 Flash curveTo 函数)。但我不知道如何创建 B 样条(或其他简化),然后将其简化为贝塞尔曲线。

你知道有什么方法可以做到这一点吗?

最佳答案

jhotdraw是一个用于绘图的 Java 开源项目。它将自由手绘图转换为三次贝塞尔曲线。源代码可用 - 下载和翻译。不要害怕项目的规模:你只需要几个类,即:

org.jhotdraw.geom.Bezier
org.jhotdraw.geom.BezierPath
org.jhotdraw.geom.Geom

翻译时首先将所有集合声明更改为数组(如果您仅针对 FP10 用户,请使用向量)。我有一些正则表达式,您可能会发现它们在转换中很有用 - 如果您愿意,我可以发布它们。

这是您可能会觉得有用的正则表达式列表。在每一对中,将第一个粘贴到搜索文本区域,将第二个粘贴到替换区域,选中正则表达式复选框并使用查找和替换按钮。 不要使用 Replace All - 这些都不能保证万无一失 .

全部替换 int/double name声明 var name:Number
\b(double|int)\s+(\w+)\b

var $2:Number

全部替换 Point2D.Double name声明 var name:Point
\bPoint2D\.Double\s+(\w+)\b

var $1:Point

全部替换 int/double name函数签名中的声明 name:Number
\(([^)]*)\b(?:double|int)\s+(\w+)\b([^)]*?)\)

($1$2:Number$3)

全部替换 Point2D.Double name函数签名中的声明 name:Point
\(([^)]*)\b(?:Point2D\.Double)\s+(\w+)\b([^)]*?)\) 

($1$2:Point$3)

在更改方法签名之前,请确保所有方法都是静态的:
(public|private)\s+(?!static)

将方法签名替换为 AS 格式
(public|private)\s+static\s+(\w+)\s+(\w+)\s*\(([^)]*)\)

$1 static function $3($4):$2

用 array[index] 替换 ArrayList.get(index)//警告:list.get(list.size() - 1) 失败
(\w+)\.get\(([^)]+)\)

$1[$2]

//avoid the () failure

(\w+)\.get\(([^)]*(?:\([^)]*\))[^)]*)\)

$1[$2]

替换 ArrayList.set(index, element)array[index] = element //警告:list.set(i, list.size()) 失败
(\w+)\.set\(([^,]+)\s*,\s*([^)]+)\)

$1[$2] = $3


/*the above regex successfully made the following replacement*/

cleaned.set(cleaned.size() - 1, digitizedPoints[digitizedPoints.size() - 1])

cleaned[cleaned.size() - 1] = digitizedPoints[digitizedPoints.size() - 1]

替换 arraylist.add(object)array.push(object)
//would fail if object contains ')'
//add(index, object) should be done with splice

(\w+)\.add\(([^)]+)\)

$1.push($2)

//too many failures - fail safe version -
//still fails for nested parenthesis list.add(new Point(a.first(), a.last()))
//- only three such cases - the effort to match parenthesis wouldn't be worth it
//works for list.add(new Point(3, 4)) - there were many similar cases

(\w+)\.add\(([^)]*(?:\([^)]*\))[^)]*)\)

$1.push($2)

将方法签名替换为 AS 格式(非静态方法)
(public|private)\s+(?!function)(\w+)\s+(\w+)\s*\(([^)]*)\)

$1 function $3($4):$2

全部替换 int/double/point/boolean name函数签名中的声明 name:type
\(([^)]*)\b(\w+)\s+(\w+)\b([^)]*?)\)

($1$3:$2$4)

用 = 到 AS 格式替换其自己行中的所有变量声明
^(\s+)(\w+)\s+(\w+)\s*=\s*(.+?)\s*;(\s*)$

$1var $3:$2 = $4;$5

改变大括号的位置。
^(\t)(\s*)([^\n]+)\{\s*(\n)\s+

$1$2$3$4$1$2{$4$1$2

} else进入 } \n else
^([ \t]+)}[ \t]*else\b([^\n]*)(\n)

$1}$3$1else$2$3

将单行中的 4 个变量声明替换为不同行中的 AS
^(\t+)(\w+)\s+(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*;[ \t]*(\n)

$1var $3:$2;$7$1var $4:$2;$7$1var $5:$2;$7$1var $6:$2;$7

替换数组声明
^(\s+)\w+\[\]\s*(\w+)\b

$1 var $2:Array

Remove () 强制转换 - AS 编译器不喜欢它们
(?:\(\w+\)\s*)([^ ,*+;/)><=\-])

$1

将 max 等替换为 Math.max - AS 没有静态导入
(?<!Math\.)\b(max|min|abs|sqrt|PI|cos|sin|atan2)\(

Math.$1(

关于flash - 从不规则数量的 x,y 点制作平滑路径以模拟手写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com