From 41ceec5955e198ba71fb94bdfd0b6702347c67b7 Mon Sep 17 00:00:00 2001
From: Henrik Tidefelt Predicates are simple functions that test certain conditions. The bindings that are related to True if the argument is the empty Predicates are simple functions that test certain conditions. This section contains simple functions that are essential for the creation of values of certain types. True if the argument is the empty Predicates are simple functions that test certain conditions. These are the functions! After all, True if the argument is the empty Predicates are simple functions that test certain conditions. States stem from hot values. The system provides a few, all of which are important because the efficiency enhancements they bring. What you find here is basically just a bunch of links to where the corresponding state types are described. True if the argument is the empty Predicates are simple functions that test certain conditions. Standard stream objects, null objects, mathematical constants, and more… True if the argument is the empty Predicates are simple functions that test certain conditions. True if the argument is the empty Predicates are simple functions that test certain conditions. These bindings give access to many named constants that either serve as special tokens in certain situations, or simply deserve a binding due to their common use or special meaning. True if the argument is the empty Predicates are simple functions that test certain conditions. True if the argument is the empty At the time of writing, only a few types are directly accessible to the user; while other types are hidden, knowledge of them will still help understanding the language. When, a binding exist, it will have the same identifier as is used to refer to the type abstractly in the documentation. Types in the list below are represented with a global binding: Predicates are simple functions that test certain conditions. True if the argument is the empty Predicates are simple functions that test certain conditions. True if the argument is the empty The bindings in this section provide a way of controlling the behavior in error situations; a function may call a dynamically bound function bound function when an error is detected instead of returning with a nonsense result. To be called when the intersection between two paths cannot be found. Shall take the two Predicates are simple functions that test certain conditions. Any dynamic variable not mentioned so far goes here. True if the argument is the empty Predicates are simple functions that test certain conditions. True if the argument is the empty Depending on the relative layout of blocks, a varying degree of manual effort is needed to get the connecting paths right. In this example, all paths but the feed-back path can be deduced automatically using Putting a label along the connection is easy. To make the source code readable, it is a good idea to bind the connection path to a variable, and then use this variable when placing the label. Special purpose functions are provided to ensure a consistent layout of labels; the user need only select a point on the path (preferably using Putting a label at a terminal point is similar to labeling a connection, the only difference is how the point to be labeled is selected. Note that for a Putting a label at a terminal point is similar to labeling a connection, the only difference is how the point to be labeled is selected. Note that for a This example also shows how to place signs at connection points, and how to indicate a point where a signal splits by a small dot. This is a comparatively simple figure, containing three different kinds of objects: blocks, connections and annotations along the connections. This example also follows the good habit to let preferences that might be shared by several figures be extracted into a separate file ("$(BASE)$(EXAMPLES)doc/blockdraw-tutorial-tut-prefs.shext">link). Functions that define arrowheads for use with Functions that define arrowheads for use with The language reflection of the core type system is incomplete, and the plan is to not develop it further. Instead, Anyway, the values that are currently found in this namespace are language reflections of types described in . For example, to check whether the value
-
- Example code No syntax highlighting of code elements.
+ Binding (a “variable”) or state
Binding (a “variable”) or state
Formal parameter
Filename
diff --git a/doc/parts/namespace-toc/index.sxml b/doc/parts/namespace-toc/index.sxml
index 875b8be2..70c6c907 100644
--- a/doc/parts/namespace-toc/index.sxml
+++ b/doc/parts/namespace-toc/index.sxml
@@ -28,6 +28,7 @@
+
diff --git a/doc/parts/namespace/Shapes-Data-Type.sxml b/doc/parts/namespace/Shapes-Data-Type.sxml
index 296f14d2..6c2454a0 100644
--- a/doc/parts/namespace/Shapes-Data-Type.sxml
+++ b/doc/parts/namespace/Shapes-Data-Type.sxml
@@ -37,6 +37,42 @@
Replacable dito
+ [typeof x] = ..Shapes..Data..Type..§Float
+
+
Only a few types are directly accessible to the user; while other types are hidden, knowledge of them will still help understanding the language. When, a binding exists, it will have the same identifier as is used to refer to the type abstractly in the documentation. Types in the list below are represented with a binding:
+It is not entirely clear at the moment how this namespace should be organized. Currently, there is not too much in here, but the plan is to equip
Constructs a list of the arguments.
+The value created when called with no arguments is recognized by
Converts a list to a structure, being the inverse of
+[unlist lst] )]]> ++is the identity for
+struct )]]]> ++is the identify for
Note how this function may be used to define a Scheme-like
+[unlist args] )]]> ++ +
True if the argument is the empty
Constructs a vector of the arguments.
+The value created when called with no arguments is recognized by
Constructs a cons pair. The arguments are not forced, which allows infinite data structures to be defined.
+Constructs a range of
See the
Constructs a range of
If
When both
Note on efficiency: The result is constructed in constant time and space, and is particularly efficient for left folds. Semantically, it is as if the whole range was stored element by element in a long list, but the kernel just stores the first element, the step, and the total number of elements. During a left fold, at two values in the range are stored in memory at the same time. A right fold, on the other hand, will require all elements to be constructed before they can be destructed again. Hence, when possible, right folds should be avoided in favor of left folds over a range constructed with elements in the reverse order.
+Constructs a range of
See the
Calling
Since a
+ ++and a span including all but the last two positions as +
+ ++ +
Note that a
Debugging utilities.
+Debugging utilities and source code reflection.
Didn't get the result you expected? Maybe it's time to set a break point or add some debug prints. This is where you find the tools.
+Mutates the value in order to associate it with the abstract syntax tree node of the argument passed to this function.
+Returns the source code string determined by the abstract syntax tree node associated with the argument. The value needs to be properly prepared using
When the timer is frozen, it returns the time in seconds since its creation.
+The escape continuations in
See for more information on escape continuations in general.
+Quit compiler.
The read-evaluate-print loop of the interactive mode.
Resume program after break during interactive debugging.
Described in . Only available in debug context in interactive mode.
There is no global
The geometric objects in
This section contains one dynamic variable, and a couple of functions which correspond directly to syntactic constructs. While most users should generally not use the functions directly, users interested in graphic design are strongly encouraged to get familiar with the dynamic variable.
+Default unit of unspecified radii of polar coordinates used in path construction. Typically, the unit is set to a special length rather than a fixed distance. See for details on special lengths.
+It is not possible to refer to directly to the value of
Implements
Implements
One of the arguments is allowed to be the special
Implements
Implements
Implements
Angle to the point from the origin, measured counter-clockwise from the positive
Analogous to the
Unit vector with given angle.
Scaling to unit length is closely related to computing the norm, compare
Construct transform from multiplier for x and y coordinates, followed by a shift.
Scaling to unit length. The argument must not have zero length.
Scaling to unit length. The argument must not have zero length.
Scaling to unit length. The argument must not have zero length.
Scaling to unit length. The argument must not have zero length.
Scaling to unit length, resulting in either plus or minus one. The argument must not be zero.
Scaling to unit length, resulting in either plus or minus one. The argument must not be zero.
Scaling to unit length, resulting in either plus or minus one. The argument must not be the zero length.
Produces vector which is orthogonal to the given one, by rotating
An empty
Construct path where the order of pathpoints in the representation is reversed. The constructed path looks identical to the original.
+Analogous to the the
Counts the number of counter-clockwise turns that
The winding number is used to define filling and clipping.
+Winding numbers computed by
Using
Construct transform from multiplier for x and y coordinates, followed by a shift.
Construct transform.
Construct transform.
Construct transform.
Construct transform that scales x by
Constructs the inverse of a transform. This is only possible if the linear part of the transform is non-singular.
Constructs the inverse of a transform. This is only possible if the linear part of the transform is non-singular.
Mean point of the path.
+Note that this is not the same as the mean of the area that would be painted when filling the path.
+Analogous to the the
Mean of the path points of the path.
+Analogous to the the
Finds the first point on the path where the global maximum in the given direction is attained.
+Analogous to the the
Finds the first path point on the path where the global maximum in the given direction is attained.
+Analogous to the the
Finds the a point among the control points of the path, where the global maximum in the given direction is attained.
+Analogous to the the
Finds the first point on the first path where it intersects with the second path.
+If no intersection is found, the error handler
Additional information from the computation is stored in the
To be called when the intersection between two paths cannot be found.
+Shall take the two
Finds the first point on the path where the global minimum in distance to the given point is attained.
+ +Finds a point on the first path where the global minimum in distance to the second path is attained. If there are intersections, the earliest of these is returned
+The algorithm and related tolerances are described in .
+Additional information from the computation is stored in the
Analogous to the the
Analogous to the the
Finds the first path point on the path where the global minimum in distance to the given point is attained.
+Analogous to the the
Constructs a rectangular path with the given points as opposite corners. The path starts at the first of the given points, and if the points are given as bottom-left and upper-right (in that order), the path is oriented counter-clockwise.
Merge the two paths by merging the
Hopefully, the example below expresses the idea more clearly.
+Application of
Analogous to the the
Interpret the string
The argument
If
Use this function when you'd rather use a graphical tool to define paths than writing the
Note that
While most operations on paths only depend on the geometry of the path, there are some operations that operate on the spline representation. Generally, such operations give a more precise result for smaller spline segments, and fortunately, a spline can be divided into smaller segments without changing its geometry. This is referred to as upsampling of the path, and
Divide each spline segment in two such that the velocity is continuous at the new path point. This will make the distance to the two interpolation points at the new path point equal, hence the name. It turns out that this happens at spline time 0.5, so the implementation is very cheap.
+Analogous to the the
Add samples at inflection points.
+Add samples at inflection points, and so that each segment bends at most
Add sample points such that each segment is at most
Analogous to the the
Generally, programs should not directly refer to the low level tolerance parameters described in . Therefore, most of these parameters are not even exposed with a binding. This section gives the exceptions.
+The value controlled by
The geometric objects in
Apply pin-hole camera projection. The geometry of the projection is documented under
Exactly how
When a
Move object from
Construct rotation transform about given direction.
Construct transform that scales x by
Construct transform from multiplier for x, y, and z coordinates, followed by a shift.
Computes a rigid body coordinate transform that brings the transform
Note that the rank shall not be selected full (that is,
This function may be used to find a rotation's eigenvector (that is, the direction of the rotation), as the eigenvector will be in the third column of the linear part of the change of coordinates. +
+tf: [rotate3D angle:25° dir:(1,2,3)] +•stdout << [Schur_decomp tf].Q.Lz ++ +
The generalization of real Schur decomposition to also include a translation. It can be seen that rank
The analogue of
Implements
Implements
Note that all arguments must be
Produces vector which is orthogonal to the given one. The funciton preserves norm, but the argument must not have zero length.
+The direction of the result is computed as a cross product with either the
Tagged values inside graphics.
+Graphics in both
Creates a tagged object by attaching key
The result is either a
Tagged objects are useful for many purposes. At the lowest level, they may be retrieved later by their key, and they can be referred to for removal from a group state.
+Retrieves one value tagged with
See the
Retrieves all values tagged with
See the
A graphical object in
An empty
An invisible
Paints a round spot at the given coordinates. The width and color of the spot is as if the spot was a stroke, see
Note that spots can also be made by stroking a closed singelton path with a round cap style. That is, +
+[spot pt] ++is equivalent to +
+@cap:CAP_ROUND | [stroke emptypath--pt--cycle] ++ +
Also note that using
Rather than making the origin the default value for the argument, the dynamic variable
Some
+@cap:CAP_ROUND | [stroke pt--(+(0m,0m))] ++ +
A function call with fixed arguments (or no arguments at all) is like a dynamic variable, and then a dynamic variable is generally preferred over the function call since using a dynamic variable emphasizes the dynamic nature of the expression. Since the need for a spot at the origin (which can then be transformed to any desired position) is so frequent, this dynamic variable is simply an alternative to calling
The value of this dynamic variable will depend on other dynamic variables, compare
Clips
When
When
If the goal is to crop
At the moment, we refrain from including an example of clipping with a
When clipping a path with
Clipping with respect to a text is typically a way of painting that text. Clipping is combined with the effect of painting the text as usual, but as the topmost part of this figure shows, the none rendering mode can be used to do pure clipping.
+Clips
When clipping a path with
Paints the
The arguments
Compare with the
Note that defining arrow heads is much more intricate in
Paints the
When filling a path with
Paints the
Note that although winding rules don't really make any sense in
Paints the
When filling a path with
Sends the string to
The origin of the produced label is the same as in
If the expression is a string literal, it is handled more efficiently than if the string must be obtained by evaluation.
+The given string should name a
Vector functions have a field called
The argument
The length
The origin is at the lower left corner of the image. The physical dimensions of the image will be the product of the density and the number of pixels in the corresponding dimensions of the image.
+A
The analogue of
Type of surface normal. Should either be
The only required argument is
Up to three surface normals may be provided (provide
Please refer to the documentation on the many dynamic variables accessed by this function, to learn how these affect the light computations.
+Make a special kind of
When the object is viewed after being transformed in
Gives the user full control of how to display the object when being viewed through a
The evaluation order is quite non-standard for the objects created here. Viewing an object is generally an atomic operation from a continuation passing point of view. Hence, when the function is applied to the transform to obtain the
Since the object created here only has a meaning when being viewed, it cannot be searched (see
If you ever considered solving the intricate problem of generating nice arrowheads for paths in
Note the conceptual difference between programs that produce many pages of output (and it may happen to be just one), and programs that produce just one piece of graphics; a “book” with just one page is still a book, and hence not something which should be included on a page of another document. If the output is something to be placed on a page of an external document, then there is only one logical page to paint, namely
Most
The
Returns the bounding box or the bleed box of
The allowed values for
Creates an object with the same content as
The allowed values for
Generally, the bounding box is the convex path used for layout of an object. The bleed box is used by the compiler to determine where to crop the final contents of a page. Making the bleed box slightly bigger than the bounding box can be a good idea for content that may look squeezed (or even get cropped) if appearing by the border of a page.
+The bounding boxes computed by
This causes a problem when such objects are at the boundary of the bounding box of page, since the page will then be slightly too small. While perhaps just mildly irritating when the page is the end media, but when the output is included as a picture in a bigger document, the cropped glyphs become really disturbing.
+The solution to this is to define a bleed box which is larger than the bounding box. The bounding box will be used for layout as usual, but the bleed box is used when determining the crop box for the page. To keep things simple, the size of the bleed box is controlled using this dynamic variable alone, which specifies how much the bleed box extends outside the bounding box in the
Elementary math library function.
+Cosine of argument in radians.
Elementary math library function.
+Tangent of argument in radians.
Elementary math library function.
+Coangent of argument in radians.
Elementary math library function.
+Inverse of sine, with result in radians.
Elementary math library function.
+Inverse of cosine, with result in radians.
Elementary math library function.
+Inverse of tangent, with result in radians.
TODO: Documentation of
Elementary math library function.
+Rounding towards negative infinity, giving the largest integer which is not greater than the argument.
+With the range of
Elementary math library function.
+Rounding towards positive infinity, giving the smallest integer which is not less than the argument.
+With the range of
Elementary math library function.
+Rounding to nearest integer, with half-way cases rounded away from zero.
+With the range of
The three remainder functions, illustrated for both
The illustration is included just for fun — when determining which remainder function to use, it is strongly recommended to do that based on the mathematical characterizations rather than this illustration.
+Remainder consistent with Euclidean division, always being non-negative. That is, let
Equivalently,
Generalization of the
Analogous to the
Remainder induced by floored division. That is, let
Since
Generalization of the
Analogous to the
Remainder induced by division rounded towards zero. That is, let
Since the magnitude of
Generalization of the
Analogous to the
Elementary math library function.
+Square root of non-negative number.
+Desides the most elementary things such as initializing the random state and then sampling uniformly from a huge range of integer values,
Source of high quality random seeds.
+This namespace also covers operations on individual characters, even though the namespace name suggests otherwise.
+ + +The functional alternative to using the form of
The functional alternative to using the form of
These are the pre-defined fonts available in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Access to built-in
Graphical rendering of test is a complex matter with lots of parameters to be controlled. By having a separate namespace for these things, the
The bindings in this section are closely related to the text state parameters in
Constructs a value that specifies a text rendering mode, which can be assigned to
If both arguments are false, the rendering mode will cause the text not to display at all, which is useful when clipping.
+Manual kerning. Each
Interleaves automatically kerned text with manual kernings.
+Automatic kerning needs support by the metrics of the current font must, and it is forbidden to call this function unless the current font indicates that kern pairs supported by having its
Intended to be used when creating text using the built-in mechanisms of
Intended to be used as the size of text.
+Horizontal scaling of the font.
+Text rendering mode.
+Design note: It would have been possible to split the rendering mode into two separate dynamic variables; one for stroking, and one for filling. One obvious benefit of this would have been that the special type
The text knockout mode. Refer to the
Extra space to add between characters.
+A
Extra space to add at each space character.
+A
The vertical distance between lines of text.
+A
Vertical offset of the text from the normal baseline.
+A
Locates and loads a font, which can be assigned to
The two arguments
The font is located using FontConfig, so if
Color constants for the black and white color space.
+ + +Predefined color value.
+Predefined color value.
+Color value with special interpretation. If used as a color, it is the same as
This is useful when one wants to draw a picture where lines are drawn on a surface, and one is not interested in filling the surface with any color, but the surface is needed never the less to occlude lines. Not filling the surface with any color allows the lines to be drawn on any background, and will also generate an output with much smaller memory footprint.
+Note that a z-buffer always draws all visible line segments on top of the filled areas.
+Blend mode constants.
+ + +Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Access to blend mode constant.
+Line stroke cap style constants.
+ + +Value for
Value for
Value for
Color space constants for device color spaces.
+ + +Uncalibrated color space.
+Uncalibrated color space.
+Uncalibrated color space.
+Line stroke join style constants.
+ + +Value for
Value for
Value for
Not much to say here…
+The content of this namespace is not documented yet.
Color constants for the red-green-blue color space.
+ + +Predefined color value.
+Predefined color value.
+Predefined color value.
+Predefined color value.
+Predefined color value.
+Predefined color value.
+Predefined color value.
+Predefined color value.
+The
The bindings in this namespace are closely related to the graphics state parameters in
Many of these dynamic variables can be set to a
Intended to be used as the width when paths are stroked. A value of
Note that if the width is inherited from the context, it will not be possible to compute a correct bounding box of a stroked object.
-Intended to be used as the width when paths are stroked. A value of
Note that if the width is inherited from the context, it will not be possible to compute a correct bounding box of a stroked object.
+Color used when paths are stroked.
+Line cap style.
+Line join style.
+Miter limit value to use when
Dash pattern to use for strokes. (The default value gives solid lines.)
+Creates a dash pattern from a sequence of lengths, to be used with
If called with no arguments, the constructed pattern gives a solid line. Otherwise, the lengths determine where along a stroked line the pen shall be switched between on and off, with the pen initially being on.
+Note that a dash pattern can be scaled and shifted by means of operators, see
Alpha settings for stroking operations.
+Value that can be passed to
Color used when paths are filled (or, more generally, anything but stroked). (The name is inherited from
Alpha settings for nonstroking operations.
+Blend mode.
+Color space for blending.
+Creates a shape alpha value (refer to the
Creates an opacity alpha value (refer to the
Value for
Value that can be passed to
This namespace is just an organizational unit. Other top level namespaces include
This top level namespace is reserved for the
Other top level namespaces include
A value used to symbolize the absence of a value.
+The value plays a special role in
Often used as the default value for an optional function argument, when the actual value being used by default is derived from other arguments.
+A convenient function of one argument, that simply returns the argument.
+The
Conditional evaluation. If
The current design with an optional
Represents the ever-changing state being the current time. It's main characteristic is nothing but that; one can be sure that it will change from one peek of it to the next.
+So what's the use of it? For semantic reasons, it shall be required by the kernel's non-pure functions that interact with the outside world in such a way that the result may be different from one invocation to another (and would otherwise not have any state parameters).
+Another obvious use of
Returns the most specific type of the argument.
+Constructs an
The values of
If
General-purpose error-handling.
Abort program evaluation, providing the message and backtrace to the compiler for display.
By using a dedicated escape continuation rather than an immediatly aborting construct, it is possible to detect and recover in some error situations.
+Swallow anything and return
If an impure function has both side effects and a return value,
To be used when a state parameter is required by a non-pure function, but one does not care about the result.
+Combines dynamic bindings. Can be used instead of repeating the operator
May be used when combinding several dynamic bindings, and one would like — for clarity of notation — to use exactly one operator
States of type
Don't expect the lista of dynamic references to be complete, and don't expect any of the listed references to actually be used.
States of type
Append text without kerning.
@@ -398,10 +398,10 @@ will not remove the stroke from the page, since the value being tackedAppend newline command followed by relative move, interpreting the move in units of
Append newline command followed by relative move, interpreting the move in units of
The reason
Predicates are simple functions that test certain conditions.
+Well, the states here do not have much in common except that they are generally not needed for basic applications.
True if the argument is the empty
Special units of lengths are used when constructing smooth paths. Then, it is often desirable not to have to provide the distance to control points in terms of absolute distances, but one would rather specify the distance relative to the distance between the first and final interpolation point, and the angles from the first and final interpolation points to the intermediate control points.
-The most frequent use of special units of lengths is to assign the dynamic variable
The most frequent use of special units of lengths is to assign the dynamic variable
Special lengths can be viewed as a function taken from a particular (parameterized) set of functions. There are only eight special units of lengths, and currently, there is no support for defining new ones. Here is the list of them all: diff --git a/doc/parts/syntax/compound.sxml b/doc/parts/syntax/compound.sxml index f394cd57..4bb8d2c2 100644 --- a/doc/parts/syntax/compound.sxml +++ b/doc/parts/syntax/compound.sxml @@ -129,10 +129,10 @@
-When the distance is missing, it may fall back on
When the distance is missing, it may fall back on
A polar handle will store the distance part as a thunk, thereby capturing the current lexical and dynamic environments. Hence, it is not when the polar handles are used to build paths, that
A polar handle will store the distance part as a thunk, thereby capturing the current lexical and dynamic environments. Hence, it is not when the polar handles are used to build paths, that
@@ -143,8 +143,8 @@
Compute remaining angles based on the path point's position relative its neighboring path points.
Fill in details!
Compute all distances to handles that are given explicitly. Note that this requires all angles to be known.
Propagate known distances to any free distances on the other side of a path point.
Use
Use
Note that the rules above means that there is a subtle difference between the following two path points: diff --git a/doc/parts/syntax/namespaces.sxml b/doc/parts/syntax/namespaces.sxml index fd4ae188..6769b442 100644 --- a/doc/parts/syntax/namespaces.sxml +++ b/doc/parts/syntax/namespaces.sxml @@ -121,7 +121,7 @@ dynamic @z identity 1 /** Introduces a binding for a dynamic variable in namespa They ways in which bindings can be introduced is discussed in detail in . In this section, we will look at how the bindings are referred to.
-The different kinds of references are recognized by looking at the prefix of the identifier. For example, a lexical variable uses no special prefix, and may look like
The different kinds of references are recognized by looking at the prefix of the identifier. For example, a lexical variable uses no special prefix, and may look like
A lexical variable reference consists of an optional namespace qualifier and an identifier. The namespace qualifier may be either absolute, local, or relative, and contains a sequence of zero or more namespace identifiers. The length of a namespace qualifier is its number of namespace identifiers. The written representation of a namespace qualifier uses the namespace separator to separate the namespace identifiers, and has a leading namespace separator in case it is absolute, or a leading
When putting strokes on the page, there is a natural way of controlling where the strokes appear by simply specifying the desired coordinates. When using the
- In
T1: [shift (2cm,~3mm)]@@ -79,7 +79,7 @@ T1: [shift (2cm,~3mm)] -
Another very common transformation is rotation (see
Another very common transformation is rotation (see
T2: [rotate 25°]@@ -118,7 +118,7 @@ lbl: (TeX `$x^{2} + y^{2}$´)
It is almost allways the case that combining the operators is (sometimes much) more efficient than applying one transform after the other.
-Well, that's about all we are going to say regarding transforms in this tutorial. Before ending, we'll just mention that there are other constructors beside the ones seen here, that (almost all) transforms can be inverted (see
Well, that's about all we are going to say regarding transforms in this tutorial. Before ending, we'll just mention that there are other constructors beside the ones seen here, that (almost all) transforms can be inverted (see
You are already familiar with one of the path-painting functions, namely
You are already familiar with one of the path-painting functions, namely