From d1ff94a3b59b5642c549b1141853e0ffbe842185 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 28 Mar 2023 16:57:18 +0200 Subject: [PATCH] A bit more polygon docs --- docs/src/general/changelog.md | 5 ++- library/src/visualize/mod.rs | 4 +-- library/src/visualize/polygon.rs | 30 ++++++++++++------ tests/ref/visualize/polygon.png | Bin 7577 -> 1957 bytes tests/typ/visualize/polygon.typ | 51 ++++++++++++++++--------------- 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/docs/src/general/changelog.md b/docs/src/general/changelog.md index 45de2dd69..958c3e4a8 100644 --- a/docs/src/general/changelog.md +++ b/docs/src/general/changelog.md @@ -6,7 +6,10 @@ description: | # Changelog ## Unreleased -- Reduced maximum function call depth from 256 to 64. +- Added [`polygon`]($func/polygon) function +- Reduced maximum function call depth from 256 to 64 +- CLI now returns with non-zero status code if there is an error +- CLI now watches the root directory instead of the current one ## March 28, 2023 - **Breaking:** Enumerations now require a space after their marker, that is, diff --git a/library/src/visualize/mod.rs b/library/src/visualize/mod.rs index 198c707d5..06eec23da 100644 --- a/library/src/visualize/mod.rs +++ b/library/src/visualize/mod.rs @@ -2,10 +2,10 @@ mod image; mod line; -mod shape; mod polygon; +mod shape; pub use self::image::*; pub use self::line::*; +pub use self::polygon::*; pub use self::shape::*; -pub use self::polygon::*; \ No newline at end of file diff --git a/library/src/visualize/polygon.rs b/library/src/visualize/polygon.rs index 40058834a..07725b722 100644 --- a/library/src/visualize/polygon.rs +++ b/library/src/visualize/polygon.rs @@ -1,10 +1,19 @@ use crate::prelude::*; -/// A closed-path polygon. +/// A closed polygon. +/// +/// The polygon is defined by its corner points and is closed automatically. /// /// ## Example /// ```example -/// #polygon(fill: blue, (0pt, 0pt), (10pt, 0pt), (10pt, 10pt)) +/// #polygon( +/// fill: red, +/// stroke: 2pt + black, +/// (0pt, 0pt), +/// (50%, 0pt), +/// (50%, 4cm), +/// (20%, 4cm), +/// ) /// ``` /// /// Display: Polygon @@ -13,6 +22,9 @@ use crate::prelude::*; pub struct PolygonElem { /// How to fill the polygon. See the /// [rectangle's documentation]($func/rect.fill) for more details. + /// + /// Currently all polygons are filled according to the + /// [non-zero winding rule](https://en.wikipedia.org/wiki/Nonzero-rule). pub fill: Option, /// How to stroke the polygon. See the [lines's @@ -21,7 +33,8 @@ pub struct PolygonElem { #[fold] pub stroke: Option, - /// The vertices of the polygon. The polygon automatically closes itself. + /// The vertices of the polygon. Each point is specified as an array of two + /// [relative lengths]($type/relative-length). #[variadic] pub vertices: Vec>>, } @@ -45,20 +58,19 @@ impl Layout for PolygonElem { .collect(); let size = points.iter().fold(Point::zero(), |max, c| c.max(max)).to_size(); - let target = regions.expand.select(regions.size, size); let mut frame = Frame::new(target); - // only create a path if there is more than zero points. + // Only create a path if there are more than zero points. if points.len() > 0 { - let stroke = self.stroke(styles).map(|e| e.unwrap_or_default()); let fill = self.fill(styles); + let stroke = self.stroke(styles).map(PartialStroke::unwrap_or_default); - // construct a closed path given all points. + // Construct a closed path given all points. let mut path = Path::new(); path.move_to(points[0]); - for point in &points[1..] { - path.line_to(*point); + for &point in &points[1..] { + path.line_to(point); } path.close_path(); diff --git a/tests/ref/visualize/polygon.png b/tests/ref/visualize/polygon.png index d2a86a53ba7fd9a51d7a038e287dd341515fcffc..2ffd7f8a1ecdbecae011f4e10f37af83f14db5b4 100644 GIT binary patch literal 1957 zcmZ`)c{tST9{(8{>&&3WKE~Q0qJwfRkt9pz+G1pz;*=W9l)^E_5~YqPb&e$>bk0*@ zj3tCJW6wHBjKR#9W8X%^gt&9gJ@h@*p@ zyFf<+fY7*@umI`VJ}5LVSEY9*@Ujv4Mesz)c1a)(u>K@9OFb1W*9)BEU7%#>NJ4{ngsq8gNVjPQ@4* z85tTH8W4ruK-)mqIC6!`YV5s%9IIOvEwgoq>v z34?n8QB^RO`X`i9F#5lMueBS|&jT3}!2vTg#m->b(mC?(wXRrM&(>Px2fsB7k7Y>?Tk>PUDWh<)ey0u=Vy2?@F*}1Fa z8I}KuK$ON@v3Bngwk%FBy7vpwY(Ynl>F2rPT;^M;x5@t{!mQ|SX;<0tX(g!1vfi2V z76DzRD#HOD=ULJ2>71qFuK{ko-;mP^eJ68gf4+uq(Wxc8SFTY1t-e9M%b<~^y&CQm ztE9%n7ln_lOh0u83#!ipl+u2Yhr zrt(rtlpsHF9FUDpRtih2AL?j@wg zCKPobkAIhYqXV@mh0@OB-{D@v8*ECT;CcLH?snv*B^mSrVG5R>t6W=g!t84EeM7Tw zd`3q;`vn9Q$40X=1SxzWiHdXTwFLeyHcRsXj`|+^7Du(S9Z9$!OcpxmAt;!w-w@EXk!=1UB%FSURvBAc5$DG%DMlVxNf^oIH0jj2kGHu(e z)V~=8f;|icEqYKQeXhw1|F;ndQM()5TuJfh$NQ-)el)lBiGfww$!{OpbDP>Z4^-u^ z#@t%Bki-x9JuxVoY4f&eU-$BV2O}v2MR(VF7;HF9Zj#2KR@t=$Hruu^wrG#v+0(vj zNx%0zDJ1eGYu;|h&fV~19kk-n?iQAh><=XEC2q~%JieiOYdmPpbIy37b9SwQK07=h znV3(vU*N+Xj#R(us@QmC>-$n4N7kr*)>S>48~VY0`ofQQjh*3(*S-%2OKjIm%**6p zB77(-E$m|3hJTPRM#dX!ff-0YLV=go?X^DEE)9wJAU6u~`dZ%ops^*VTVYheD>UA% zOSUhrSnUe7#M-M_add{5BiTodWZ9)@v2Cirdr)kJyR&K5DAO?%G*F$H^FxHsl)77| z?87!cIUlhJPgd>Zh;6k5?abQPEK$*kse|_$3>;1(iOr&Apt z9T>7o@cD~byh3_D=k;H_%WEyA@A5YAU)rD3p-xts+vE5V$>k~2fWg4PohAE1e=2A5 zdR*1~Xs@ls{6cCvWgx)i5?=kEk>5m(e57M{{_ExSv1FiIp0tmu```iHM{nnCb#^mxY`;?N>58p1>@xEKMnWimfLSWf;)V| zKC{i@ku3_UXtdAWhNL@3IUie9MN)iY@(YstnJsd}rz?XIJVm0kW#L4QdqHgqmC-^t z--|_YinkO~Zhg^ki8A!Qa&cy-qwRIj-mZzYcooa~s5ip9JgVcO{MJKQcf%G5l1U3+ zL5^fbksvk18#njsDjF9}M!#&g4S(ado7Xe2IosRYCAl4!a0q`>3^_d9&p^a{ajuBw zG(0hQ<F3~-7T;|ye<{#3J9YVYkE;ET!!>Jv6d3pC zRnqD>>rLt*EbJca^d{smVb{YXyVa5DIrpM0#7M>rXQXI0esZ!qFFVju3^6R~p^I5s tR5-;$OF;kgza)s#;za-4DKOQ2VWkD?1F5FIZoviv9M7Qb$hO$q{{ry8nuh=Y literal 7577 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 diff --git a/tests/typ/visualize/polygon.typ b/tests/typ/visualize/polygon.typ index defd89be5..9f40d7fd2 100644 --- a/tests/typ/visualize/polygon.typ +++ b/tests/typ/visualize/polygon.typ @@ -1,31 +1,32 @@ // Test polygons. --- -#set page(height: 220pt, width: 50pt) -#box({ - set polygon(stroke: 0.75pt, fill: blue) - polygon((0em, 0pt)) - // this should not give an error - polygon() - polygon((0pt, 0pt), (10pt, 0pt)) - polygon((5pt, 0pt), (0pt, 10pt), (10pt, 10pt)) - polygon( - (0pt, 0pt), (5pt, 5pt), (10pt, 0pt), - (15pt, 5pt), - (5pt, 10pt) - ) - polygon(stroke: none, (5pt, 0pt), (0pt, 10pt), (10pt, 10pt)) - polygon(stroke: 3pt, fill: none, (5pt, 0pt), (0pt, 10pt), (10pt, 10pt)) - // relative size - polygon((0pt, 0pt), (100%, 5pt), (50%, 10pt)) - // antiparallelogram - polygon((0pt, 5pt), (5pt, 0pt), (0pt, 10pt), (5pt, 15pt)) - // self-intersections - polygon((0pt, 10pt), (30pt, 20pt), (0pt, 30pt), (20pt, 0pt), (20pt, 35pt)) -}) +#set page(width: 50pt) +#set polygon(stroke: 0.75pt, fill: blue) + +// These are not visible, but should also not give an error +#polygon() +#polygon((0em, 0pt)) +#polygon((0pt, 0pt), (10pt, 0pt)) + +#polygon((5pt, 0pt), (0pt, 10pt), (10pt, 10pt)) +#polygon( + (0pt, 0pt), (5pt, 5pt), (10pt, 0pt), + (15pt, 5pt), + (5pt, 10pt) +) +#polygon(stroke: none, (5pt, 0pt), (0pt, 10pt), (10pt, 10pt)) +#polygon(stroke: 3pt, fill: none, (5pt, 0pt), (0pt, 10pt), (10pt, 10pt)) + +// Relative size +#polygon((0pt, 0pt), (100%, 5pt), (50%, 10pt)) + +// Antiparallelogram +#polygon((0pt, 5pt), (5pt, 0pt), (0pt, 10pt), (5pt, 15pt)) + +// Self-intersections +#polygon((0pt, 10pt), (30pt, 20pt), (0pt, 30pt), (20pt, 0pt), (20pt, 35pt)) --- -// Test errors. - // Error: 10-17 point array must contain exactly two entries -#polygon((50pt,)) \ No newline at end of file +#polygon((50pt,))