如何判断一个点是否在凸多边形内 - golang

news/2024/10/17 19:27:07/

判断一个点是否在凸多边形内的方法很多,此处仅给出使用向量叉积法判断点是否在凸多边形内的方法。

以下图为例说明问题:

原理:

1. 将多边形的第 i 条边的第一个顶点指向点 P 得到向量 v1,然后将从第一个顶点指向第二个顶点得到向量 v2,叉乘这两个向量。

2. 如果叉乘结果与上一条边的叉乘结果的乘积大于 0 则继续执行;如果乘积小于 0,表示点 P 不在凸多边形内,直接返回即可。

切记

此种办法只能用来判断凸多边形,且要求凸多边形的点以固定的顺序给出,例如固定为逆时针或顺时针。

C++语言版本的实现,请参考我的这篇博客

如何判断一个点是否在凸多边形内 - C++_YZF_Kevin的博客-CSDN博客

golang语言的实验结果如下图,main函数最后有判断几个点是否在多边形中的举例

 实现的golang代码如下:

package mainimport ("fmt"
)type Point struct {X float64Y float64
}
func (p *Point) GetX() float64 { return p.X }
func (p *Point) GetY() float64 { return p.Y }// point1和point2的向量
func SubPoint(point1 *Point, point2 *Point) *Point{return &Point{X: point1.GetX() - point2.GetX(),Y: point1.GetY() - point2.GetY(),}
}// 向量积(叉乘)
func CrossProduct(point1 *Point, point2 *Point) float64 {return point1.GetX()*point2.GetY() - point2.GetX()*point1.GetY()
}// 判断一个点是否在多边形内
func IsPointInConvexPolygon(aPoints []*Point, vTarget *Point) bool {if len(aPoints) == 0 {return false}var nCurCrossProduct   float64var nLastValue           float64for i:=0; i<len(aPoints); i++ {vU := SubPoint(vTarget, aPoints[i])nNextIndex := (i + 1) % len(aPoints)vV := SubPoint(aPoints[nNextIndex], aPoints[i])nCurCrossProduct = CrossProduct(vU, vV)if i>0 && nCurCrossProduct*nLastValue<= 0 {return false}nLastValue = nCurCrossProduct}return true
}func main() {// 多边形的顶点坐标polygon := []*Point{{0, 0}, {0, 1158}, {346, 1345}, {750, 1118}, {750, 0}} bSuc1 := IsPointInConvexPolygon(polygon, &Point{350, 1160})fmt.Println("bSuc1=",bSuc1)bSuc2 := IsPointInConvexPolygon(polygon, &Point{2, 1190})fmt.Println("bSuc2=",bSuc2)bSuc3 := IsPointInConvexPolygon(polygon, &Point{749, 1118})fmt.Println("bSuc3=",bSuc3)
}


http://www.ppmy.cn/news/123333.html

相关文章

uniapp-前端 二维码、扫码、长按、识别等问题

一&#xff1a;识别&#xff1a;图片二维码url&#xff1a; 后端返回二维码的图片url&#xff0c;则直接展示&#xff0c;做长按手势识别&#xff0c;再调用方法即可。 <mage>标签长按识别实现&#xff08;微信版本>2.7.0&#xff09; <image show-menu-by-long…

ROM RAM和硬盘的区别

文章目录 ROMPROMEPROMOTPROMEEPROM Flash MemonyRAMSRAMDRAM 硬盘虚拟内存 ROM ROM全称 Read Only Memony&#xff0c;为只读存储器&#xff0c;最开始的 ROM 存储信息后就不能更改&#xff0c;但是经过发展&#xff0c;ROM也可以更改存储信息。 PROM 可编程程序只读存储器…

2. 虚拟环境

一、为什么要搭建虚拟环境&#xff1f; 在实际开发过程中&#xff0c;多个程序可能需要调试各种版本的不同环境&#xff0c;比如不同的Python解释器&#xff0c;不同的flask版本 二、如何搭建虚拟环境&#xff1f; 什么是虚拟环境&#xff1f; 它就是一个特殊的文件夹&…

[20161216]关于library cache lock.txt

[20161216]关于library cache lock.txt --这几天一直在关注这个链接,http://www.itpub.net/thread-2073170-1-1.html --就是library cache lock导致挂死业务,一般引起这个问题编译包,而应用正好在使用执行这个包,以及11g口令大小写导致无法登录的问题, --我自己很久以前也遇到过…

perl DBD Informix install and test

转载: http://heyiyi.blog.51cto.com/205455/1600615 1.安装Informix_Client_SDK 1)root用户登录&#xff0c;添加informix home目录、组、用户 # mkdir -p /opt/informix # groupadd informix # useradd -G informix -d /opt/informix informix # passwd informix # chown inf…

Vistor简介

Vistor简介 Vistor虚拟带库系统是cofio公司的一款虚拟带库软件解决方案&#xff0c;用来实现高性能的磁盘备份&#xff0c;同真实带库一样的磁带管理机制提高了管理效率。Vistor支持iscsi和FC&#xff0c;可以模拟多种型号的磁带库&#xff0c;允许创建多个不同的带库&#xff…

网络渗透工具--下

工具 中间件扫描、指纹识别类 wyportmap ——目标端口扫描系统服务指纹识别 传送门↓ https://github.com/ring04h/wyportmap weakfilescan ——动态多线程敏感信息泄露检测工具 传送门↓ https://github.com/ring04h/weakfilescan wafw00f ——WAF产品指纹识别 传…

【安全牛学习笔记】拒绝服务***工具

拒绝服务***工具 RUDY - 慢速应用层HTTP POST***&#xff0c;与slowhttptest原理相同 - 每次只传输一个字节的数据 - 美剧“***军团”中曾提到此**…