From 7be3a4383c91a9ea4841fa4588556ebca7442fa0 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Wed, 4 Apr 2018 15:53:26 +0200 Subject: [PATCH] paths with sub-paths fixed --- paths.go | 35 ++++++++++++++++++++++++++--------- triangulation.go | 16 ++++++++-------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/paths.go b/paths.go index c956f99..1e48ec2 100644 --- a/paths.go +++ b/paths.go @@ -231,9 +231,16 @@ func (cv *Canvas) ClosePath() { if isSamePoint(cv.linePath[len(cv.linePath)-1].tf, cv.linePath[0].tf, 0.1) { return } - cv.LineTo(cv.linePath[0].pos[0], cv.linePath[0].pos[1]) - cv.linePath[len(cv.linePath)-1].next = cv.linePath[0].tf - cv.polyPath[len(cv.polyPath)-1].next = cv.polyPath[0].tf + closeIdx := 0 + for i := len(cv.linePath) - 1; i >= 0; i-- { + if cv.linePath[i].move { + closeIdx = i + break + } + } + cv.LineTo(cv.linePath[closeIdx].pos[0], cv.linePath[closeIdx].pos[1]) + cv.linePath[len(cv.linePath)-1].next = cv.linePath[closeIdx].tf + cv.polyPath[len(cv.polyPath)-1].next = cv.polyPath[closeIdx].tf } func (cv *Canvas) Stroke() { @@ -424,14 +431,24 @@ func lineIntersection(a0, a1, b0, b1 vec) (vec, float64, float64) { } func (cv *Canvas) Fill() { - lastMove := 0 - for i, p := range cv.polyPath { - if p.move { - lastMove = i - } + if len(cv.polyPath) < 3 { + return } + cv.activate() + start := 0 + for i, p := range cv.polyPath { + if !p.move { + continue + } + if i >= start+3 { + cv.fillPoly(start, i) + } + start = i + } +} - path := cv.polyPath[lastMove:] +func (cv *Canvas) fillPoly(from, to int) { + path := cv.polyPath[from:to] if len(path) < 3 { return } diff --git a/triangulation.go b/triangulation.go index a1fc2be..ad3c20f 100644 --- a/triangulation.go +++ b/triangulation.go @@ -113,17 +113,17 @@ func (cv *Canvas) cutIntersections(path []pathPoint) []pathPoint { var cutBuf [50]cut cuts := cutBuf[:0] - for i := 0; i < len(cv.polyPath); i++ { - ip := (i + len(cv.polyPath) - 1) % len(cv.polyPath) - a0 := cv.polyPath[ip].pos - a1 := cv.polyPath[i].pos - for j := i + 1; j < len(cv.polyPath); j++ { - jp := (j + len(cv.polyPath) - 1) % len(cv.polyPath) + for i := 0; i < len(path); i++ { + ip := (i + len(path) - 1) % len(path) + a0 := path[ip].pos + a1 := path[i].pos + for j := i + 1; j < len(path); j++ { + jp := (j + len(path) - 1) % len(path) if ip == j || jp == i { continue } - b0 := cv.polyPath[jp].pos - b1 := cv.polyPath[j].pos + b0 := path[jp].pos + b1 := path[j].pos p, r1, r2 := lineIntersection(a0, a1, b0, b1) if r1 <= 0 || r1 >= 1 || r2 <= 0 || r2 >= 1 { continue