trace -package:matrix -package:ghc -package:polysemy package:diagrams-core
Every diagram comes equipped with a trace. Intuitively, the
trace for a diagram is like a raytracer: given a line (represented as
a base point and a direction vector), the trace computes a sorted list
of signed distances from the base point to all intersections of the
line with the boundary of the diagram.
Note that the outputs are not absolute distances, but multipliers
relative to the input vector. That is, if the base point is p
and direction vector is v, and one of the output scalars is
s, then there is an intersection at the point p .+^ (s *^
v).
diagrams-core defines the core library of primitives forming
the basis of an embedded domain-specific language for describing and
rendering diagrams.
The Trace module defines a data type and type class for
"traces", aka functional boundaries, essentially corresponding to
embedding a raytracer with each diagram.
Compute the "smallest" boundary point along the line determined by the
given point
p and vector
v. The "smallest" boundary
point is defined as the one given by
p .+^ (s *^ v) for the
smallest (most negative) value of
s. Return
Nothing
if there is no such boundary point. See also
traceV.
See also
rayTraceP which uses the smallest
positive
intersection, which is often more intuitive behavior.
Compute the vector from the given point
p to the "smallest"
boundary intersection along the given vector
v. The
"smallest" boundary intersection is defined as the one given by
p
.+^ (s *^ v) for the smallest (most negative) value of
s. Return
Nothing if there is no intersection. See
also
traceP.
See also
rayTraceV which uses the smallest
positive
intersection, which is often more intuitive behavior.
Traced abstracts over things which have a trace.
Compute the trace of an object.
Like
rayTraceP, but computes the "largest" boundary point
instead of the smallest. Considers only
positive boundary
points.
Like
rayTraceV, but computes a vector to the "largest" boundary
point instead of the smallest. Considers only
positive boundary
points.
Like
traceP, but computes the "largest" boundary point instead
of the smallest. (Note, however, the "largest" boundary point may
still be in the opposite direction from the given vector, if all the
boundary points are.)
Like
traceV, but computes a vector to the "largest" boundary
point instead of the smallest. (Note, however, the "largest" boundary
point may still be in the opposite direction from the given vector, if
all the boundary points are, as in the third example shown below.)
Compute the boundary point on an object which is closest to the given
base point in the given direction, or
Nothing if there is no
such boundary point. Note that unlike
traceP, only
positive boundary points are considered,
i.e. boundary
points corresponding to a positive scalar multiple of the direction
vector. This is intuitively the "usual" behavior of a raytracer, which
only considers intersection points "in front of" the camera.
Compute the vector from the given point to the closest boundary point
of the given object in the given direction, or
Nothing if
there is no such boundary point (as in the third example below). Note
that unlike
traceV, only
positive boundary points are
considered,
i.e. boundary points corresponding to a positive
scalar multiple of the direction vector. This is intuitively the
"usual" behavior of a raytracer, which only considers intersections
"in front of" the camera. Compare the second example diagram below
with the second example shown for
traceV.
Replace the trace of a diagram.
Get a modified
Trace for an object which only returns positive
boundary points,
i.e. those boundary points given by a positive
scalar multiple of the direction vector. Note, this property will be
destroyed if the resulting
Trace is translated at all.