0.0.16 quadraticCurveTo, transform
This commit is contained in:
parent
95471f36a7
commit
40dfcfcde1
2 changed files with 68 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
|||
version = "0.0.15"
|
||||
version = "0.0.16"
|
||||
author = "Andre von Houck and Ryan Oldenburg"
|
||||
description = "Full-featured 2d graphics library for Nim."
|
||||
license = "MIT"
|
||||
|
|
|
@ -188,6 +188,60 @@ proc `$`*(path: Path): string =
|
|||
if i != path.commands.len - 1 or j != command.numbers.len - 1:
|
||||
result.add " "
|
||||
|
||||
proc transform*(path: Path, mat: Mat3) =
|
||||
for command in path.commands.mitems:
|
||||
case command.kind:
|
||||
of Close:
|
||||
discard
|
||||
of Move, Line, RMove, RLine, TQuad, RTQuad:
|
||||
var pos = vec2(command.numbers[0], command.numbers[1])
|
||||
pos = mat * pos
|
||||
command.numbers[0] = pos.x
|
||||
command.numbers[1] = pos.y
|
||||
of HLine, RHLine:
|
||||
var pos = vec2(command.numbers[0], 0)
|
||||
pos = mat * pos
|
||||
command.numbers[0] = pos.x
|
||||
of VLine, RVLine:
|
||||
var pos = vec2(0, command.numbers[0])
|
||||
pos = mat * pos
|
||||
command.numbers[0] = pos.y
|
||||
of Cubic, RCubic:
|
||||
var
|
||||
ctrl1 = vec2(command.numbers[0], command.numbers[1])
|
||||
ctrl2 = vec2(command.numbers[2], command.numbers[3])
|
||||
to = vec2(command.numbers[4], command.numbers[5])
|
||||
ctrl1 = mat * ctrl1
|
||||
ctrl2 = mat * ctrl2
|
||||
to = mat * to
|
||||
command.numbers[0] = ctrl1.x
|
||||
command.numbers[1] = ctrl1.y
|
||||
command.numbers[2] = ctrl2.x
|
||||
command.numbers[3] = ctrl2.y
|
||||
command.numbers[4] = to.x
|
||||
command.numbers[5] = to.y
|
||||
of SCubic, RSCubic, Quad, RQuad:
|
||||
var
|
||||
ctrl = vec2(command.numbers[0], command.numbers[1])
|
||||
to = vec2(command.numbers[2], command.numbers[3])
|
||||
ctrl = mat * ctrl
|
||||
to = mat * to
|
||||
command.numbers[0] = ctrl.x
|
||||
command.numbers[1] = ctrl.y
|
||||
command.numbers[2] = to.x
|
||||
command.numbers[3] = to.y
|
||||
of Arc, RArc:
|
||||
var
|
||||
radii = vec2(command.numbers[0], command.numbers[1])
|
||||
to = vec2(command.numbers[5], command.numbers[6])
|
||||
# Extract the scale from the matrix and only apply that to the radii
|
||||
radii = scale(vec2(mat[0, 0], mat[1, 1])) * radii
|
||||
to = mat * to
|
||||
command.numbers[0] = radii.x
|
||||
command.numbers[1] = radii.y
|
||||
command.numbers[5] = to.x
|
||||
command.numbers[6] = to.y
|
||||
|
||||
proc commandsToPolygons*(commands: seq[PathCommand]): seq[seq[Vec2]] =
|
||||
## Converts SVG-like commands to simpler polygon
|
||||
|
||||
|
@ -855,9 +909,19 @@ proc bezierCurveTo*(path: Path, x1, y1, x2, y2, x3, y3: float32) =
|
|||
x1, y1, x2, y2, x3, y3
|
||||
]))
|
||||
|
||||
proc quadraticCurveTo*(path: Path) =
|
||||
## Adds a quadratic Bézier curve to the current path.
|
||||
raise newException(ValueError, "not implemented")
|
||||
proc quadraticCurveTo*(path: var Path, x1, y1, x2, y2: float32) =
|
||||
## Adds a quadratic Bézier curve to the path. This requires 2 points.
|
||||
## The first point is the control point and the second is the end point.
|
||||
## The starting point is the last point in the current path, which can be
|
||||
## changed using moveTo() before creating the curve.
|
||||
path.commands.add(PathCommand(
|
||||
kind: Quad,
|
||||
numbers: @[x1, y1, x2, y2]
|
||||
))
|
||||
path.at = vec2(x2, y2)
|
||||
|
||||
proc quadraticCurveTo*(path: var Path, ctrl, to: Vec2) {.inline.} =
|
||||
path.quadraticCurveTo(ctrl.x, ctrl.y, to.x, to.y)
|
||||
|
||||
proc arc*(path: Path) =
|
||||
## Adds an arc to the path which is centered at (x, y) position with radius r starting at startAngle and ending at endAngle going in the given direction by anticlockwise (defaulting to clockwise).
|
||||
|
|
Loading…
Reference in a new issue