验证点是否在三角形内

1,原理:三角形有三个点p1,p2,p3。当p1,p2连成直线后,如果测试点和p3在直线的一侧。这为true。用排列组合同时满足p1,p2;p2,p3;p1,p2三条直线同侧则必定在三角形内。事例代码如下:


// test project main.go
package main

import (
	"fmt"
)

//坐标
type victor struct {
	X float32
	Y float32
}

func main() {
	//测试点
	p1 := &victor{0, 0}
	p2 := &victor{1, 0}
	p3 := &victor{1, 1}
	p := &victor{1, 2}
	//IsTriangle判断是否是三角形
	if !IsTriangle(p1, p2, p3) {
		fmt.Println("该三点不能组成三角形")
		return
	}
	//判断点是否在三角形的三条边同侧
	if IsSameDirec(p1, p2, p3, p) && IsSameDirec(p1, p3, p2, p) && IsSameDirec(p3, p2, p1, p) {
		fmt.Print("点在三角形里面")
		return
	} else {
		fmt.Println("在三角形外面")
		return
	}

}

//判断是否是三角形
//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.X
	var tag bool

	//如果 p1.X=p2.X则此时与Y轴平行,只需要比较X
	if 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在直线上面就为true
		if 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 p3.Y >= (p1.Y-p2.Y)/(p1.X-p2.X)*p3.X+p1.Y-((p1.Y-p2.Y)/(p1.X-p2.X))*p1.X {
				return true
			}
		} else {
			if p3.Y < (p1.Y-p2.Y)/(p1.X-p2.X)*p3.X+p1.Y-((p1.Y-p2.Y)/(p1.X-p2.X))*p1.X {
				return true
			}
		}
		return false
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值