- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要列出位于给定坐标精度(比如 1)的特定多边形内部的所有坐标。这意味着,多边形边界的所有坐标都将是整数。多边形可以是凸面或凹面。
我有边界的所有坐标,coords[n][2]
这是我解决问题的方法:
为简单起见,假设多边形的第一个坐标为 [0,0]
for (i = 1;; i++)
for all points that lie on the lines: y = ±i, x = ±i,
check if the point lies inside the polygon.
if no point lies on the polygon
break;
我的方法几乎是一种蛮力方法。有没有一种有效的算法来解决这个问题?
最佳答案
最好的方法可能是使用在多边形上扫描扫描线的常用策略。将扫描线从最小的y值垂直移动到最大的y值;在每个 y 值处,您可以通过计算扫描线与穿过该 y 值的边界线的交点来计算 x 的间隔列表。 (由于扫描线是水平的,交点很容易计算。)
基本上,这个想法是:
创建一个 Activity 边界线数组。这个数组最初是空的。
创建一个按 y 坐标排序的边界线端点数组。如果有两个端点具有相同的 y 坐标,则按 x 坐标对它们进行排序。每个端点出现两次(边界线的每一端各一次);根据线的另一个端点对两个事件进行排序。
现在扫描扫描线从最小 y 到最大 y。在排序的端点数组中出现的每个 y 值处,调整 Activity 边界线列表,从列表中添加或删除边界线。新添加的行按 x 坐标顺序插入到列表中,以便列表始终从左到右。这样,每个交点都是内部和外部之间的过渡,因此成对的交点列表将成为多边形内一段点的起点和终点。
水平边界线有点烦人,如何处理它们取决于您是否希望精确地位于边界线上的点被视为多边形内部或外部。如果边界被认为是在里面,你应该能够完全忽略水平线段。但见下文。
虽然您已经说过多边形边界不是自相交的,但您可能需要担心量化导致的自相交。如果边界顶点非常靠近边界线,则将所有端点四舍五入为整数值(量化)可能会消除微小的间隙,从而导致看起来像自相交。特别令人恼火的是几乎平行的近水平线:
A B C
|___________________________________
___________________________
|
如果将这两条线量化到同一个 y 坐标上,您将得到
A B C
|
.________._________________________.
|
然后,如果忽略水平边界线,线段 BC 将不会被报告为多边形的一部分。
上述算法将同样适用于凸边界和凹边界,甚至是多个边界,但如果边界自相交则失败。要处理自交,您需要使用类似于 Bentley-Ottmann algorithm 的东西, 它将线交点添加到扫描线扫描中的“事件”列表中。 (在交点处,您必须反转线段的顺序以便水平扫描正确,并且您还必须为重新排序的线段计算新的交点。)此外,您还需要更改简单的奇偶交叉点具有绕数计算的算法,这需要知道每个段是顺时针还是逆时针。虽然 Bentley-Ottmann 算法在理论上看起来很简单,但实际实现需要处理边缘情况,例如多条线在同一点相交,甚至相互重叠(可能是量化的结果,如上所述)。
关于java - 凸/凹多边形内的所有点 - 更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44180180/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!