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