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"
|
author = "Andre von Houck and Ryan Oldenburg"
|
||||||
description = "Full-featured 2d graphics library for Nim."
|
description = "Full-featured 2d graphics library for Nim."
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
|
@ -188,6 +188,60 @@ proc `$`*(path: Path): string =
|
||||||
if i != path.commands.len - 1 or j != command.numbers.len - 1:
|
if i != path.commands.len - 1 or j != command.numbers.len - 1:
|
||||||
result.add " "
|
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]] =
|
proc commandsToPolygons*(commands: seq[PathCommand]): seq[seq[Vec2]] =
|
||||||
## Converts SVG-like commands to simpler polygon
|
## 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
|
x1, y1, x2, y2, x3, y3
|
||||||
]))
|
]))
|
||||||
|
|
||||||
proc quadraticCurveTo*(path: Path) =
|
proc quadraticCurveTo*(path: var Path, x1, y1, x2, y2: float32) =
|
||||||
## Adds a quadratic Bézier curve to the current path.
|
## Adds a quadratic Bézier curve to the path. This requires 2 points.
|
||||||
raise newException(ValueError, "not implemented")
|
## 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) =
|
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).
|
## 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