- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个多边形 C,如下所示:
C = 10 0
2 0
2 2
0 2
2 0
0 0
0 10
10 10
其中第一列表示 x 的坐标,第二列对应多边形 C 的 y 坐标。正如你在上图中看到的,这不是一个简单的多边形(这个多边形包含一个由白色指定的孔),所以我想从 C 中获取所有不包含孔的简单子(monad)多边形。在这种情况下,输出应如下所示:
C1 = 0 2
2 0
0 0
C2 = 2 0
2 2
0 2
0 10
10 10
10 0
其中C1和C2分别对应红色小三角和红色大多边形。
问题是如何生成这个子多边形?
任何想法将不胜感激。
最佳答案
首先我们可以假设所有交点都存在吗?很容易想出以有趣的方式与自身相交的多边形。但是使用类似 http://en.wikipedia.org/wiki/Bentley%E2%80%93Ottmann_algorithm 的东西您应该能够找到并添加所有交叉路口。
接下来我将做一个简化的假设,即我们永远不会反向遍历线段。 (您可以通过多种方式处理该病态病例。)
处理完这些细节后,接下来我们需要定位所有可以由这些点定义的最小多边形,无论它们最终是否被算作内部或外部。 (为方便起见,我们将在无穷远处添加一个“点”,并将外部视为多边形。)为此,我们首先获取每个点,并按逆时针顺序列出它直接连接的点。 (平行于 x 轴的方向是 0 度,与 y 轴的方向是 90 度,x 轴的负方向是 180 度,然后当你向下走得更远时我们环绕。)所以对于你的例子,我们会得到一些东西像这样:
( 0, 0): ( 2, 0), ( 0, 2)
( 2, 0): (10, 0), ( 2, 2), ( 0, 2), ( 0, 0)
(10, 0): (10,10), ( 2, 0)
( 0, 2): ( 0, 0), ( 2, 0), ( 2, 2), ( 0,10)
( 2, 2): ( 2, 0), ( 0, 2)
( 0, 10): ( 0, 2), (10,10)
(10, 10): (10, 0), ( 0,10)
现在每个简单的多边形都将击中其中两个点之间的每个点,反之亦然,我们可以取其中一个间隙(包括环绕)并在每个角轻松生成关联的多边形尽可能逆时针转动(即从我们到达的那一点到之后的那一点,可能是环绕)。对于每条线段,多边形将位于右侧。当我们拥有每一个点和差距时,我们知道我们拥有所有这些。因此,在上述情况下,我们将从 ( 0, 0)
和以下点 ( 2, 0)
开始,然后我们查看 ( 2, 0)
发现( 0, 0)
后面跟着(10, 0)
, 转到(10, 0)
并发现 ( 2, 0)
后面是 (10,10)
并以此方式进行追踪:
( 0, 0), ( 2, 0), (10, 0), (10,10), ( 0,10), ( 0, 2), ( 0, 0)
(请注意,由于方向的原因,这跟踪了外部区域。)
现在我们从 ( 0, 0)
和备用起点 ( 0, 2)
开始,做同样的操作得到:
( 0, 0), ( 0, 2), ( 2, 0), ( 0, 0)
(这是小内三角。)
对于( 2, 0)
,我们还没有到达( 2, 2)
。让我们开始吧。
( 2, 0), ( 2, 2), ( 0, 2), ( 0,10), (10,10), (10,0), ( 2, 0)
(这是大的不规则多边形。)
对于 ( 2, 0)
我们还没有到达 ( 0, 2)
所以让我们这样做:
( 2, 0), ( 0, 2), ( 2, 2), ( 2, 0)
(这是白色的小三角形。)
然后枚举我们可能想要经过的所有可能的有向线段,会发现我们已经涵盖了所有这些。所以这些是我们的多边形。现在我们要弄清楚里面是什么,外面是什么。有一个简单的技巧。找到一个 y 值可能最低的点(如果有平局,任何一个都可以)。例如,假设我们选择了 ( 2, 0)
。逆时针排列的连接点是(10, 0), ( 2, 2), ( 0, 2), ( 0, 0)
。它们分别是外部、内部、外部、内部……此外,一旦给定多边形的一条边被标记为外部或内部,其所有有向边都是相同的。因此我们很容易得到:
outside:
- (10, 0), ( 2, 2), ( 0, 2), ( 0, 0)
- ( 2, 0), ( 0, 2), ( 2, 2), ( 2, 0)
inside:
- ( 2, 0), ( 2, 2), ( 0, 2), ( 0,10), (10,10), (10, 0), ( 2, 0)
- ( 0, 0), ( 0, 2), ( 2, 0), ( 0, 0)
你的答案将只是内部多边形。
(小优化,我们根本不需要画外面的多边形。我们可以取第一条我们发现方向的线段,画出一条里面的线段,然后到它的一个角,确定方向接触那个角的线段,并开始绘制其他内部多边形。如果我们正确地跟踪,我们最终会得到它们。)
关于algorithm - 获取简单的多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10489829/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!