对于不规则多边形中的点,选择最接近该点的边的最有效方法是什么?

如何解决对于不规则多边形中的点,选择最接近该点的边的最有效方法是什么?

| 给定一个不规则多边形和该多边形内的一个点,如何确定多边形中哪个边最接近该点? 我可能必须对多边形中的大量点(例如50-200点)运行此计算。     

解决方法

         计算与多边形的每个边相切的直线上的最近点。 计算每个线段(多边形的边)上与该点最近的点。 计算从每个线段上最近的点到所讨论点的距离。 找到最小距离。距离最小的相应多边形边就是答案。 该算法的每个步骤都是线性时间(O(n))。 以下是每个步骤的基本公式: 计算与多边形的每个边相切的直线上的最近点。 令多边形边的一个端点为
p1 = {x1,y1}
。 令多边形边缘的另一个端点为
p2 = {x2,y2}
。 让您要分析的多边形中的点为
p3 = {x3,y3}
。 令
u
为p1和p2之间距离的百分比,即在由p1和p2形成的线上找到点所需要的,使得
p1+u(p2-p1)
=线上最接近p3的点(此点之间的线段)并且p3也恰好垂直于穿过p1和p2的直线)。
u = ((x3 - x1)(x2 - x1)+(y3 - y1)(y2 - y1)) / ((x2 - x1)^2 + (y2 - y1)^2)
令在由p1和p2形成的线上最接近p3的点称为
pu = {xu,yu}
xu = x1 + u (x2 - x1)
yu = y1 + u (y2- y1)
就像我们在ѭ6之前说的那样 对每个多边形边缘重复这些计算(即替换为新的p1和p2s) 计算每个线段(多边形的边)上与该点最近的点。 当
0 <= u <= 1
时,点
pu
仅是线段上的最近点。否则,线段的适当端点是最接近所讨论点的点。因此,对于在上述步骤中计算出的每个
pu,p1,p2,and u
,请执行以下操作:
Let pc = {xc,yc}
表示为多边形边缘线段上距所讨论点最近的点。
IF u<0 THEN pc = p1
ELSE IF u>1 THEN pc = p2
ELSE pc = pu
计算从每个线段上最近的点到所讨论点的距离。
p3
pc
之间的距离=`sqrt((x3-xc)^ 2 +(y3-yc)^ 2) 对所有PC重复此计算 找到最小距离。距离最小的相应多边形边就是答案。 遍历所有距离,直到找到最小的距离。相应的多边形边就是答案。 这是一个图表,可帮助您了解本文中的要点和术语: ....     ,        正确的答案取决于问题的整体结构:当您考虑多个查询时会发生什么?我假设每个查询将处理不同的问题。但是多边形呢?您是否希望收到同一多边形的多个查询?还是每次多边形都不相同? 如果将每个查询应用于一个不同的,不可预测的多边形,那么您唯一的解决方案就是对所有多边形边缘进行全面检查,并针对每个多边形进行点到段距离测试。可以通过各种[启发式]方法进行优化(尽早丢弃不必要的测试),但在最坏的情况下,无法进行全面测试。 但是,如果您期望问题的多边形方面具有某种可预测性和稳定性(对同一多边形或一组固定的多边形有足够多的点查询),那么情况将发生巨大变化。在这种情况下,最好的方法是在多边形内部预先构建基于边缘的Voronoi图。然后,您可以解决点定位问题(已知有效的算法),以确定查询点属于哪个Voronoi区域。这将立即告诉您哪个边缘最近。 当您需要处理多个指向同一多边形的点查询时,后者的效率无与伦比,但是要花很多精力才能实现。因此,这完全取决于您需要哪种解决方案。 附言我看到您在问题中指出要针对单个多边形的大量点运行它。这立即使基于Voronoi-diagram的解决方案成为可能。该算法的额外细微差别可能取决于是否事先完全知道大量点,还是以无法预测的方式逐点到达。     ,在SO上发布此帖子,以获取从多边形内的点到多边形边缘的灵感距离,或者该点与线段之间的最短距离     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-