Skip to content

Commit 473c48a

Browse files
Julianzsparal
Julian
authored andcommitted
add the graham scan in go (#402)
* add the graham scan in go * change the name golang to go * remove merge marker
1 parent 60f89b3 commit 473c48a

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"math"
6+
"sort"
7+
)
8+
9+
type point struct {
10+
x, y int
11+
}
12+
13+
func counterClockwise(p1, p2, p3 point) bool {
14+
return (p3.y-p1.y)*(p2.x-p1.x) >= (p2.y-p1.y)*(p3.x-p1.x)
15+
}
16+
17+
func polarAngle(ref, point point) float64 {
18+
return math.Atan2(float64(point.y-ref.y), float64(point.x-ref.x))
19+
}
20+
21+
func grahamScan(points []point) []point {
22+
sort.Slice(points, func(a, b int) bool {
23+
return points[a].y < points[b].y || (points[a].y == points[b].y && points[a].x < points[b].x)
24+
})
25+
26+
start := points[0]
27+
points = points[1:]
28+
29+
sort.Slice(points, func(a, b int) bool {
30+
return polarAngle(start, points[a]) < polarAngle(start, points[b])
31+
})
32+
33+
hull := []point{start, points[0], points[1]}
34+
for _, p := range points[2:] {
35+
for !counterClockwise(hull[len(hull)-2], hull[len(hull)-1], p) {
36+
hull = hull[:len(hull)-1]
37+
}
38+
hull = append(hull, p)
39+
}
40+
41+
return hull
42+
}
43+
44+
func main() {
45+
points := []point{{-5, 2}, {5, 7}, {-6, -12}, {-14, -14}, {9, 9},
46+
{-1, -1}, {-10, 11}, {-6, 15}, {-6, -8}, {15, -9},
47+
{7, -7}, {-2, -9}, {6, -5}, {0, 14}, {2, 8}}
48+
49+
fmt.Println("The points in the hull are:")
50+
hull := grahamScan(points)
51+
for _, p := range hull {
52+
fmt.Println(p)
53+
}
54+
}

contents/graham_scan/graham_scan.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ We can find whether a rotation is counter-clockwise with trigonometric functions
2222
[import:36-38, lang:"javascript"](code/javascript/graham-scan.js)
2323
{% sample lang="py" %}
2424
[import:4-6, lang:"python"](code/python/grahamScan.py)
25+
{% sample lang="go" %}
26+
[import:13-15, lang:"go"](code/golang/graham.go)
2527
{% sample lang="java" %}
2628
[import:27-29, lang:"java"](code/java/GrahamScan.java)
2729
{% endmethod %}
@@ -48,6 +50,8 @@ In the end, the code should look something like this:
4850
[import:1-30, lang:"javascript"](code/javascript/graham-scan.js)
4951
{% sample lang="py" %}
5052
[import:14-27, lang:"python"](code/python/grahamScan.py)
53+
{% sample lang="go" %}
54+
[import:21-42, lang:"go"](code/golang/graham.go)
5155
{% sample lang="java" %}
5256
[import:35-70, lang:"java"](code/java/GrahamScan.java)
5357
{% endmethod %}
@@ -69,6 +73,8 @@ In the end, the code should look something like this:
6973
[import, lang:"javascript"](code/javascript/graham-scan.js)
7074
{% sample lang="py" %}
7175
[import, lang:"python"](code/python/grahamScan.py)
76+
{% sample lang="go" %}
77+
[import, lang:"go"](code/golang/graham.go)
7278
{% sample lang="java" %}
7379
[import, lang:"java"](code/java/GrahamScan.java)
7480
{% endmethod %}

0 commit comments

Comments
 (0)