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
}
}