summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-01-05 23:10:32 +0100
committerDimitri Sokolyuk <demon@dim13.org>2017-01-05 23:10:32 +0100
commit6fb193358722167f2c15b62de49620b0c6a7809a (patch)
treebffe7c7106480b535202ab5f891f9cdde0da930f
parent2c7c5363052134a275f74e3aa5cb52c5c0c9bfd6 (diff)
wip
-rw-r--r--dat.go61
1 files changed, 30 insertions, 31 deletions
diff --git a/dat.go b/dat.go
index d209338..822919d 100644
--- a/dat.go
+++ b/dat.go
@@ -11,64 +11,63 @@ type Vertex struct {
X, Y, Z float64
}
-type Bezier []Vertex
+type Bezier [][]float64
-func ParseVertex(s string) (v Vertex) {
- ss := strings.Split(s, ",")
- if len(ss) != 3 {
- return
+func parseVertex(s string) []float64 {
+ f := strings.Split(s, ",")
+ p := make([]float64, len(f))
+ for i, v := range f {
+ p[i], _ = strconv.ParseFloat(v, 64)
}
- v.X, _ = strconv.ParseFloat(ss[0], 64)
- v.Y, _ = strconv.ParseFloat(ss[1], 64)
- v.Z, _ = strconv.ParseFloat(ss[2], 64)
- return
+ return p
}
-func ParsePatch(s string) (p []int) {
+func parsePatch(s string) []int {
f := strings.Split(s, ",")
- for _, v := range f {
- i, _ := strconv.ParseInt(v, 10, 64)
- p = append(p, int(i-1))
+ p := make([]int, len(f))
+ for i, v := range f {
+ x, _ := strconv.ParseInt(v, 10, 64)
+ p[i] = int(x - 1)
}
- return
+ return p
}
-func Parse(r io.Reader) (b []Bezier) {
+func Parse(r io.Reader) [][][]float64 {
scan := bufio.NewScanner(r)
if !scan.Scan() {
- return
+ return nil
}
n, _ := strconv.Atoi(scan.Text())
- p := make([][]int, n)
- for i := 0; i < n; i++ {
+ patches := make([][]int, n)
+ for i := range patches {
if !scan.Scan() {
- return
+ return nil
}
- p[i] = ParsePatch(scan.Text())
+ patches[i] = parsePatch(scan.Text())
}
if !scan.Scan() {
- return
+ return nil
}
m, _ := strconv.Atoi(scan.Text())
- v := make([]Vertex, m)
- for i := 0; i < m; i++ {
+ vertices := make([][]float64, m)
+ for i := range vertices {
if !scan.Scan() {
- return
+ return nil
}
- v[i] = ParseVertex(scan.Text())
+ vertices[i] = parseVertex(scan.Text())
}
- b = make([]Bezier, n)
- for i, patch := range p {
- b[i] = make([]Vertex, n)
- for j, x := range patch {
- b[i][j] = v[x]
+ bezier := make([][][]float64, n)
+ for u, p := range patches {
+ bezier[u] = make([][]float64, len(p))
+ for v, i := range p {
+ bezier[u][v] = vertices[i]
}
}
- return
+ return bezier
}