From 1f7aa9818a665629005064b1126d132f36dbe39a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 5 Jan 2017 09:16:21 +0100 Subject: Initial import --- NOTES.md | 1 + bezier.go | 8 ++ bezier_test.go | 15 +++ dat.go | 79 ++++++++++++++ main.go | 22 ++++ matrix.go | 77 +++++++++++++ teapot.dat | 340 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 542 insertions(+) create mode 100644 NOTES.md create mode 100644 bezier.go create mode 100644 bezier_test.go create mode 100644 dat.go create mode 100644 main.go create mode 100644 matrix.go create mode 100644 teapot.dat 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 -- cgit v1.2.3