From 2c7c5363052134a275f74e3aa5cb52c5c0c9bfd6 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 5 Jan 2017 22:52:00 +0100 Subject: wip --- NOTES.md | 2 ++ bezier.go | 2 ++ bezier_test.go | 15 --------- dat.go | 19 +++++------- main.go | 5 +-- matrix.go | 97 +++++++++++++++++++++++++++------------------------------- 6 files changed, 57 insertions(+), 83 deletions(-) delete mode 100644 bezier_test.go diff --git a/NOTES.md b/NOTES.md index c04958c..2cc0422 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1,2 +1,4 @@ http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/AV0405/DONAVANIK/bezier.html + https://godoc.org/github.com/skelterjohn/go.matrix +https://godoc.org/github.com/gonum/matrix/mat64 diff --git a/bezier.go b/bezier.go index 9ffa03a..d3d0894 100644 --- a/bezier.go +++ b/bezier.go @@ -1,8 +1,10 @@ package main +/* var Mb = M{ {-1, 3, -3, 1}, {3, -6, 3, 0}, {-3, 3, 0, 0}, {1, 0, 0, 0}, } +*/ diff --git a/bezier_test.go b/bezier_test.go deleted file mode 100644 index bb6774f..0000000 --- a/bezier_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import "testing" - -func TestPowers(t *testing.T) { - testCases := []float64{0.0, 0.25, 0.5, 0.75, 1.0} - for _, tc := range testCases { - t.Log(Power(tc)) - } -} - -func TestT(t *testing.T) { - t.Log(Mb) - t.Log(Mb.T()) -} diff --git a/dat.go b/dat.go index cf1e545..d209338 100644 --- a/dat.go +++ b/dat.go @@ -11,10 +11,6 @@ type Vertex struct { X, Y, Z float64 } -type Patch []int - -type Surface [4][4]Vertex - type Bezier []Vertex func ParseVertex(s string) (v Vertex) { @@ -28,7 +24,7 @@ func ParseVertex(s string) (v Vertex) { return } -func ParsePatch(s string) (p Patch) { +func ParsePatch(s string) (p []int) { f := strings.Split(s, ",") for _, v := range f { i, _ := strconv.ParseInt(v, 10, 64) @@ -37,7 +33,7 @@ func ParsePatch(s string) (p Patch) { return } -func Parse(r io.Reader) (s []Surface) { +func Parse(r io.Reader) (b []Bezier) { scan := bufio.NewScanner(r) if !scan.Scan() { @@ -45,7 +41,7 @@ func Parse(r io.Reader) (s []Surface) { } n, _ := strconv.Atoi(scan.Text()) - p := make([]Patch, n) + p := make([][]int, n) for i := 0; i < n; i++ { if !scan.Scan() { return @@ -66,12 +62,11 @@ func Parse(r io.Reader) (s []Surface) { v[i] = ParseVertex(scan.Text()) } - s = make([]Surface, n) + b = make([]Bezier, n) for i, patch := range p { - for x := 0; x < 4; x++ { - for y := 0; y < 4; y++ { - s[i][x][y] = v[patch[x*4+y]] - } + b[i] = make([]Vertex, n) + for j, x := range patch { + b[i][j] = v[x] } } diff --git a/main.go b/main.go index 5d77363..4ac4e61 100644 --- a/main.go +++ b/main.go @@ -14,9 +14,6 @@ func main() { defer fd.Close() b := Parse(fd) for _, v := range b { - for _, p := range v.X() { - fmt.Println(p) - } - fmt.Println("") + fmt.Println(v) } } diff --git a/matrix.go b/matrix.go index 2c16c39..dbefd1a 100644 --- a/matrix.go +++ b/matrix.go @@ -1,77 +1,70 @@ package main -type M [4][4]float64 -type V [4]float64 +type Matrix []Vector +type Vector []float64 -func (s Surface) X() (m M) { - for x := 0; x < 4; x++ { - for y := 0; y < 4; y++ { - m[x][y] = s[x][y].X - } +func (M Matrix) Rank() (u, v int) { + u = len(M) + if u > 0 { + v = len(M[0]) } return } -func (s Surface) Y() (m M) { - for x := 0; x < 4; x++ { - for y := 0; y < 4; y++ { - m[x][y] = s[x][y].Y - } +func (M Matrix) Row(n int) Vector { + if u, _ := M.Rank(); n > u { + return nil } - return + return M[n] } -func (s Surface) Z() (m M) { - for x := 0; x < 4; x++ { - for y := 0; y < 4; y++ { - m[x][y] = s[x][y].Z - } +func (M Matrix) Column(n int) Vector { + if _, v := M.Rank(); n > v { + return nil } - return + return M.Transpose().Row(n) } -func (m M) T() (r M) { - for x, l := range m { - for y, v := range l { - r[y][x] = v +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 + return m } -func Power(u float64) (v V) { - v[3] = 1 - v[2] = u * v[3] - v[1] = u * v[2] - v[0] = u * v[1] - return -} - -// TODO -// x(u, v) = U * Mb * Gbx * T(Mb) * T(V) - -// Left multiplication -func (v V) LMul(m M) (r M) { - return -} - -// Matrix Multiplication -func (m M) MMul(mm M) (r M) { - for x := 0; x < 4; x++ { - for y := 0; y < 4; y++ { - } +func NewMatrix(u, v int) Matrix { + m := make(Matrix, u) + for i := range m { + m[i] = make(Vector, v) } - return + return m } -// Right multiplication -func (m M) RMul(v V) (r V) { +func Rank(m Matrix) (c, l int) { + c = len(m) + if len(m) > 0 { + l = len(m[0]) + } return } -func (v V) Sum() (r float64) { - for i := range v { - r += v[i] +func PowerN(u float64, n int) []float64 { + if n < 1 { + return []float64{} } - return + 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