Code - R8

Nature of Code 之 8 - Fractals. Koch Curve – KochLine O_o

package kochline

import "ch8/sb"

// KochLine : struct of koch curve
type KochLine struct {
	Start sb.Vec2
	End   sb.Vec2
}

// NewKochLine : create a new kochline
func NewKochLine(a, b sb.Vec2) KochLine {
	return KochLine{a, b}
}

/* koch line
              c
              /\
             /  \
            /    \
	a------b      d------e
*/

// KochA :
func (kl KochLine) KochA() sb.Vec2 {
	return kl.Start
}

// KochB :
func (kl KochLine) KochB() sb.Vec2 {
	v := kl.End.Sub(kl.Start)
	v = v.DivScalar(3)
	v = v.Add(kl.Start)
	return v
}

// KochC :
func (kl KochLine) KochC() sb.Vec2 {
	a := kl.Start.Clone()
	v := kl.End.Sub(kl.Start)
	v = v.DivScalar(3)
	a = a.Add(v)
	v = v.Rotate(-60)
	a = a.Add(v)
	return a
}

// KochD :
func (kl KochLine) KochD() sb.Vec2 {
	v := kl.End.Sub(kl.Start)
	v = v.MulScalar(2 / 3.0)
	v = v.Add(kl.Start)
	return v
}

// KochE :
func (kl KochLine) KochE() sb.Vec2 {
	return kl.End
}

// KochLines : group of kochline
type KochLines struct {
	Klines []KochLine
}

// NewKochLines :
func NewKochLines(x, y sb.Vec2) *KochLines {
	kc := NewKochLine(x, y)
	kl := make([]KochLine, 0)
	kl = append(kl, kc)
	return &KochLines{kl}
}

// Generate :
func (kls *KochLines) Generate() {
	next := make([]KochLine, 0)
	for _, kl := range kls.Klines {
		a := kl.KochA()
		b := kl.KochB()
		c := kl.KochC()
		d := kl.KochD()
		e := kl.KochE()
		next = append(next, NewKochLine(a, b))
		next = append(next, NewKochLine(b, c))
		next = append(next, NewKochLine(c, d))
		next = append(next, NewKochLine(d, e))
	}
	kls.Klines = next[:]
}

完整的在這裏


See also