-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIsInsideTriangle.go
More file actions
66 lines (55 loc) · 1.67 KB
/
IsInsideTriangle.go
File metadata and controls
66 lines (55 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main
import (
"fmt"
"math"
)
type vector struct {
x float64
y float64
}
type line struct {
v1 vector
v2 vector
}
type triangle struct {
points [3]vector
}
func main() {
trianglePoints := [3]vector{{ x: 0, y: 10 },
{ x: 30, y: 20 },
{ x: 20, y: 0 }}
myTriangle := triangle { points: trianglePoints }
fmt.Println("Is (20, 10) inside triangle?: ", isInTriagle(myTriangle, vector { x: 20, y: 10 }))
fmt.Println("Is (25, 5) inside triangle?: ", isInTriagle(myTriangle, vector { x: 25, y: 5 }))
}
func isUnder(line line, point vector) bool {
leftVector := line.v1
rightVector := line.v2
if (line.v2.x < line.v1.x) {
leftVector = line.v2
rightVector = line.v1
}
xDiff := point.x - leftVector.x
yDiff := point.y - leftVector.y
if (leftVector.y > rightVector.y) { // Negative slope
xDiff = rightVector.x - point.x
yDiff = point.y - rightVector.y
}
xLength := math.Abs(line.v1.x - line.v2.x)
yLength := math.Abs(line.v1.y - line.v2.y)
return xDiff / xLength > yDiff / yLength
}
func isInTriagle(triangle triangle, vector vector) bool {
for i := 0; i < len(triangle.points); i++ {
point := triangle.points[i]
nextPoint := triangle.points[(i + 1) % 3]
thirdPoint := triangle.points[(i + 2) % 3]
currentLine := line { v1: point, v2: nextPoint }
isThirdUnder := isUnder(currentLine, thirdPoint)
if (isThirdUnder && !isUnder(currentLine, vector) ||
!isThirdUnder && isUnder(currentLine, vector)) {
return false
}
}
return true
}