comparison cmd/tin2octree/vertex.go @ 661:af1d4d44a88a octree

Experimental tin octree indexer.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 18 Sep 2018 00:11:32 +0200
parents
children be0327dc3119
comparison
equal deleted inserted replaced
660:79db27e3a999 661:af1d4d44a88a
1 package main
2
3 import "math"
4
5 type vertex struct {
6 x float64
7 y float64
8 z float64
9 }
10
11 func (v *vertex) minimize(w vertex) {
12 if w.x < v.x {
13 v.x = w.x
14 }
15 if w.y < v.y {
16 v.y = w.y
17 }
18 if w.z < v.z {
19 v.z = w.z
20 }
21 }
22
23 func (v *vertex) maximize(w vertex) {
24 if w.x > v.x {
25 v.x = w.x
26 }
27 if w.y > v.y {
28 v.y = w.y
29 }
30 if w.z > v.z {
31 v.z = w.z
32 }
33 }
34
35 type plane struct {
36 a float64
37 b float64
38 c float64
39 d float64
40 }
41
42 func (a vertex) cross(b vertex) vertex {
43 return vertex{
44 a.y*b.z - a.z*b.y,
45 a.z*b.x - a.x*b.z,
46 a.x*b.y - a.y*b.x,
47 }
48 }
49
50 func (a vertex) sub(b vertex) vertex {
51 return vertex{
52 a.x - b.x,
53 a.y - b.y,
54 a.z - b.z,
55 }
56 }
57
58 func (a vertex) scale(s float64) vertex {
59 return vertex{
60 s * a.x,
61 s * a.y,
62 s * a.z,
63 }
64 }
65
66 func (a vertex) dot(b vertex) float64 {
67 return a.x*b.x + a.y*b.y + a.z*b.z
68 }
69
70 func (a vertex) length() float64 {
71 return math.Sqrt(a.x*a.x + a.y*a.y + a.z*a.z)
72 }
73
74 func newPlane(v1, v2, v3 vertex) plane {
75 w1 := v2.sub(v1)
76 w2 := v3.sub(v1)
77 p := w1.cross(w2)
78 p = p.scale(1 / p.length())
79
80 // x*p.x + y*p.y + z*p.z + d = 0
81 // d = -(x*p.x + y*p.y + z*p.z)
82 d := -p.dot(v1)
83 return plane{
84 a: p.x,
85 b: p.y,
86 c: p.z,
87 d: d,
88 }
89 }
90
91 func (p plane) eval(v vertex) float64 {
92 return p.a*v.x + p.b*v.y + p.c*v.z + p.d
93 }
94
95 func interpolate(v1, v2 vertex) func(vertex) vertex {
96 return func(s vertex) vertex {
97 return vertex{
98 (v2.x-v1.x)*s.x + v1.x,
99 (v2.y-v1.y)*s.y + v1.y,
100 (v2.z-v1.z)*s.z + v1.z,
101 }
102 }
103 }
104
105 func (a vertex) less(b vertex) bool {
106 return a.x < b.x || a.y < b.y || a.z < b.z
107 }