From 79bf4f6b5f4528491fa46b9a5f8a1565aad93ef6 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Thu, 25 Jan 2018 16:24:32 +0100 Subject: [PATCH] arc function implemented --- paths.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/paths.go b/paths.go index 11276d9..8cac1d4 100644 --- a/paths.go +++ b/paths.go @@ -1,8 +1,10 @@ package canvas import ( + "math" "unsafe" + "github.com/barnex/fmath" "github.com/tfriedel6/lm" ) @@ -21,6 +23,30 @@ func (cv *Canvas) LineTo(x, y float32) { cv.path = append(cv.path, pathPoint{pos: lm.Vec2{x, y}, move: false}) } +func (cv *Canvas) Arc(x, y, radius, startAngle, endAngle float32, anticlockwise bool) { + step := 6 / radius + startAngle = fmath.Mod(startAngle, math.Pi*2) + if startAngle < 0 { + startAngle += math.Pi * 2 + } + endAngle = fmath.Mod(endAngle, math.Pi*2) + if endAngle < 0 { + endAngle += math.Pi * 2 + } + if !anticlockwise && endAngle <= startAngle { + endAngle += math.Pi * 2 + } else if anticlockwise && startAngle <= endAngle { + startAngle += math.Pi * 2 + startAngle, endAngle = endAngle, startAngle + } + for a := startAngle; a < endAngle; a += step { + s, c := fmath.Sincos(a) + cv.LineTo(x+radius*c, y+radius*s) + } + s, c := fmath.Sincos(endAngle) + cv.LineTo(x+radius*c, y+radius*s) +} + func (cv *Canvas) ClosePath() { if len(cv.path) == 0 { return