From f44cba266183d309e81352a682b378f443f2f1c6 Mon Sep 17 00:00:00 2001 From: Johannes Wolf Date: Sun, 22 Oct 2023 19:36:00 +0200 Subject: [PATCH] shapes: Add arc-through Thanks to Matthew Brown for the implementation. --- src/draw.typ | 2 +- src/draw/shapes.typ | 46 +++++++++++++++++++++++ src/util.typ | 7 ++-- tests/arc/arc-through/ref.png | Bin 0 -> 139218 bytes tests/arc/arc-through/test.typ | 65 +++++++++++++++++++++++++++++++++ tests/arc/ref.png | Bin 236987 -> 241687 bytes tests/arc/test.typ | 8 ++++ 7 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 tests/arc/arc-through/ref.png create mode 100644 tests/arc/arc-through/test.typ diff --git a/src/draw.typ b/src/draw.typ index 1e46b9af9..64d367616 100644 --- a/src/draw.typ +++ b/src/draw.typ @@ -1,4 +1,4 @@ #import "draw/grouping.typ": intersections, group, anchor, copy-anchors, place-anchors, set-ctx, get-ctx, for-each-anchor, on-layer, place-marks #import "draw/transformations.typ": set-transform, rotate, translate, scale, set-origin, move-to, set-viewport #import "draw/styling.typ": set-style, fill, stroke -#import "draw/shapes.typ": circle, circle-through, arc, mark, line, grid, content, rect, bezier, bezier-through, catmull, hobby, merge-path, shadow +#import "draw/shapes.typ": circle, circle-through, arc, arc-through, mark, line, grid, content, rect, bezier, bezier-through, catmull, hobby, merge-path, shadow diff --git a/src/draw/shapes.typ b/src/draw/shapes.typ index e88bf9491..8a55c2f2f 100644 --- a/src/draw/shapes.typ +++ b/src/draw/shapes.typ @@ -304,6 +304,52 @@ },) } +#let arc-through( + a, + b, + c, + name: none, + ..style, +) = get-ctx(ctx => { + let (ctx, a) = coordinate.resolve(ctx, a) + let (ctx, b) = coordinate.resolve(ctx, b) + let (ctx, c) = coordinate.resolve(ctx, c) + assert(a.at(2) == b.at(2) and b.at(2) == c.at(2), + message: "The z coordinate of all points must be equal, but is: " + repr((a, b, c).map(v => v.at(2)))) + + let center = util.calculate-circle-center-3pt(a, b, c) + let radius = vector.dist(center, a) + let start = { + let (x, y, ..) = vector.sub(a, center) + calc.atan2(x, y) // Typst's atan2 is (x,y) order! + } + let delta = vector.angle(a, center, c) + + let side-on-line(a, b, pt) = { + let (x1, y1, ..) = a + let (x2, y2, ..) = b + let (x, y, ..) = pt + return (x - x1) * (y2 - y1) - (y - y1) * (x2 - x1) + } + + let center-is-left = side-on-line(a, c, center) < 0 + let b-is-left = side-on-line(a, c, b) < 0 + + // If the center and point b are on the same side of a-c, + // the arcs delta must be > 180deg + if center-is-left == b-is-left { + delta = 360deg - delta + } + + // If b is left of a-c, swap a-c to c-a by using a negative delta + if b-is-left { + delta *= -1 + } + + return arc(a, start: start, delta: delta, radius: radius, + anchor: "arc-start", name: name, ..style) +}) + #let mark(from, to, ..style) = { assert.eq( style.pos(), diff --git a/src/util.typ b/src/util.typ index 463dbe0bb..fed80e9c4 100644 --- a/src/util.typ +++ b/src/util.typ @@ -89,7 +89,8 @@ return (calc.cos(angle) * rx + x, calc.sin(angle) * ry + y, z) } -/// Calculate circle center from 3 points +/// Calculate circle center from 3 points. The z coordinate +/// is taken from point a. /// /// - a (vector): Point 1 /// - b (vector): Point 2 @@ -129,11 +130,11 @@ } let x = (d - c)/(a - b) let y = a * x + c - return (x, y, 0) + return (x, y) } assert(args.len() == 4, message: "Could not find circle center") - return line-intersection-2d(..args) + return vector.as-vec(line-intersection-2d(..args), init: (0, 0, a.at(2))) } #let resolve-number(ctx, num) = { diff --git a/tests/arc/arc-through/ref.png b/tests/arc/arc-through/ref.png new file mode 100644 index 0000000000000000000000000000000000000000..b851a1935be536da748d63b38a627aea290876f2 GIT binary patch literal 139218 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�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

