zonogon-raytrace {zonohedra} | R Documentation |
compute the intersection of a ray, based in the interior of a zonogon, and the boundary of that zonogon
Description
The open ray with basepoint
and non-zero direction
is the set of the form
where
.
This function computes the intersection of an open ray
and the boundary of a zonogon .
The basepoint is normally required to be in the interior
of
, but an exception is made if the basepoint is 0,
and on the boundary of
,
and the direction points into the interior of
.
In these two cases the intersection of the open ray
and the boundary of
is unique.
In the second case, the basepoint is also allowed to be
the sum of all the generators - the so-called white point
of
.
Usage
## S3 method for class 'zonogon'
raytrace( x, base, direction, plot=FALSE, ... )
Arguments
x |
a zonogon object as returned by the constructor |
base |
a numeric 2-vector - the basepoint of all the rays.
|
direction |
a numeric Mx2 matrix with M non-zero directions in the rows.
The basepoint and these directions define M rays.
|
plot |
if |
... |
not used |
Value
raytrace.zonogon()
returns a data.frame
with M rows and these columns:
base |
the given basepoint - this is the same in every row |
direction |
the given direction |
facetidx |
the index of the facet (an edge) where ray exits the zonogon |
sign |
of the facet, either +1 or -1 |
tmax |
ray parameter of the intersection with the exit facet, always positive |
point |
the point on the boundary; the intersection of the ray and the facet |
timetrace |
the computation time, in seconds |
If base
and direction
in a row cannot be
processed, the rest of the row is NA
.
If the row names of direction
are unique,
they are copied to the row names of the output.
In case of error, the function returns NULL
.
See Also
zonogon()
,
plot.zonogon()
,
section.zonohedron()
Examples
# make a zonogon with 5 generators
pz20 = polarzonogon( 20, 5 )
# make 4 random directions
set.seed(0)
dir = matrix(rnorm(4*2),4,2)
# use basepoint in the interior of the zonogon
raytrace( pz20, c(0.5,0.5), dir )
# base.1 base.2 direction.1 direction.2 facetidx sign tmax boundary.1 boundary.2 timetrace
# 1 0.5 0.5 1.2629543 0.4146414 4 -1 2.0503073 3.08944438 1.35014236 7.680000e-05
# 2 0.5 0.5 -0.3262334 -1.5399500 1 -1 0.3246859 0.39407664 0.00000000 4.649995e-05
# 3 0.5 0.5 1.3297993 -0.9285670 2 -1 0.4868719 1.14744192 0.04790678 4.310103e-05
# 4 0.5 0.5 1.2724293 -0.2947204 2 -1 0.9354693 1.69031851 0.22429808 4.149997e-05
# use basepoint at 0 - on the boundary of the zonogon
raytrace( pz20, c(0,0), dir )
# base.1 base.2 direction.1 direction.2 facetidx sign tmax boundary.1 boundary.2 timetrace
# 1 0 0 1.2629543 0.4146414 4 -1 2.192481 2.7690037 0.9090936 0.0001216
# 2 0 0 -0.3262334 -1.5399500 NA NA NA NA NA NA
# 3 0 0 1.3297993 -0.9285670 NA NA NA NA NA NA
# 4 0 0 1.2724293 -0.2947204 NA NA NA NA NA NA