Mercurial > gemma
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/tin2octree/vertex.go Tue Sep 18 00:11:32 2018 +0200 @@ -0,0 +1,107 @@ +package main + +import "math" + +type vertex struct { + x float64 + y float64 + z float64 +} + +func (v *vertex) minimize(w vertex) { + if w.x < v.x { + v.x = w.x + } + if w.y < v.y { + v.y = w.y + } + if w.z < v.z { + v.z = w.z + } +} + +func (v *vertex) maximize(w vertex) { + if w.x > v.x { + v.x = w.x + } + if w.y > v.y { + v.y = w.y + } + if w.z > v.z { + v.z = w.z + } +} + +type plane struct { + a float64 + b float64 + c float64 + d float64 +} + +func (a vertex) cross(b vertex) vertex { + return vertex{ + a.y*b.z - a.z*b.y, + a.z*b.x - a.x*b.z, + a.x*b.y - a.y*b.x, + } +} + +func (a vertex) sub(b vertex) vertex { + return vertex{ + a.x - b.x, + a.y - b.y, + a.z - b.z, + } +} + +func (a vertex) scale(s float64) vertex { + return vertex{ + s * a.x, + s * a.y, + s * a.z, + } +} + +func (a vertex) dot(b vertex) float64 { + return a.x*b.x + a.y*b.y + a.z*b.z +} + +func (a vertex) length() float64 { + return math.Sqrt(a.x*a.x + a.y*a.y + a.z*a.z) +} + +func newPlane(v1, v2, v3 vertex) plane { + w1 := v2.sub(v1) + w2 := v3.sub(v1) + p := w1.cross(w2) + p = p.scale(1 / p.length()) + + // x*p.x + y*p.y + z*p.z + d = 0 + // d = -(x*p.x + y*p.y + z*p.z) + d := -p.dot(v1) + return plane{ + a: p.x, + b: p.y, + c: p.z, + d: d, + } +} + +func (p plane) eval(v vertex) float64 { + return p.a*v.x + p.b*v.y + p.c*v.z + p.d +} + +func interpolate(v1, v2 vertex) func(vertex) vertex { + return func(s vertex) vertex { + return vertex{ + (v2.x-v1.x)*s.x + v1.x, + (v2.y-v1.y)*s.y + v1.y, + (v2.z-v1.z)*s.z + v1.z, + } + } +} + +func (a vertex) less(b vertex) bool { + return a.x < b.x || a.y < b.y || a.z < b.z +}