3tI0$@RWg@!1Ol-R7= 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 u+I1`{$oO@&5v$64Rjo literal 0 HcmV?d00001 diff --git a/tests/arc/arc-through/test.typ b/tests/arc/arc-through/test.typ new file mode 100644 index 000000000..2bc213166 --- /dev/null +++ b/tests/arc/arc-through/test.typ @@ -0,0 +1,65 @@ +#set page(width: auto, height: auto) +#import "/src/lib.typ": * + +#let show-points(..pts) = { + import draw: * + for pt in pts.pos() { + circle(pt, radius: .1) + } +} + +#let test(a, b, c) = { + import draw: * + group({ + anchor("center", (0,0,0)) + show-points(a, b, c) + arc-through(a, b, c) + }, name: "g", anchor: "west", padding: .1) + set-origin("g.east") +} + +#box(stroke: 2pt + red, canvas(length: 1cm, { + import draw: * + + test((0,0), (1, 1), (2, 0)) + test((0,0), (1,-1), (2, 0)) + test((0,1), (1, 0), (0,-1)) + test((0,1), (-1,0), (0,-1)) +})) + +#box(stroke: 2pt + red, canvas(length: 1cm, { + import draw: * + + for a in range(36, 360 + 36, step: 36) { + let a = a * 1deg + test((1,0), + (calc.cos(a / 2), calc.sin(a / 2)), + (calc.cos(a), calc.sin(a))) + } +})) + +#box(stroke: 2pt + red, canvas(length: 1cm, { + import draw: * + + for d in range(0, 8 + 1) { + let d = (d - 2) / 5 + test((0,0), (1,d), (2,.5)) + } +})) + +#box(stroke: 2pt + red, canvas(length: 1cm, { + import draw: * + + // The style radius must not influence the + // arc radius! + set-style(radius: 5) + set-style(arc: (radius: 5)) + test((0,0), (1, 1), (2, 0)) +})) + +#box(stroke: 2pt + red, canvas(length: 1cm, { + import draw: * + + arc-through((0,0), (1,1), (2,0)) + arc-through((0,0,1), (1,1,1), (2,0,1), stroke: blue) +})) diff --git a/tests/arc/ref.png b/tests/arc/ref.png index ee641d84b29477ce3998b033a7762939a090ae4f..d206565e28fa5373b3472445c2590151414e394a 100644 GIT binary patch delta 3777 zcmeH~eNZi$3p2?z0fc4{uiUC zX`^Qw^MY1u&9F|#F*V|gOFy&R0h3rC8kS7<^;j7fwLJRQjC)Y#{^9Kd_UHy%s?3A0 z@ZX8oxIk@cU3)$!r;_|o5dGBO$L*dWee*$2$loRIB45>|9s=GcpGGPI8wt6#GkM9% zh1?vTU7IP99nd*D@Z+jF&H=+OF+Lt1E<4O0g^FtjH}*z7R~*^9&jdHKyv2r4c!O>H zs?jiorGG>&fU)@pd_&ni#lSMdR8JYDJzW5@>NzFz@wE5(6RV%)1zB^jDTFh5lRVIl zSDPv=!1qU~Ck4X){wTM?afY0yD}5&FX~+mz3;2`Pf}D}X>=jhv5hI@)h+t$OXYq-tbxnAZ| z@w)hMB#m5%h0d;Qi<{Aimxnm|e$tAR!&s_1l+qyeU#kYSHPHo;TKMi;ZIjOqpA%Fk zD9|*;c#o*IyphZ<{y;JiIgKEr8qoK=zUL9UHsg}rC;+N-KwwohcOJO|r!w@@8KPJ; z11%qCTSw|k9a#|m=O;?voi+09JkviT7m{w77v0G!@ehcl$7zYk+Clj{cUwSDHWGA| z5Bjv63wFINurWi?><~`56{MNGEn9w|#DQRR%eJW&F zW1D=un|;jXpEdh!C3G-UoC=fHR;n(&(^NCV44X;W}<1oSQEG^%tdg&;TC{E>0Kc?Fv6!QJncq4jTQuoW5zvG_E^s@kP~T zx95i~k|wD~+*X;dxqGgru0xzNHh+Vy+WughR1UM)*?SROsG{&SvOn_4yG1fzaaLC$ z+05sDVhFK`AA|L44VEb4(2Mb+$lt`jRRJ65#!cT_a)EMbfc?_tJhHbUk#Jw;^;Y** zU3?A4lqZls))ouwLv7CcY3xAB6Q?tMcX- zi$F&|Upy*mbBZEkYGMzao>wyQ{hEXDOF#?fEx#3r2O5}@qZwmpZFye-Y4}iE1tc~Z~+rk=Y zL}HCH9}0+R1x}Nz>2lI;5qthn*S>_Raa76)^E!CabHhT>LU#nTC60Y`Tf zz6X&pC{b_1DJD{;iEjYh4Osw|MS5l{ZQAxDxvoRGRkWxnc5UgnHo?*~H>|dp20oq8 zyYE~+jix&Gje3NJIx3#^vM+j_K{01ASq)E2OPwHXfC?D{TlDU#E4N~kSH2(DL$ z-comhwX;piG|+<(`)tmAwvUH~N@xHJ$f<(h9ja?!V3@Y7xb9M+0KZj`s94X8 zM0|Il)qS4bDIgzJOjJ$2$PG0s(0t=ll)}E`c9F4P6rf?IbJp1DP9+1!b%1Df$)&6L z@Kkk_0QjT*WnI&2i+g{|(WHD}|97LN2p zYpwfTk**Xtbd6)qM-Hwfmjk1&;X3^f%*qRb1)ti(2B{i}a zd|<`Uo~D?}h*Hkb!HQFkl2LsIzQ7indW`6)cyPVHFG2;HgW4(qPa zAIp6!vd_Xc-d&x*xh5StMjm`y{*S2o^dDG9{KKc(D C)!oqm delta 69 zcmbRKfN%G1z6s)d(>d4}7#P|;{{}KJ&uwZ{ZB=D#Rb|?$%DiCe<_~PD%$pUMce9B7 Z=g9PTK76UL^aM~bgQu&X%Q~loCIB%I7iIte diff --git a/tests/arc/test.typ b/tests/arc/test.typ index eb9563fa6..8e37c685d 100644 --- a/tests/arc/test.typ +++ b/tests/arc/test.typ @@ -34,3 +34,11 @@ content((rel: (0, .5), to: "c." + a), [#a], frame: "rect", fill: white, stroke: none) }) })) + + +#box(stroke: 2pt + red, canvas(length: 1cm, { + import draw: * + + arc((0,0), start: 45deg, delta: 90deg) + arc((0,0,1), start: 45deg, delta: 90deg, stroke: blue) +}))