summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-01-05 09:16:21 +0100
committerDimitri Sokolyuk <demon@dim13.org>2017-01-05 09:16:21 +0100
commit1f7aa9818a665629005064b1126d132f36dbe39a (patch)
treef865f34df6eae00affb974392c2baf152ff1665f
Initial import
-rw-r--r--NOTES.md1
-rw-r--r--bezier.go8
-rw-r--r--bezier_test.go15
-rw-r--r--dat.go79
-rw-r--r--main.go22
-rw-r--r--matrix.go77
-rw-r--r--teapot.dat340
7 files changed, 542 insertions, 0 deletions
diff --git a/NOTES.md b/NOTES.md
new file mode 100644
index 0000000..b60170e
--- /dev/null
+++ b/NOTES.md
@@ -0,0 +1 @@
+http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/AV0405/DONAVANIK/bezier.html
diff --git a/bezier.go b/bezier.go
new file mode 100644
index 0000000..9ffa03a
--- /dev/null
+++ b/bezier.go
@@ -0,0 +1,8 @@
+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
new file mode 100644
index 0000000..bb6774f
--- /dev/null
+++ b/bezier_test.go
@@ -0,0 +1,15 @@
+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
new file mode 100644
index 0000000..cf1e545
--- /dev/null
+++ b/dat.go
@@ -0,0 +1,79 @@
+package main
+
+import (
+ "bufio"
+ "io"
+ "strconv"
+ "strings"
+)
+
+type Vertex struct {
+ X, Y, Z float64
+}
+
+type Patch []int
+
+type Surface [4][4]Vertex
+
+type Bezier []Vertex
+
+func ParseVertex(s string) (v Vertex) {
+ ss := strings.Split(s, ",")
+ if len(ss) != 3 {
+ return
+ }
+ v.X, _ = strconv.ParseFloat(ss[0], 64)
+ v.Y, _ = strconv.ParseFloat(ss[1], 64)
+ v.Z, _ = strconv.ParseFloat(ss[2], 64)
+ return
+}
+
+func ParsePatch(s string) (p Patch) {
+ f := strings.Split(s, ",")
+ for _, v := range f {
+ i, _ := strconv.ParseInt(v, 10, 64)
+ p = append(p, int(i-1))
+ }
+ return
+}
+
+func Parse(r io.Reader) (s []Surface) {
+ scan := bufio.NewScanner(r)
+
+ if !scan.Scan() {
+ return
+ }
+ n, _ := strconv.Atoi(scan.Text())
+
+ p := make([]Patch, n)
+ for i := 0; i < n; i++ {
+ if !scan.Scan() {
+ return
+ }
+ p[i] = ParsePatch(scan.Text())
+ }
+
+ if !scan.Scan() {
+ return
+ }
+ m, _ := strconv.Atoi(scan.Text())
+
+ v := make([]Vertex, m)
+ for i := 0; i < m; i++ {
+ if !scan.Scan() {
+ return
+ }
+ v[i] = ParseVertex(scan.Text())
+ }
+
+ s = make([]Surface, 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]]
+ }
+ }
+ }
+
+ return
+}
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..5d77363
--- /dev/null
+++ b/main.go
@@ -0,0 +1,22 @@
+package main
+
+import (
+ "fmt"
+ "log"
+ "os"
+)
+
+func main() {
+ fd, err := os.Open("teapot.dat")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer fd.Close()
+ b := Parse(fd)
+ for _, v := range b {
+ for _, p := range v.X() {
+ fmt.Println(p)
+ }
+ fmt.Println("")
+ }
+}
diff --git a/matrix.go b/matrix.go
new file mode 100644
index 0000000..2c16c39
--- /dev/null
+++ b/matrix.go
@@ -0,0 +1,77 @@
+package main
+
+type M [4][4]float64
+type V [4]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
+ }
+ }
+ 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
+ }
+ }
+ return
+}
+
+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
+ }
+ }
+ return
+}
+
+func (m M) T() (r M) {
+ for x, l := range m {
+ for y, v := range l {
+ r[y][x] = v
+ }
+ }
+ return
+}
+
+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++ {
+ }
+ }
+ return
+}
+
+// Right multiplication
+func (m M) RMul(v V) (r V) {
+ return
+}
+
+func (v V) Sum() (r float64) {
+ for i := range v {
+ r += v[i]
+ }
+ return
+}
diff --git a/teapot.dat b/teapot.dat
new file mode 100644
index 0000000..a064523
--- /dev/null
+++ b/teapot.dat
@@ -0,0 +1,340 @@
+32
+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
+4,17,18,19,8,20,21,22,12,23,24,25,16,26,27,28
+19,29,30,31,22,32,33,34,25,35,36,37,28,38,39,40
+31,41,42,1,34,43,44,5,37,45,46,9,40,47,48,13
+13,14,15,16,49,50,51,52,53,54,55,56,57,58,59,60
+16,26,27,28,52,61,62,63,56,64,65,66,60,67,68,69
+28,38,39,40,63,70,71,72,66,73,74,75,69,76,77,78
+40,47,48,13,72,79,80,49,75,81,82,53,78,83,84,57
+57,58,59,60,85,86,87,88,89,90,91,92,93,94,95,96
+60,67,68,69,88,97,98,99,92,100,101,102,96,103,104,105
+69,76,77,78,99,106,107,108,102,109,110,111,105,112,113,114
+78,83,84,57,108,115,116,85,111,117,118,89,114,119,120,93
+121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136
+124,137,138,121,128,139,140,125,132,141,142,129,136,143,144,133
+133,134,135,136,145,146,147,148,149,150,151,152,69,153,154,155
+136,143,144,133,148,156,157,145,152,158,159,149,155,160,161,69
+162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177
+165,178,179,162,169,180,181,166,173,182,183,170,177,184,185,174
+174,175,176,177,186,187,188,189,190,191,192,193,194,195,196,197
+177,184,185,174,189,198,199,186,193,200,201,190,197,202,203,194
+204,204,204,204,207,208,209,210,211,211,211,211,212,213,214,215
+204,204,204,204,210,217,218,219,211,211,211,211,215,220,221,222
+204,204,204,204,219,224,225,226,211,211,211,211,222,227,228,229
+204,204,204,204,226,230,231,207,211,211,211,211,229,232,233,212
+212,213,214,215,234,235,236,237,238,239,240,241,242,243,244,245
+215,220,221,222,237,246,247,248,241,249,250,251,245,252,253,254
+222,227,228,229,248,255,256,257,251,258,259,260,254,261,262,263
+229,232,233,212,257,264,265,234,260,266,267,238,263,268,269,242
+270,270,270,270,279,280,281,282,275,276,277,278,271,272,273,274
+270,270,270,270,282,289,290,291,278,286,287,288,274,283,284,285
+270,270,270,270,291,298,299,300,288,295,296,297,285,292,293,294
+270,270,270,270,300,305,306,279,297,303,304,275,294,301,302,271
+306
+1.4,0.0,2.4
+1.4,-0.784,2.4
+0.784,-1.4,2.4
+0.0,-1.4,2.4
+1.3375,0.0,2.53125
+1.3375,-0.749,2.53125
+0.749,-1.3375,2.53125
+0.0,-1.3375,2.53125
+1.4375,0.0,2.53125
+1.4375,-0.805,2.53125
+0.805,-1.4375,2.53125
+0.0,-1.4375,2.53125
+1.5,0.0,2.4
+1.5,-0.84,2.4
+0.84,-1.5,2.4
+0.0,-1.5,2.4
+-0.784,-1.4,2.4
+-1.4,-0.784,2.4
+-1.4,0.0,2.4
+-0.749,-1.3375,2.53125
+-1.3375,-0.749,2.53125
+-1.3375,0.0,2.53125
+-0.805,-1.4375,2.53125
+-1.4375,-0.805,2.53125
+-1.4375,0.0,2.53125
+-0.84,-1.5,2.4
+-1.5,-0.84,2.4
+-1.5,0.0,2.4
+-1.4,0.784,2.4
+-0.784,1.4,2.4
+0.0,1.4,2.4
+-1.3375,0.749,2.53125
+-0.749,1.3375,2.53125
+0.0,1.3375,2.53125
+-1.4375,0.805,2.53125
+-0.805,1.4375,2.53125
+0.0,1.4375,2.53125
+-1.5,0.84,2.4
+-0.84,1.5,2.4
+0.0,1.5,2.4
+0.784,1.4,2.4
+1.4,0.784,2.4
+0.749,1.3375,2.53125
+1.3375,0.749,2.53125
+0.805,1.4375,2.53125
+1.4375,0.805,2.53125
+0.84,1.5,2.4
+1.5,0.84,2.4
+1.75,0.0,1.875
+1.75,-0.98,1.875
+0.98,-1.75,1.875
+0.0,-1.75,1.875
+2.0,0.0,1.35
+2.0,-1.12,1.35
+1.12,-2.0,1.35
+0.0,-2.0,1.35
+2.0,0.0,0.9
+2.0,-1.12,0.9
+1.12,-2.0,0.9
+0.0,-2.0,0.9
+-0.98,-1.75,1.875
+-1.75,-0.98,1.875
+-1.75,0.0,1.875
+-1.12,-2.0,1.35
+-2.0,-1.12,1.35
+-2.0,0.0,1.35
+-1.12,-2.0,0.9
+-2.0,-1.12,0.9
+-2.0,0.0,0.9
+-1.75,0.98,1.875
+-0.98,1.75,1.875
+0.0,1.75,1.875
+-2.0,1.12,1.35
+-1.12,2.0,1.35
+0.0,2.0,1.35
+-2.0,1.12,0.9
+-1.12,2.0,0.9
+0.0,2.0,0.9
+0.98,1.75,1.875
+1.75,0.98,1.875
+1.12,2.0,1.35
+2.0,1.12,1.35
+1.12,2.0,0.9
+2.0,1.12,0.9
+2.0,0.0,0.45
+2.0,-1.12,0.45
+1.12,-2.0,0.45
+0.0,-2.0,0.45
+1.5,0.0,0.225
+1.5,-0.84,0.225
+0.84,-1.5,0.225
+0.0,-1.5,0.225
+1.5,0.0,0.15
+1.5,-0.84,0.15
+0.84,-1.5,0.15
+0.0,-1.5,0.15
+-1.12,-2.0,0.45
+-2.0,-1.12,0.45
+-2.0,0.0,0.45
+-0.84,-1.5,0.225
+-1.5,-0.84,0.225
+-1.5,0.0,0.225
+-0.84,-1.5,0.15
+-1.5,-0.84,0.15
+-1.5,0.0,0.15
+-2.0,1.12,0.45
+-1.12,2.0,0.45
+0.0,2.0,0.45
+-1.5,0.84,0.225
+-0.84,1.5,0.225
+0.0,1.5,0.225
+-1.5,0.84,0.15
+-0.84,1.5,0.15
+0.0,1.5,0.15
+1.12,2.0,0.45
+2.0,1.12,0.45
+0.84,1.5,0.225
+1.5,0.84,0.225
+0.84,1.5,0.15
+1.5,0.84,0.15
+-1.6,0.0,2.025
+-1.6,-0.3,2.025
+-1.5,-0.3,2.25
+-1.5,0.0,2.25
+-2.3,0.0,2.025
+-2.3,-0.3,2.025
+-2.5,-0.3,2.25
+-2.5,0.0,2.25
+-2.7,0.0,2.025
+-2.7,-0.3,2.025
+-3.0,-0.3,2.25
+-3.0,0.0,2.25
+-2.7,0.0,1.8
+-2.7,-0.3,1.8
+-3.0,-0.3,1.8
+-3.0,0.0,1.8
+-1.5,0.3,2.25
+-1.6,0.3,2.025
+-2.5,0.3,2.25
+-2.3,0.3,2.025
+-3.0,0.3,2.25
+-2.7,0.3,2.025
+-3.0,0.3,1.8
+-2.7,0.3,1.8
+-2.7,0.0,1.575
+-2.7,-0.3,1.575
+-3.0,-0.3,1.35
+-3.0,0.0,1.35
+-2.5,0.0,1.125
+-2.5,-0.3,1.125
+-2.65,-0.3,0.9375
+-2.65,0.0,0.9375
+-2.0,-0.3,0.9
+-1.9,-0.3,0.6
+-1.9,0.0,0.6
+-3.0,0.3,1.35
+-2.7,0.3,1.575
+-2.65,0.3,0.9375
+-2.5,0.3,1.125
+-1.9,0.3,0.6
+-2.0,0.3,0.9
+1.7,0.0,1.425
+1.7,-0.66,1.425
+1.7,-0.66,0.6
+1.7,0.0,0.6
+2.6,0.0,1.425
+2.6,-0.66,1.425
+3.1,-0.66,0.825
+3.1,0.0,0.825
+2.3,0.0,2.1
+2.3,-0.25,2.1
+2.4,-0.25,2.025
+2.4,0.0,2.025
+2.7,0.0,2.4
+2.7,-0.25,2.4
+3.3,-0.25,2.4
+3.3,0.0,2.4
+1.7,0.66,0.6
+1.7,0.66,1.425
+3.1,0.66,0.825
+2.6,0.66,1.425
+2.4,0.25,2.025
+2.3,0.25,2.1
+3.3,0.25,2.4
+2.7,0.25,2.4
+2.8,0.0,2.475
+2.8,-0.25,2.475
+3.525,-0.25,2.49375
+3.525,0.0,2.49375
+2.9,0.0,2.475
+2.9,-0.15,2.475
+3.45,-0.15,2.5125
+3.45,0.0,2.5125
+2.8,0.0,2.4
+2.8,-0.15,2.4
+3.2,-0.15,2.4
+3.2,0.0,2.4
+3.525,0.25,2.49375
+2.8,0.25,2.475
+3.45,0.15,2.5125
+2.9,0.15,2.475
+3.2,0.15,2.4
+2.8,0.15,2.4
+0.0,0.0,3.15
+0.0,-0.002,3.15
+0.002,0.0,3.15
+0.8,0.0,3.15
+0.8,-0.45,3.15
+0.45,-0.8,3.15
+0.0,-0.8,3.15
+0.0,0.0,2.85
+0.2,0.0,2.7
+0.2,-0.112,2.7
+0.112,-0.2,2.7
+0.0,-0.2,2.7
+-0.002,0.0,3.15
+-0.45,-0.8,3.15
+-0.8,-0.45,3.15
+-0.8,0.0,3.15
+-0.112,-0.2,2.7
+-0.2,-0.112,2.7
+-0.2,0.0,2.7
+0.0,0.002,3.15
+-0.8,0.45,3.15
+-0.45,0.8,3.15
+0.0,0.8,3.15
+-0.2,0.112,2.7
+-0.112,0.2,2.7
+0.0,0.2,2.7
+0.45,0.8,3.15
+0.8,0.45,3.15
+0.112,0.2,2.7
+0.2,0.112,2.7
+0.4,0.0,2.55
+0.4,-0.224,2.55
+0.224,-0.4,2.55
+0.0,-0.4,2.55
+1.3,0.0,2.55
+1.3,-0.728,2.55
+0.728,-1.3,2.55
+0.0,-1.3,2.55
+1.3,0.0,2.4
+1.3,-0.728,2.4
+0.728,-1.3,2.4
+0.0,-1.3,2.4
+-0.224,-0.4,2.55
+-0.4,-0.224,2.55
+-0.4,0.0,2.55
+-0.728,-1.3,2.55
+-1.3,-0.728,2.55
+-1.3,0.0,2.55
+-0.728,-1.3,2.4
+-1.3,-0.728,2.4
+-1.3,0.0,2.4
+-0.4,0.224,2.55
+-0.224,0.4,2.55
+0.0,0.4,2.55
+-1.3,0.728,2.55
+-0.728,1.3,2.55
+0.0,1.3,2.55
+-1.3,0.728,2.4
+-0.728,1.3,2.4
+0.0,1.3,2.4
+0.224,0.4,2.55
+0.4,0.224,2.55
+0.728,1.3,2.55
+1.3,0.728,2.55
+0.728,1.3,2.4
+1.3,0.728,2.4
+0.0,0.0,0.0
+1.5,0.0,0.15
+1.5,0.84,0.15
+0.84,1.5,0.15
+0.0,1.5,0.15
+1.5,0.0,0.075
+1.5,0.84,0.075
+0.84,1.5,0.075
+0.0,1.5,0.075
+1.425,0.0,0.0
+1.425,0.798,0.0
+0.798,1.425,0.0
+0.0,1.425,0.0
+-0.84,1.5,0.15
+-1.5,0.84,0.15
+-1.5,0.0,0.15
+-0.84,1.5,0.075
+-1.5,0.84,0.075
+-1.5,0.0,0.075
+-0.798,1.425,0.0
+-1.425,0.798,0.0
+-1.425,0.0,0.0
+-1.5,-0.84,0.15
+-0.84,-1.5,0.15
+0.0,-1.5,0.15
+-1.5,-0.84,0.075
+-0.84,-1.5,0.075
+0.0,-1.5,0.075
+-1.425,-0.798,0.0
+-0.798,-1.425,0.0
+0.0,-1.425,0.0
+0.84,-1.5,0.15
+1.5,-0.84,0.15
+0.84,-1.5,0.075
+1.5,-0.84,0.075
+0.798,-1.425,0.0
+1.425,-0.798,0.0