summaryrefslogtreecommitdiff
path: root/bezier.go
blob: 42e4185121e6f656eea7c9fc3630736fc216effa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main

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 newVector(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, newVector(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)
	return mat64.Inner(U, m2, V)
}

func (p Patch) Calc(u, v float64) (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
}