summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-01-05 22:52:00 +0100
committerDimitri Sokolyuk <demon@dim13.org>2017-01-05 22:52:00 +0100
commit2c7c5363052134a275f74e3aa5cb52c5c0c9bfd6 (patch)
tree2f2515d96a5a5b744eeb58d82953792ceb90ba5d
parent469aa0d398eaa9d9845125978672e923a2b43e11 (diff)
wip
-rw-r--r--NOTES.md2
-rw-r--r--bezier.go2
-rw-r--r--bezier_test.go15
-rw-r--r--dat.go19
-rw-r--r--main.go5
-rw-r--r--matrix.go97
6 files changed, 57 insertions, 83 deletions
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)