Mercurial > gemma
diff cmd/octree2contour/vertex.go @ 726:5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sat, 22 Sep 2018 21:34:12 +0200 |
parents | c0bba602b60e |
children |
line wrap: on
line diff
--- a/cmd/octree2contour/vertex.go Sat Sep 22 09:55:42 2018 +0200 +++ b/cmd/octree2contour/vertex.go Sat Sep 22 21:34:12 2018 +0200 @@ -1,12 +1,27 @@ package main -type vertex struct { - x float64 - y float64 - z float64 -} +import ( + "encoding/binary" + "io" + "math" +) -func (v *vertex) minimize(w vertex) { +type ( + Vertex struct { + x float64 + y float64 + z float64 + } + + Triangle [3]Vertex + + Line [2]Vertex + + LineStringZ []Vertex + MultiLineStringZ []LineStringZ +) + +func (v *Vertex) Minimize(w Vertex) { if w.x < v.x { v.x = w.x } @@ -18,7 +33,7 @@ } } -func (v *vertex) maximize(w vertex) { +func (v *Vertex) Maximize(w Vertex) { if w.x > v.x { v.x = w.x } @@ -30,34 +45,34 @@ } } -func (v vertex) sub(w vertex) vertex { - return vertex{ +func (v Vertex) Sub(w Vertex) Vertex { + return Vertex{ v.x - w.x, v.y - w.y, v.z - w.z, } } -func (v vertex) add(w vertex) vertex { - return vertex{ +func (v Vertex) Add(w Vertex) Vertex { + return Vertex{ v.x + w.x, v.y + w.y, v.z + w.z, } } -func (v vertex) scale(s float64) vertex { - return vertex{ +func (v Vertex) scale(s float64) Vertex { + return Vertex{ s * v.x, s * v.y, s * v.z, } } -func interpolate(v1, v2 vertex) func(vertex) vertex { - v2 = v2.sub(v1) - return func(s vertex) vertex { - return vertex{ +func Interpolate(v1, v2 Vertex) func(Vertex) Vertex { + v2 = v2.Sub(v1) + return func(s Vertex) Vertex { + return Vertex{ v2.x*s.x + v1.x, v2.y*s.y + v1.y, v2.z*s.z + v1.z, @@ -65,30 +80,26 @@ } } -func (a vertex) less(b vertex) bool { +func (a Vertex) Less(b Vertex) bool { return a.x < b.x || a.y < b.y || a.z < b.z } -type line [2]vertex - -func newLine(p1, p2 vertex) line { - return line{ - p2.sub(p1), +func NewLine(p1, p2 Vertex) Line { + return Line{ + p2.Sub(p1), p1, } } -func (l line) eval(t float64) vertex { - return l[0].scale(t).add(l[1]) +func (l Line) Eval(t float64) Vertex { + return l[0].scale(t).Add(l[1]) } -func (l line) intersectH(h float64) vertex { +func (l Line) IntersectHorizontal(h float64) Vertex { t := (h - l[1].z) / l[0].z - return l.eval(t) + return l.Eval(t) } -type triangle [3]vertex - func side(z, h float64) int { switch { case z < h: @@ -99,14 +110,14 @@ return 0 } -func (t *triangle) intersectH(h float64) lineStringZ { +func (t *Triangle) IntersectHorizontal(h float64) LineStringZ { sides := [3]int{ side(t[0].z, h), side(t[1].z, h), side(t[2].z, h), } - var points lineStringZ + var points LineStringZ for i := 0; i < 3; i++ { j := (i + 1) % 3 @@ -127,10 +138,28 @@ // both on same side default: // real intersection - v := newLine(t[i], t[j]).intersectH(h) + v := NewLine(t[i], t[j]).IntersectHorizontal(h) points = append(points, v) } } return points } + +func (v *Vertex) read(r io.Reader) error { + var buf [8]byte + b := buf[:] + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.x = math.Float64frombits(binary.LittleEndian.Uint64(b)) + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.y = math.Float64frombits(binary.LittleEndian.Uint64(b)) + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.z = math.Float64frombits(binary.LittleEndian.Uint64(b)) + return nil +}