在Javascript中的多边形偏移
在Javascript中的多边形偏移
编辑5:终于成功在JavaScript中实现了Angus Johnson的Clipper库,并选择了Sourceforge作为主机。
在线演示:http://jsclipper.sourceforge.net/6.1.1.1/main_demo.html
下载源代码:https://sourceforge.net/projects/jsclipper/
包含逐步教程的维基页面:https://sourceforge.net/p/jsclipper/wiki/Home%206/
演示程序的展示,其中包含数十个样本多边形:https://sourceforge.net/p/jsclipper/wiki/Main_Demo%206/
希望这对需要具有偏移功能的折线和多边形裁剪库的人有所帮助。
编辑4:一种可能性是使用http://p2js.gelicon.biz/en/将Pascal转换为JavaScript。目前尚未成功。执行p2js.exe clipper.pas
时出现致命错误"找不到clipper所使用的系统单元"。
编辑:我发现了script#(Github),它似乎可以将C#转换为JavaScript。Clipper库可用于C#,那么是否可能使用Script#进行C#->JS转换,如何操作?
编辑3:无法使用script#进行转换,但也有Emscripten,但是将4000个cpp行转换为30万个JavaScript行,因此不是一个选项。手动转换似乎是最好的方法。
编辑2:我制作了一个示例,展示了问题。使用左右箭头来应用偏移。在某个距离上它工作正常,然后出现问题。黄色描边的多边形是所谓的原始偏移多边形,据我所知,Clipper库提供了一种方法来处理删除不需要的原始偏移多边形的部分。
Clipper库是由Angus Johnson开发的适用于多边形偏移的库。
我需要在JavaScript中实现此功能以进行SVG多边形的偏移。
是否有人将其转换为JavaScript版本?
如果没有,我将非常感谢一些指导,例如以下内容:
- 这将是一个巨大的任务吗?
- 选择哪种源(Delphi、C#、C++)?
- 对于偏移是否需要库中的所有内容?
Clipper库产生了所需功能的以下结果:
一些链接:
- 偏移算法
在涉及多边形膨胀的问题上,没有简单的解决方案。如果你有一个凹多边形,如果你减小偏移量足够多,它迟早会分裂成几个较小的多边形。因此,我建议使用一个现有的、经过验证的算法(Clipper 应该是一个不错的选择)。
关于将 C# 移植到 JS 的问题,我认为这是可能的,但问题是需要多少时间以及自动移植工具是否有用。根据这个讨论,我对此表示怀疑:
我尝试使用 ScriptSharp 将 C# 代码转换为 JavaScript,但有太多不兼容的结构无法使用,并且我无法将其输出为 JavaScript 文件。尝试在 JavaScript 中实现 Vatti 剪辑算法似乎是下一步。
...
是的,使用各种自动转换工具都无济于事。Clipper 使用了 JS 或 AS 中不存在的数据结构,如 Int64 或 Int128。我干脆去掉了它们。对于大多数情况来说,Int32 应该足够了,除非你在处理与地理相关的内容或大型地图。
那个用户提到的 ActionScript 移植版本不再可用,不幸的是。
至少这个是可用的:github.com/ChrisDenham/PolygonClipper.AS3。你是对的,自动转换不是一个选择。使用 Emscripten,4000 行 C++ 代码转换为 300,000 行 JS 代码。我甚至没有测试它是否有效...
偏移多边形(Offsetting polygons)是一种在计算机图形学中常见的操作,用于将原始多边形沿着指定的偏移量进行平移。然而,上述给出的Javascript代码似乎存在一些错误。下面我们将通过示例来展示它是如何工作的。
首先,我们需要定义一个原始多边形的顶点集合。假设我们有一个正方形,其顶点坐标为[(0,0), (0,1), (1,1), (1,0)]。
接下来,我们调用offsetPoints函数,并传入这个顶点集合以及一个偏移量作为参数。假设我们要将多边形向外偏移0.5个单位,则偏移量为0.5。
代码将遍历顶点集合,并计算每个顶点的偏移后的坐标。具体的计算过程如下:
1. 遍历顶点集合的每个顶点:
- 根据当前顶点和前一个顶点,计算并归一化向量v1。
- 将v1乘以偏移量,得到偏移向量v1。
- 计算v1的法向量n1。
- 根据前一个顶点和n1的坐标,计算得到偏移后的顶点坐标(x1, y1)。
- 根据当前顶点和n1的坐标,计算得到偏移后的顶点坐标(x2, y2)。
- 根据当前顶点和后一个顶点,计算并归一化向量v2。
- 将v2乘以偏移量,得到偏移向量v2。
- 计算v2的法向量n2。
- 根据当前顶点和n2的坐标,计算得到偏移后的顶点坐标(x3, y3)。
- 根据后一个顶点和n2的坐标,计算得到偏移后的顶点坐标(x4, y4)。
- 根据前述计算得到的坐标,使用线性插值计算得到新顶点的坐标(x, y)。
- 将新顶点的坐标(x, y)添加到新顶点集合中。
最后,函数将返回偏移后的顶点集合。
总结起来,这段代码的作用是将给定的多边形沿着指定的偏移量进行平移,并返回偏移后的多边形的顶点集合。
如果代码中存在一些错误,可以通过调试和修复来解决。
在这篇文章中,作者表示成功将Clipper库移植到了JavaScript,并且经过了彻底的测试后即将发布。他指出,几乎所有的功能都已经移植完成了,但是128位支持被减少到了106位。他认为这个库的一个优点是可以在各种浏览器上使用,并且可以使用SVG、VML和HTML5画布作为图形界面。作者还询问了大家对于发布这个库的最佳平台的建议。
后来,作者终于将Angus Johnson的Clipper库实现到了JavaScript中,并选择了Sourceforge作为托管平台。他还提供了一个实时演示的链接,以及下载链接和包含逐步教程的维基页面链接。作者希望这个库对需要偏移功能的多边形和折线裁剪的人有所帮助。
原因:作者想将Clipper库移植到JavaScript,以便能够在不同浏览器上使用,并能够使用不同的图形界面。
解决方法:作者成功将Clipper库移植到了JavaScript,并选择了Sourceforge作为托管平台。他提供了实时演示的链接、下载链接和维基页面链接,以便其他人使用这个库。