summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-01-06 00:17:43 +0100
committerDimitri Sokolyuk <demon@dim13.org>2017-01-06 00:17:50 +0100
commit75b136a14db62dd406645c119dc7b02c6cb064a6 (patch)
tree98b0da61b97bb937620f8641b5be41c25af62b58
parent305f3a6096785d890927dc9e8c97c2a1a7441b1c (diff)
wip
-rw-r--r--bezier.go53
-rw-r--r--dat.go20
-rw-r--r--main.go12
-rw-r--r--matrix.go70
4 files changed, 65 insertions, 90 deletions
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)