From 75b136a14db62dd406645c119dc7b02c6cb064a6 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 6 Jan 2017 00:17:43 +0100 Subject: wip --- bezier.go | 53 +++++++++++++++++++++++++++++++++++++++-------- dat.go | 20 ++++++++++-------- main.go | 12 ++++++++--- matrix.go | 70 --------------------------------------------------------------- 4 files changed, 65 insertions(+), 90 deletions(-) delete mode 100644 matrix.go diff --git a/bezier.go b/bezier.go index d3d0894..9bfb1f0 100644 --- a/bezier.go +++ b/bezier.go @@ -1,10 +1,47 @@ package main -/* -var Mb = M{ - {-1, 3, -3, 1}, - {3, -6, 3, 0}, - {-3, 3, 0, 0}, - {1, 0, 0, 0}, -} -*/ +import "github.com/gonum/matrix/mat64" + +var mb = []float64{-1, 3, -3, 1, 3, -6, 3, 0, -3, 3, 0, 0, 1, 0, 0, 0} + +func vector(x float64) []float64 { + v := make([]float64, 4) + v[3] = 1 + v[2] = x * v[3] + v[1] = x * v[2] + v[0] = x * v[1] + return v +} + +func Vector(x float64) *mat64.Vector { + return mat64.NewVector(4, vector(x)) +} + +func Matrix(m []float64) *mat64.Dense { + return mat64.NewDense(4, 4, m) +} + +// x(u, v) = U * Mb * Gbx * T(Mb) * T(V) +// y(u, v) = U * Mb * Gby * T(Mb) * T(V) +// z(u, v) = U * Mb * Gbz * T(Mb) * T(V) + +func mult(U, V *mat64.Vector, Mb, Gb *mat64.Dense) float64 { + m1 := new(mat64.Dense) + m2 := new(mat64.Dense) + m1.Mul(Mb, Gb) + m2.Mul(m1, Mb.T()) + return mat64.Inner(U, m2, V) +} + +func Calc(u, v float64, p Patch) (r Vertex) { + U := Vector(u) + V := Vector(v) + Mb := Matrix(mb) + Gbx := Matrix(p.X()) + Gby := Matrix(p.Y()) + Gbz := Matrix(p.Z()) + r.X = mult(U, V, Mb, Gbx) + r.Y = mult(U, V, Mb, Gby) + r.Z = mult(U, V, Mb, Gbz) + return +} diff --git a/dat.go b/dat.go index e0ac123..8b7c58d 100644 --- a/dat.go +++ b/dat.go @@ -7,13 +7,15 @@ import ( "strings" ) -func parseVertex(s string) []float64 { +func parseVertex(s string) (v Vertex) { f := strings.Split(s, ",") - p := make([]float64, len(f)) - for i, v := range f { - p[i], _ = strconv.ParseFloat(v, 64) + if len(f) != 3 { + panic("invalid vertex") } - return p + v.X, _ = strconv.ParseFloat(f[0], 64) + v.Y, _ = strconv.ParseFloat(f[1], 64) + v.Z, _ = strconv.ParseFloat(f[2], 64) + return v } func parseIndex(s string) []int { @@ -26,7 +28,7 @@ func parseIndex(s string) []int { return p } -func Parse(r io.Reader) [][][]float64 { +func Parse(r io.Reader) []Patch { scan := bufio.NewScanner(r) // first part, patch indices @@ -49,7 +51,7 @@ func Parse(r io.Reader) [][][]float64 { } m, _ := strconv.Atoi(scan.Text()) - vertices := make([][]float64, m) + vertices := make([]Vertex, m) for i := range vertices { if !scan.Scan() { return nil @@ -58,9 +60,9 @@ func Parse(r io.Reader) [][][]float64 { } // populate patches with vertices - patches := make([][][]float64, n) + patches := make([]Patch, n) for u, i := range indices { - patches[u] = make([][]float64, len(i)) + patches[u] = make([]Vertex, len(i)) for v, j := range i { patches[u][v] = vertices[j] } diff --git a/main.go b/main.go index 4ac4e61..65e12d0 100644 --- a/main.go +++ b/main.go @@ -12,8 +12,14 @@ func main() { log.Fatal(err) } defer fd.Close() - b := Parse(fd) - for _, v := range b { - fmt.Println(v) + + patches := Parse(fd) + for _, p := range patches { + for u := 0.0; u <= 1.0; u += 1.0 { + for v := 0.0; v <= 1.0; v += 1.0 { + fmt.Print(Calc(u, v, p)) + } + } + fmt.Println("") } } diff --git a/matrix.go b/matrix.go deleted file mode 100644 index dbefd1a..0000000 --- a/matrix.go +++ /dev/null @@ -1,70 +0,0 @@ -package main - -type Matrix []Vector -type Vector []float64 - -func (M Matrix) Rank() (u, v int) { - u = len(M) - if u > 0 { - v = len(M[0]) - } - return -} - -func (M Matrix) Row(n int) Vector { - if u, _ := M.Rank(); n > u { - return nil - } - return M[n] -} - -func (M Matrix) Column(n int) Vector { - if _, v := M.Rank(); n > v { - return nil - } - return M.Transpose().Row(n) -} - -func (M Matrix) Transpose() Matrix { - u, v := M.Rank() - m := NewMatrix(v, u) - for i, V := range M { - for j, val := range V { - m[j][i] = val - } - } - return m -} - -func NewMatrix(u, v int) Matrix { - m := make(Matrix, u) - for i := range m { - m[i] = make(Vector, v) - } - return m -} - -func Rank(m Matrix) (c, l int) { - c = len(m) - if len(m) > 0 { - l = len(m[0]) - } - return -} - -func PowerN(u float64, n int) []float64 { - if n < 1 { - return []float64{} - } - v := make([]float64, n) - v[n-1] = 1 - for i := n - 1; i > 0; i-- { - v[i-1] = u * v[i] - } - return v -} - -// TODO -// x(u, v) = U * Mb * Gbx * T(Mb) * T(V) -// y(u, v) = U * Mb * Gby * T(Mb) * T(V) -// z(u, v) = U * Mb * Gbz * T(Mb) * T(V) -- cgit v1.2.3