判断两三角形是否相交
来源:互联网 发布:手机破解软件 编辑:程序博客网 时间:2024/06/05 08:31
1,原理:在上篇文章中我们可以判断点是否在三角形内。这张判断两三角形是否相交,只需要判断三角形A的三个顶点不在三角形B内,三角形B的三个顶点不在三角形A则满足两三角形相离,并且判断三角形A的三条边与三角形B 都不想交
代码如下:
// test project main.gopackage mainimport ("fmt")//坐标type victor struct {X float32Y float32}func main() {//测试点pA1 := &victor{0, 0}pA2 := &victor{2, 0}pA3 := &victor{2, 2}pB1 := &victor{1.5, -1}pB2 := &victor{0, 1}pB3 := &victor{1.5, 2}IsCorssTriangle(pA1, pA2, pA3, pB1, pB2, pB3)}//判线段是否在三角形内func IsCorssTriangle(pA1 *victor, pA2 *victor, pA3 *victor, pB1 *victor, pB2 *victor, pB3 *victor) bool {//比例系数(p1.X - p2.X) / (p1.Y - p2.Y)//C p1.Y-((p1.X - p2.X) / (p1.Y - p2.Y))*p1.X//IsTriangle判断是否是三角形if !IsTriangle(pA1, pA2, pA3) {fmt.Println("该三点不能组成三角形")return false}//IsTriangle判断是否是三角形if !IsTriangle(pB1, pB2, pB3) {fmt.Println("该三点不能组成三角形")return false}//A三角形三点如果全部在B的外面 并且B的三点全部在A的外面 满足这个条件三角形必定不相交 true 是相交 false 不相交if IsInTriangle(pA1, pA2, pA3, pB1) && IsInTriangle(pA1, pA2, pA3, pB2) && IsInTriangle(pA1, pA2, pA3, pB3) && IsInTriangle(pB1, pB2, pB3, pA1) && IsInTriangle(pB1, pB2, pB3, pA3) && IsInTriangle(pB1, pB2, pB3, pA2) {fmt.Println("相交了哦")return true}//A三角的三条直线是否和B三角形相交if IsCorssDirec(pA1, pA2, pB1, pB2) || IsCorssDirec(pA1, pA2, pB1, pB3) || IsCorssDirec(pA1, pA2, pB2, pB2) {fmt.Println("相交了哦")return true}if IsCorssDirec(pA1, pA3, pB1, pB2) || IsCorssDirec(pA1, pA3, pB1, pB3) || IsCorssDirec(pA1, pA3, pB2, pB2) {fmt.Println("相交了哦")return true}if IsCorssDirec(pA3, pA2, pB1, pB2) || IsCorssDirec(pA3, pA2, pB1, pB3) || IsCorssDirec(pA3, pA2, pB2, pB2) {fmt.Println("相交了哦")return true}fmt.Println("两三角形不想交")return false}//判断两条直线是否相交 true 是相交 false 不相交func IsCorssDirec(pA1 *victor, pA2 *victor, pB1 *victor, pB2 *victor) bool {if GetMinger(pA1.X, pA2.X) > GetBigger(pB1.X, pB2.X) {return false}if GetMinger(pA1.Y, pA2.Y) > GetBigger(pB1.Y, pB2.Y) {return false}if GetBigger(pA1.Y, pA2.Y) < GetMinger(pB1.Y, pB2.Y) {return false}if GetBigger(pA1.X, pA2.X) < GetMinger(pB1.X, pB2.X) {return false}if mult(pB1, pA2, pA1)*mult(pA2, pB2, pA1) < 0 {return false}if mult(pA1, pB2, pB1)*mult(pB2, pA2, pB1) < 0 {return false}return true}//叉积func mult(a *victor, b *victor, c *victor) float32 {return (a.X-c.X)*(b.Y-c.Y) - (b.X-c.X)*(a.Y-c.Y)}//获取大数字func GetBigger(a, b float32) float32 {if a > b {return a} else {return b}}//获取大数字func GetMinger(a, b float32) float32 {if a > b {return b} else {return a}}//判断点是否在三角形内func IsInTriangle(p1 *victor, p2 *victor, p3 *victor, p *victor) bool {//IsTriangle判断是否是三角形if !IsTriangle(p1, p2, p3) {fmt.Println("该三点不能组成三角形")return false}//判断点是否在三角形的三条边同侧if IsSameDirec(p1, p2, p3, p) && IsSameDirec(p1, p3, p2, p) && IsSameDirec(p3, p2, p1, p) {fmt.Println("点在三角形里面")return true} else {fmt.Println("在三角形外面")return false}}//判断是否是三角形//p1,p2,p3分别为三个顶点坐标func IsTriangle(p1 *victor, p2 *victor, p3 *victor) bool {//是否三点X坐标相同if p1.X == p2.X && p1.X == p3.X {return false}//是否三点Y坐标相同if p1.Y == p2.Y && p1.Y == p3.Y {return false}return true}//求第三点与另外两点直线是否同侧//p1,p2 为三角形的两顶点//p为测试点func IsSameDirec(p1 *victor, p2 *victor, p3 *victor, p *victor) bool {//比例系数(p1.X - p2.X) / (p1.Y - p2.Y)//C p1.Y-((p1.X - p2.X) / (p1.Y - p2.Y))*p1.Xvar tag bool//如果 p1.X=p2.X则此时与Y轴平行,只需要比较Xif p1.X == p2.X {if (p3.X >= p1.X && p.X >= p1.X) || (p3.X < p1.X && p.X < p1.X) {return true} else {return false}} else {//如果P3在直线上面就为trueif p3.Y >= (p1.Y-p2.Y)/(p1.X-p2.X)*p3.X+p1.Y-((p1.Y-p2.Y)/(p1.X-p2.X))*p1.X {tag = true} else {tag = false}if tag {if p.Y >= (p1.Y-p2.Y)/(p1.X-p2.X)*p.X+p1.Y-((p1.Y-p2.Y)/(p1.X-p2.X))*p1.X {return true}} else {if p.Y < (p1.Y-p2.Y)/(p1.X-p2.X)*p.X+p1.Y-((p1.Y-p2.Y)/(p1.X-p2.X))*p1.X {return true}}return false}}
0 0
- 判断两三角形是否相交
- Linux下完成: 已知两三角形顶点坐标,判断其是否有公共边
- 2017福建省赛Problem B Triangles(判断两三角形位置关系)
- 判断俩个链表是否相交
- 判断俩链表是否相交
- 判断俩个链表是否相交
- 判断俩链表是否相交
- 判断矩形是否相交
- 判断俩个链表是否相交
- 判断两条单链表是否相交
- 判断这俩个链表是否相交
- 判断两链表是否相交
- 判断俩个链表是否相交
- 判断线段是否相交
- 判断俩单链表是否相交
- 判断两链表是否相交
- 判断无环链表是否相交
- 判断有环链表是否相交
- 自动布局,防京东商品属性,Label自适应
- 读书笔记MoreEffectiveC++(16)
- Gdb调试多进程程序
- OC属性
- 【Tomcat】Tomcat报错追踪
- 判断两三角形是否相交
- asp.net连接access数据库的登录页面
- Struts学习总结之配置文件
- CodeForces 463C - Gargari and Bishops
- SAP的实施公司有哪些?
- 简单实现listview可选择的列表(不用重写adapter)
- 关于在MathType中任意维度矩阵的输入方式
- Android获取屏幕宽度和高度
- 可变字典最便捷的设置键值对方式