IRIT is a solid modeler developed for educational purposes. Although
small, it is now powerful enough to create quite complex scenes.
IRIT started as a polygonal solid modeler and was originally developed
on an IBM PC under MSDOS. Version 2.0 was also ported to X11 and version 3.0
to SGI 4D systems. Version 3.0 also includes quite a few free form curves
and surfaces tools. See the UPDATE.NEW file for more detailed update
information. In Version 4.0, the display devices were enhanced, freeform
curves and surfaces are more extensively supported, functions can be defined,
and numerous improvement and optimizations are added.
BECAUSE IRIT AND ITS SUPPORTING TOOLS AS DOCUMENTED IN THIS DOCUMENT
ARE LICENSED FREE OF CHARGE, I PROVIDE ABSOLUTELY NO WARRANTY, TO THE EXTENT
PERMITTED BY APPLICABLE STATE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING, I
GERSHON ELBER PROVIDE THE IRIT PROGRAM AND ITS SUPPORTING TOOLS "AS IS"
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE.
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THESE PROGRAMS IS WITH
YOU. SHOULD THE IRIT PROGRAMS PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL GERSHON ELBER,
BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES,
OR OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR A
FAILURE OF THE PROGRAMS TO OPERATE WITH PROGRAMS NOT DISTRIBUTED BY GERSHON
ELBER) THE PROGRAMS, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
IRIT is a freeware solid modeler. It is not public domain since we
hold copyrights on it. However, unless you are to sell or attempt to make
money from any part of this code and/or any model you made with this solid
modeler, you are free to make anything you want with it. In order to use
IRIT commercially, you must license it first - contact us is such a
case.
IRIT can be compiled and executed on numerous Unix/Linux systems as
well as Windows 98/NT/2000/XP/Vista, Mac, OS2, and AmigaDOS. Also, under
Windows, IRIT must be installed at a directory/path with no spaces.
You are not obligated to me or to anyone else in any way by using IRIT.
You are encouraged to share any model you made with it, but the models
you made with it are yours, and you have no obligation to share them.
You can use this program and/or any model created with it for non
commercial and non profit purposes only. An acknowledgement on the way the
models were created would be nice but is not required.
The IRIT program reads a file called irit.cfg each time it is executed.
This file configures the system. It is a regular text file with comments, so
you can edit it and properly modify it for your environment.
This file is being searched for in the directory specified by the
IRIT_PATH environment variable.
For example 'setenv IRIT_PATH /u/gershon/irit/bin/'.
Note IRIT_PATH must terminate with '/'. If the variable is not set only
the current directory is being searched for irit.cfg.
In addition, if it exists, a file by the name of iritinit.irt will be
automatically executed before any other '.irt' file. This file may contain
any IRIT command. It is the proper place to put your predefined
functions and procedures, if you have any.
This file will be searched much the same way irit.cfg is. The
name of this initialization file may be changed by setting the StartFile
entry in the configuration file.
This file is far more important starting at version 4.0, because of the new
function and procedure definition that has been added, and which is used
to emulate BEEP, VIEW, and INTERACT, for example.
The solid modeler can be executed in text mode (see the .cfg and the -t
flag below) on virtually any system with a C compiler.
Under all systems the following environment variables must be set
and updated:
path
Add to path the directory where IRIT's binaries are.
IRIT_PATH
Directory with config., help and IRIT's binary files.
IRIT_DISPLAY
The graphics driver program/options. Must be in path.
to set /u/gershon/irit/bin as the binary directory and to use the sgi's
gl driver. If IRIT_DISPLAY is not set, the server (i.e., the IRIT
program) will prompt and wait for you to run a client (i.e., a display
driver). if IRIT_PATH is not set, none of the configuration files, nor
the help file will be found.
If IRIT_BIN_IPC is not set, text based IPC is used, which is far
slower. There is no real reason not to use IRIT_BIN_IPC, unless it does
not work for you, for some reason.
In addition, the following optional environment variables may be set.
IRIT_MALLOC
If set, apply dynamic memory consistency testing.
Programs will execute much slower in this mode.
IRIT_MALLOC_PTR
Set to a pointer address and the program will scream
once this pointer is allocated, if IRIT_MALLOC is set.
IRIT_MALLOC_STACK
Under Windows only, keeps stack info on all mallocs.
IRIT_NO_SIGNALS
If set, no signals are caught by IRIT.
IRIT_SERVER_HOST
Internet Name of IRIT server (used by graphics driver).
IRIT_SERVER_PORT
Used internally to the TCP socket number. Should not
be set by users.
IRIT_TIME_OUT
Integer (seconds) for timing out when trying
to execute a display device from IRIT. Default is 10
seconds.
IRIT_INCLUDE
A semicolon separated list of directories, in which to
look for the irt files to include. See INCLUDE command.
LD_LIBRARY_PATH
If shared libraries are created, this variable must be
updated to point to the shared libraries' directory.
IRIT_MALLOC is useful for programmers, or when reporting a memory
fatal error occurrence. This variable, when set as a non zero value,
will activate the following (hexadecimal bit settings with any combination
of the following):
0x01
A test for overwriting before the dynamic memory
is allocated or immediately after it. Cheap in time.
0x02
Savings of all allocated objects in a table for the
detection of freeing unallocated objects and consistency
of the entire dynamic memory. Time expensive.
0x04
Zeros every freed object, once it is freed.
0x08
On Windows environments - enables _CrtCheckMemory checks
every malloc/free, in debug compilation modes.
0x10
On Windows environments - enables _CrtCheckMemory checks
every 16 mallocs/frees, in debug compilation modes.
IRIT_NO_SIGNALS is also useful for debugging when contorl-C is used
within a debugger. The IRIT_SERVER_HOST/PORT controls the server/client
(IRIT/Display device) communication.
IRIT_SERVER_HOST and IRIT_SERVER_PORT are used in the unix and
Window NT ports of IRIT.
See the section on graphics drivers for more details.
A session can be logged into a file as set via LogFile in the configuration
file. See also the LOGFILE command.
Under OS2 the IRIT_DISPLAY environment variable must be set (if set) to
os2drvs.exe without any option (-s- will be passed automatically).
os2drvs.exe must be in a directory that is in the PATH environment
variable. IRIT_BIN_IPC can be used to signal binary IPC which is faster.
Here is a complete example:
set IRIT_PATH=c:\irit\bin\
set IRIT_DISPLAY=os2drvs -s-
set IRIT_BIN_IPC=1
assuming the directory specified by IRIT_PATH holds the executables of
IRIT and is in PATH.
If IRIT_BIN_IPC is not set, text based IPC is used which is far
slower. There is no real reason not to use IRIT_BIN_IPC unless it does
not work for you, for some reason.
The OS2 executables are typically built using the EMX port of gnu C
compiler. The distribution of the executables does not include the EMX run
time library and any attempt to run IRIT will fail. You will get an error
message such as "File EMX does not exist". You can get the run time from
ftp to ftp-os2.nmsu.edu (aliased also as hobbes.NMSU.Edu)
cd to os2/unix/emx09c (or a newer version number/level)
get emxrt.zip and place its dlls in a place they would be found.
The NT port uses sockets and is, in this respect, similar to the Unix port.
The envirnoment variables IRIT_DISPLAY, IRIT_SERVER_HOST, and
IRIT_BIN_IPC should all be set in a similar way to the Unix specific
setup.
As a direct result, the server (IRIT) and the display device can run
on different hosts. For example, the server might be running on an NT
system while the display device will be running on an SGI4D, exploiting
the graphic's hardware capabilities. Here is a complete example:
set IRIT_PATH=c:\irit\bin\
set IRIT_DISPLAY=wntgdrvs -s-
set IRIT_BIN_IPC=1
Also, under Windows, IRIT must be installed in a directory/path with
no spaces.
Under UNIX using X11 (x11drvs driver), add the following options to
your .Xdefaults. Most are self explanatory. The Trans attributes control
the transformation window, while the View attributes control the view window.
SubWin attributes control the subwindows within the transformation window.
Commands to IRIT are entered using a textual interface, usually
from the same window from which the program was executed.
Some important commands to begin with are:
1. include("file.irt"); - will execute the commands in file.irt. Note
include can be recursive up to 10 levels. To execute the demo
(demo.irt) simply type 'include("demo.irt");'. Another way to run
the demo is by typing demo(); which is a predefined procedure defined
in iritinit.irt.
2. help(""); - will print all available commands and how to get help on
them. A file called irit.hlp will be searched as irit.cfg is
being searched (see above), to provide the help.
3. exit(); - close everything and exit IRIT.
Most operators are overloaded. This means that you can multiply
two scalars (numbers), or two vectors, or even two matrices, with the same
multiplication operator (*). To get the on-line help on the
operator '*', type 'help("*");'
The best way to learn this program (as any other program...) is by
trying it. Print the manual and study each of the commands available.
Study the demo programs (*.irt) provided, as well.
The "best" mode in which to use IRIT is via the emacs editor. With this
distribution an emacs mode for IRIT files (irt postfix) is provided
(irit.el). Make your .emacs load this file automatically. Loading file.irt
will switch emacs into an IRIT mode that supports the following keystrokes:
Meta-E
Executes the current line
Meta-R
Executes the current Region (Between Cursor and Mark)
Meta-S
Executes a single line from input buffer
Meta-H
Prints IRIT help on the current WORD the point is on using 'help("WORD");'
The first time one of the above keystrokes is hit, emacs will fork an
IRIT process so that IRIT'S stdin is controlled via the above commands.
This emacs mode was tested under various Unix environments, under OS2
2.x/3.x, and under Windows 95/98/NT/2000/XP.
The front end of the IRIT Solid Modeler is an infix parser that
mimics some C language behavior. The infix operators that are supported
are plus (+), minus (-), multiply (*), divide (/), and power (^), for
numeric operators, with the same precedence as in C.
However, unlike the C language, these operators are overloaded,
or different action is taken, based upon the different operands.
This means that one can write '1 + 2', in which the plus sign denotes a
numeric addition, or one can write 'PolyObj1 + PolyObj2', in which case the
plus sign denotes the Boolean operation of a union between two geometric
objects.
The exact way each operator is overloaded is defined below.
In this environment, reals, integers, and even Booleans, are all represented
as real types. Data are automatically promoted as necessary.
For example, the constants TRUE and FALSE are defined as 1.0 and 0.0,
respectively.
Each expression is terminated by a semicolon. An expression can be as
simple as 'a;' which prints the value of variable a, or as complex as:
for ( t = 1.1, 0.1, 1.9,
cb1 = csurface( sb, COL, t ):
color( cb1, green ):
snoc( cb1, cb_all )
);
While an expression is terminated with a semicolon, a colon is used to
terminate mini-expressions within an expression.
Once a complete expression is read in (i.e., a semicolon is detected)
and parsed correctly (i.e. no syntax errors are found), it is executed.
Before each operator or a function is executed, parameter type matching
tests are made to make sure the operator can be applied to these
operand(s), or that the function gets the correct set of arguments.
The parser is totally case insensitive, so Obj, obj, and OBJ will refer
to the same object, while MergePoly, MERGEPOLY, and mergePoly will refer
to the same function.
Objects (Variables, if you prefer) need not be declared. Simply use them
when you need them. Object names may be any alpha-numeric (and underscore)
string of at most 30 characters. When assigned to an old object, the old
object will be automatically deleted and if necessary, its type will be
modified on the fly.
Example:
V = sin( 45 * pi / 180.0 );
V = V * vector( 1, 2, 3 );
V = V * rotx( 90 );
V = V * V;
will assign to V a NumericType equal to the sine of 45 degrees, the VectorType
( 1, 2, 3 ) scaled by the sine of 45, rotate that vector around the X axis
by 90 degrees, and finally a NumericType which is the dot (inner) product of
V with itself.
The parser will read from stdin, unless a file is specified on the command
line or an INCLUDE command is executed. In both cases, when the end of file
is encountered, the parser will again wait for input from stdin. In order
to execute a file and quit at the end of the file, put an EXIT command as
the last command in the file.
Note: Boolean UNION of two disjoint objects (no common volume) will result
in the two objects being combined. It is the USER's responsibility to make
sure that the non intersecting objects are also disjoint - this system only
tests for no intersection. Boolean UNION of two polyline objects will merge
the list of polylines.
- NumericType -> NumericType
- PointType -> PointType (Scale vector by -1)
- VectorType -> VectorType (Scale vector by -1)
- CtlPtType -> CtlPtType (Scale vector by -1)
- PlaneType -> PlaneType (Scale vector by -1)
- StringType -> StringType (Reverse the order of string's characters)
- MatrixType -> MatrixType (Scale matrix by -1)
- PolygonType -> PolygonType (Boolean NEGATION operation)
- CurveType -> CurveType (Curve parameterization is reversed)
- SurfaceType -> SurfaceType (Surface parameterization is reversed)
- TrimSrfType -> TrimSrfType (Trim surface parameterization is reversed)
- ModelType -> ModelType (Model inside/outside flip)
Note: Boolean SUBTRACT of two disjoint objects (no common volume) will result
in an empty object. For both a curve and a surface parameterization, reverse
operation (binary minus) causes the object normal to be flipped as a side
effect.
Note: Boolean INTERSECTION of two disjoint objects (no common volume) will
result in an empty object. Object hierarchy transform transforms any
transformable object (GeometricType) found in the list recursively. Boolean
INTERSECTION of two planar (XY plane) polyline objects will compute the
intersection points of the two lists of polylines. Be aware that a plane
multiplied by a matrix does not always do what you might expected.
The ^ operator is overloaded above the following domains:
NumericType ^ NumericType -> NumericType
VectorType ^ VectorType -> VectorType (Cross product)
MatrixType ^ NumericType -> MatrixType (Matrix to the (int) power)
PolygonType ^ PolygonType -> PolygonType (Boolean MERGE operation)
StringType ^ StringType -> StringType (String concat)
StringType ^ RealType -> StringType (String concat, real as real string)
Note: Boolean MERGE simply merges the two sets of polygons without
any intersection tests. Matrix powers must be positive integers or -1
or -2, in which case the matrix inverse (if it exists) or transpose
is computed.
Assignments are allowed as side effects, in any place in an expression.
If "Expr" is an expression, then "var = Expr" is the exact same expression
with the side effect of setting Var to that value. There is no guarantee
of the order of evaluation, so using Vars that are set within the same
expression is a bad practice. Use parentheses to force the order of
evaluation, i.e., "( var = Expr )".
The conditional comparison operators can be applied to the following
domains (o for a comparison operator):
NumericType o NumericType -> NumericType
StringType o StringType -> NumericType
PointType o PointType -> NumericType
VectorType o VectorType -> NumericType
PlaneType o PlaneType -> NumericType
CtlPtType o CtlPtType -> NumericType
MatrixType o MatrixType -> NumericType
CurveType o CurveType -> NumericType
SurfaceType o SurfaceType -> NumericType
TrivarType o TrivarType -> NumericType
TriSrfType o TriSrfType -> NumericType
MultivarType o MultivarType -> NumericType
The returned NumericType is non-zero if the condition holds, or zero if
not.
The comparison operators other than == and != can be used on
NumericTypes and StringType only.
Complex logical expressions can be defined using the logical and (&&),
logical or (||) and logical not (!). These operators can be applied
to NumericTypes that are considered Boolean results. That is, true for a
non-zero value, and false otherwise.
The returned NumericType is true if both operands are true for the and
operator, at least one is true for the or operator, and the operand is
false for the not operator. In all other cases, a false is returned.
To make sure logical expressions are readable, the and and or
operators are defined to have the same priority. Use parentheses to
disambiguate a logical expression and to make it more readable.
The IRIT Solid Modeling System supports Boolean operations between
polyhedra objects. Freeform objects will be automaticaly converted to
a polygonal representation when used in Boolean operations.
The +, *, and - are overloaded to denote Boolean union, intersection
and subtraction when operating on geometric entities. - can also be
used as an unary operator to reverse the object orientation inside out.
IRIT supports Boolean operations on polyhedra models. A polyhedra
based model is simply a collection of polygons. While a polyhedra is
simply a set of polygons, this set must conform to certain conditions:
Every polygon has known adjacent polygons, for all its edges.
The model must be a 2-manifold. That is every edge is shared by
exactly two polygons.
intersection curves must be closed and the objects participating
in the Boleans might be open in unintersecting regions.
Every polygon has a normal that points into the model. That
normal is inside/outside consistent with its adjacent polygons.
In other words, for every polygon, one can locally determine the
inside or the outside of the model. Moreover, every polygon has
neighbors for all its edges, forming a closed object that
consistently delineates inside from outside, globally.
If your input geometry does not adhere to the above constrains, the Boolean
operation is likely to fail. You can enable a special intersection-curves
mode that only compute the intersection curves between the two input
objects and does not form the output object. This special model is
insensitive to many of the above constraints so you could use this model
to examine the intersection curves and make sure there are indeed forming
closed loops. You can enable this intersection-curves mode via
'iritstate("intercrv", true);'. See also IRITSTATE command.
The Boolean operations are set operations conducted between two
such models, M_1 and M_2, that delineate inside from
outside. Boolean Union, Boolean Intersection and Boolean Subtraction
are the three common operations that resemble the exact semantic that
is expected, when treating M_1 and M_2 as
three-dimensional point sets.
Certain attributes are propegated between input and output geometry,
when processed through the Boolean operations module. If the
vertices of the input geometry have normals, uv parametric
coordinates ("uvvals" attribute), or rgb colors ("rgb" attribute),
they will be propertly propagated and interpolated through the
Booleans. Similarly, an integer "ID" attribute that is placed on an
input object will propagate into its polygons and all polygons in the
output that are part of the input objects will be carrying this "ID"
attribute.
The Boolean operations can be formulated into a binary tree structure
also known as a Constructive Solid Geometry (CSG) tree.
FIGURE:
A simple example of a polyhedra model, computed as a sequence of
several Boolean operation, presented as a CSG tree.
Example:
resolution = 20;
B = box(vector(-1, -1, -0.25), 2, 1.2, 0.5);
C = con2(vector(0, 0, -1.5), vector(0, 0, 3), 0.7, 0.3);
D = convex(B - C);
E = convex(C - B);
F = convex(B + C);
G = convex(B * C);
tr = rotx( -90 ) * roty( 40 ) * rotx( -30 );
All = list( D * tr * trans( vector( 0.6, 0.5, 0.0 ) ),
E * tr * trans( vector( 3.0, 0.0, 0.0 ) ),
F * tr * trans( vector( -2.0, 0.0, 0.0 ) ),
G * tr * trans( vector( 0.7, -1.0, 0.0 ) ) )
* scale( vector( 0.25, 0.25, 0.25 ) )
* trans( vector( -0.1, -0.3, 0.0 ) );
view_mat = rotx( 0 );
view( list( view_mat, All ), on );
save( "booleans", list( view_mat, All ) );
This is a complete example of how to compute the union, intersection and
both differences of a box and a truncated cone.
FIGURE:
Geometric Boolean operations between a box and a truncated cone.
Shown are union (left), intersection (bottom center), box minus
the cone (top center), and cone minus the box (right).
Special cases can be very difficult to handle when considering Boolean
operations. Consider an axes parallel bounding cube. Consider a
second cube rotated alpha degrees from the first cube. At large
angles, the Boolean operations are fairly simple to
compute. Nevertheless, as alpha approaches zero, the almost coplanar
planes of the two intersecting cubes make it very difficult to
robustly and consistently compute their intersection.
FIGURE:
Examples of robustness of Boolean Intersection operation. As
the rotation anlge approaches zero, the coplanarity of the
intersecting models puts very difficult constraints on the
robustness of the result.
In this specific example, using IRIT, the operation fails at
angles of 10e-6 and below.
There are several flags to control the Boolean operations. See
IRITSTATE command for the "InterCrv", "InterUV", "Coplanar", and
"PolySort" states.
The grammar of the IRIT parser follows guidelines similar to those of
the C language for simple expressions. However, complex statements differ.
See the IF, FOR, FUNCTION, and PROCEDURE below for the usage of these
clauses.
returns the area of the given Object (in object units).
The area of the polygonal object, not the area of the primitive it might
approximate,is returned.
This means that the area of a polygonal approximation of a sphere will be
returned, not the exact area of the sphere.
Initiate communication channels to a client named ClientName.
ClientName is executed by this function as a sub process.
Two communication channels are opened between the IRIT server and the
new client, for read and write. See also CLNTCRSR, CLNTREAD, CLNTWRITE, and
CLNTCLOSE. If ClientName is an empty string, the user is provided
with the new communication port to be used and the server blocks for the
user to manually execute the client after setting the proper
IRIT_SERVER_HOST/PORT environment variables.
executes two clients, one named nuldrvs while the other one is
prompted for by the user. As a result of the second invokation of
CLNTEXEC, the user will be prompted with a message similar to:
Irit: Startup your program - I am waiting...
setenv IRIT_SERVER_PORT 2182
and he/she will need to set the proper environment variable and execute
their client manually.
NumericType MESHSIZE( FreeformType Freeform, ConstantType Direction )
returns the size of the Freeform's mesh in a Direction, which
will be COL, ROW or DEPTH. For the case of a multivariate Freeform,
the Direction is an integer value starting from 0. See also FFMSIZE.
Examples:
Len = MESHSIZE( Crv, COL );
RSize = MESHSIZE( Sphere, ROW );
CSize = MESHSIZE( Sphere, COL );
TVSize = MESHSIZE( TV, COL ) * MESHSIZE( TV, ROW ) * MESHSIZE( TV, DEPTH );
MVSize1 = MESHSIZE( MV, 1 );
returns the size of a point, vector, plane, or control point (negative size
if rational) or the length of a list if List, the number of polygons
if Poly, the length of the control polygon if Crv, or the
number of characters in string if Str.
If, however, only one polygon is in Poly, it returns the number
of vertices in that polygon.
will assign the value of 3 to the variable len, set numPolys
to the number of polylines in the axes object, and set numCtlPt to 9, the
number of control points in a circle.
returns the volume of the given Object (in object units). It returns
the volume of the polygonal object, not the volume of the object it might
approximate.
This routine decomposes all non-convex polygons to convex ones, as a side
effect (see CONVEX).
constructs a coverage to Srf using isocurve in the Dir direction,
so that for any point p on surface Srf, there exists a point on one of
the isocurves that is close to p within Eps. If FullIso, the
extracted isocurves span the entire surface domain; otherwise they may
span only a subset of the domain. If SinglePath, an approximation to
a single path (Hamiltonian path) that visits all isocurves is constructed
(not supported). See also COVERPT, COVERISO.
constructs an adaptive isocurve approximation with tolerance of 0.1 to
surface srf in direction COL. Isocurves are allowed to span a
subset of the surface domain. No single path is needed.
creates two algebraic sum surfaces, one in the shape of a cylinder as
a sum of a line and a circle, and one circular sweep like.
FIGURE:
An algebraic sum of a circle and a line creating a cylinder (left)
and a general sweep like surface (right), both using ALGSUM.
computes a surface fit to the given paraametrized points data.
The fitted surface will be of bi-degree Degree, fitting points
EucPts at parameters UVPts. Needless to say EucPts
and UVPts should be lists of points of similar length. If
FirstAtOrigin is TRUE, all points are translated so the first point
in EucPts is at the origin. Only the first coordinates of UVPts
are used.
AnyType ANIMEVAL( NumericType Time, AnyType Object, NumericType EvalMats )
evaluates the animation curves in Object at time Time. The
transformations for time Time are saved at the respective sub objects
of Object as "animation_mat" matrices, if EvalMats is TRUE.
If, however, EvalMats is FALSE, the evaluated/mapped geometry is
returned directly.
computes distinct antipodal pairs on curve Crv or on surface Srf.
An antipodal pair defines two distinct locations on Crv or on
Srf that a line through the two locations is orthogonal to the tangent
space of the shape, at thouse locations. In other words, the normals to
the freeform shape at those two locations are along the line connecting the
locations.
SubdivTol and NumerTol control the tolerance of the computation
as in MZERO.
computes an offset of OffsetDistance with a globally bounded error
(controlled by Epsilon). The smaller Epsilon is, the better
the approximation to the offset. The bounded error is achieved by adaptive
refinement of the Crv.
If OffsetDistance is a (scalar) curve, the curve's first coordinate
is used to prescribe a variable offset amount along the curve. Both
Crv and OffsetDistance must share the same parametric domain.
If TrimLoops is TRUE or on, the regions of the object that
self-intersect as a result of the offset operation are trimmed away.
If BezInterp is TRUE, each curve's segment is interpolated instead
of approximated.
computes an adaptive offset to Crv with OffsetDistance of
0.5 and Epsilon of 0.01 and trims the self intersection loops in
the second instance.
See also OFFSET, TOFFSET, LOFFSET, and MOFFSET.
FIGURE:
Adaptive offset approximation (thick) of a B-spline curve (thin).
On the left, the self intersections in the offset computed in the
right are eliminated. Both offsets were computed using AOFFSET.
CurveType ARC( VectorType StartPos, VectorType Center, VectorType EndPos )
constructs an arc between the two end points StartPos and EndPos,
centered at Center. THe arc will always be less than 180 degrees, so the
shortest circular path from StartPos to EndPos is selected. The
case where StartPos, Center, and EndPos are collinear is
illegal, since it attempts to define a 180 degrees arc. The arc is constructed
as a single rational quadratic Bezier curve.
constructs a 90 degrees arc, tangent to both the X and Y axes at coordinate 1.
FIGURE:
A 90 degree arc constructed using the ARC constructor (left) and
a 280 degrees arc (right) constructed using the ARC360 constructor.
See also ARC360
constructs an arc between the two angles (degrees) StartAngle and
EndAngle, centered at Center. The arc will always be less than 360
degrees. The arc is constructed as a rational quadratic B-spline curve.
Computes a belt for a given set of Pulleys defined as point list of
the form (x, y, r) for each Pulley. Positive r designates a CW pulley
whereas a negative r designates a CCW pulley. The thickness of the belt
is defined by Thickness. BoundingArcs is usually zero but if
not, prescribes two bounding arcs for each linear segment of the belt.
ReturnCrvs should be TRUE to simply return the two boundary curves
of the belt or FALSE to return a list of arcs/lines of the belt.
computes a Hermite blend surface that supports an arbitrary cross section.
This constructs a surface between Bndry1 and Bndry2 so that the
first derivative continuity constraints, as prescribed by Tan1 at
Bndry1 and Tan2 at Bndry2, are preserved. In addition,
the interior between Bndry1 and Bndry2 will follow the shape
of planar cross section curve Sctn and will be oriented along the
vector field prescribed by Nrml.
Cross section Sctn is a planar curve that must start at (-1, 0) and
end at (1, 0), and have zero speed at the ends (first control point equals
the second and is the same at the end).
computes a Hermite blend surface on Srf along parametric curve of
Srf, PCrv, the cross section Sctn, a tangent field scale
control TanScale, and the width and height control of Width
and Height. Width and Height can be either a numeric
value of expected width and height or a scalar field curve prescribing the
expected width and height along the constructed blend.
The constructed surface, which is C1 continuous to Srf, is positioned
along PCrv, a curve in the parametric domain of Srf. The
cross section Sctn is a planar curve that must start at (-1, 0) and
end at (1, 0), and have zero speed at the ends (first control point equals
the second and is the same at the end). TanScale controls how rapid
the change in the tangent is, as we move away from the surface.
places three Hermite blend surfaces s1, s2, s3 using the cross
section cSec on a unit sphere s. See also HERMITE and
BLHERMITE.
FIGURE:
Blending Hermite with a prescribed cross section (left) using BLHERMITE
and blending Hermite with a prescribed cross section on a surface
(right) using BLSHERMITE.
computes the blossom of the given Crv or Srf and the given
blossom values BlossomVals. For a Crv, BlossomVals is
expected to hold a linear list of blossom values. For a Srf,
BlossomVals is expected to hold two linear lists (for u and v) of
blossom values.
extracts the control points of an quadric Bezier curve via blossoming and
compares this to the results obtained via a traditional extraction
approach (via the COORD function).
Given a closed curve, the curve is subdivided into four segments equally
spaced in the parametric space that are fed into BOOLSUM. This is useful if
a surface should "fill" the area enclosed by a closed curve.
creates a disk surface containing the area enclosed by the unit circle.
FIGURE:
A Boolean sum of a circle creates a disk (left) using BOOLONE and
a general Boolean sum of four curves (right) using BOOLSUM.
constructs a surface using the provided four curves as its four boundary
curves. Curves do not have to have the same order or type, and will be
promoted to their least common denominator. The end points of the four
curves should match as follows:
Crv1 start point,
to Crv3 start point.
Crv1 end point,
to Crv4 start point.
Crv2 start point,
to Crv3 end point.
Crv2 end point,
to Crv4 end point.
where Crv1 and Crv2 are the two boundaries in one parametric
direction, and Crv3 and Crv4 are the two boundaries in the other
parametric direction.
Given a geometric object Obj, let it be a surface, a trimed surface,
or a polygonal model, returns the boundary of the shape. If Obj is a
polygonal object originated with a surface and all vertices has "uvvals"
attributes, by placing "SrfBoundary" attribute on Obj with the
"UMin VMin UMax VMax" surface domain, the surface boundary is will be
properly detected, even if the surface is closed.
returns in CBndry1, the four boundary curves of tensor product surface
Srf and in CBndry2, the edges on the tesselation of Srf,
Pl, on the boundary of Srf, even if Srf is closed.
creates a BOX polygonal object, whose boundary is coplanar with the
XY, XZ, and YZ planes. The BOX is defined by Point as
base position, and Dx, Dy, Dz as BOX dimensions. Negative dimensions
are allowed.
computes the bisector surface of two cones in general position.
The cones' apexes can be found in ConeApx1 and ConeApx2
with axes directions ConeDir1 and ConeDir2 and spanning
angles of ConeAngle1 and ConeAngle2.
computes the bisector surface of two cones that share the same apex.
The cones' directions are ConeDir1 and ConeDir2 and the spanning
angles of ConeAngle1 and ConeAngle2. ConeDir1 and
ConeDir2 must be in the northern hemisphere; i.e. their Z coefficient
must be positive.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector of two concentric cones, which is also a cone.
See also BSCTCONLN, BSCTCONPL, BSCTCONPT, BSCTCONSPR, BSCTCYLPL,
BSCPCONCON, BSCTCONCN2, BSCTCONCYL, BSCTCYLPT, BSCTCYLSPR, BSCTPLNLN,
BSCTPLNPT, BSCTSPRLN, BSCTSPRPL, BSCTSPRPT, BSCTSPRSPR, BSCTTRSPT,
BSCTTRSSPR, CALPHASECTOR, CBISECTOR2D, CBISECTOR3D, SBISECTOR
computes the bisector surface of a cone and a cylinder in general position.
The cones apex is in ConeApx1 with axes direction of ConeDir1
and spanning angles of ConeAngle1. The second cylinder starts at
CylPt2, in direction CylDir2 and radius CylRad2.
computes the bisector surface of a cone and a line through its apex.
The cone's direction is ConeDir and its spanning angle is
ConeAngle. ConeDir and LineDir must be in the northern
hemisphere; i.e. their Z coefficient must be positive.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of a general cone and the XY plane (Z = 0
plane). The cone's apex is at ConeApex, the cone's direction is
ConeDir and its spanning angle is ConeAngle. Dir must be
in the northern hemisphere; i.e. their Z coefficient must be positive.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of a cone in a general position and a point,
Pt.
The cone's apex is at ConeApex, the cone's direction is ConeDir
and its spanning angle is ConeAngle.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of a cone and a sphere.
The cone's apex is at ConeApex, the cone's direction is ConeDir
and its spanning angle is ConeAngle. The sphere is centered at
SptCntr and has a radius of SprRadius.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of two cylinders in a general position.
The cylinders start at CylPt1 and CylPt2 and follow the
directions CylDir1 and CylDir2. They have radii of CylRad1
and CylRad2.
computes the bisector surface of a a cylinder and the XY plane (plane
Z = 0).
The cylinder is located at CylPos, in the direction of CylDir
which also sets the length of the cylinder. The radius of the cylinder
is CylRadius.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of a a cylinder and a point, Pt.
The cylinder is located at CylPos, in the direction of CylDir
which also sets the length of the cylinder. The radius of the cylinder
is CylRadius.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of a cylinder and a sphere.
The cylinder is located at CylPos, in the direction of CylDir
which also sets the length of the cylinder. The radius of the cylinder
is CylRadius. The sphere is centered at SptCntr and has a
radius of SprRadius.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of the XY plane (plane Z = 0) and a
line in direction LineDir. The plane and the line are assumed to
intersect at the origin.
Size controls the portion of the (infinite) bisector actually
represented.
Example:
BisectSrf = BSCTPLNLN( vector( 0, 0, 1 ), 1 );
computes the bisector of the XY plane and the Z axis (a cone).
computes the bisector surface of the XY plane (plane Z = 0) and a point
Pt. This surface is a paraboloid of revolution.
Size controls the portion of the (infinite) bisector actually
represented.
Example:
BisectSrf = BSCTPLNPT( point( 0, 0, 1 ), 1 );
computes the bisector surface of the XY plane and the point (0, 0, 1).
computes the bisector surface of a sphere and the Z axis line.
The sphere is centered at SptCntr and has a radius of SprRadius.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of the XP plane (the plane Z = 0) and a
sphere. This bisector surface is a paraboloid of revolution.
The sphere is centered at SptCntr and has a radius of SprRadius.
Size controls the portion of the (infinite) bisector actually
represented.
computes the bisector surface of two spheres.
The spheres are centered at Spt1Cntr and Spt2Cntr and have a
radii of Spr1Radius and Spr2Radius, respectively.
computes the bisector surface of a torus and a point, Pt. The
torus is located at TrsPos, with its axis of symmetry TrsDir,
a major radius of TrsMajorRad and a minor radius pf TrsMinorRad.
computes the bisector surface of a torus and a sphere. The torus is
located at TrsPos, with its axis of symmetry TrsDir,
a major radius of TrsMajorRad and a minor radius pf TrsMinorRad.
The sphere is centered at SptCntr and has a radius of SprRadius.
See also BSCPCONCON, BSCTCONCN2, BSCTCONCYL, BSCTCONCON, BSCTCONLN,
BSCTCONPL, BSCTCONPT, BSCTCONSPR, BSCTCYLPL, BSCTCYLPT, BSCTCYLSPR,
BSCTPLNLN, BSCTPLNPT, BSCTSPRLN, BSCTSPRPL, BSCTSPRPT, BSCTSPRSPR,
BSCTTRSPT, CALPHASECTOR, CBISECTOR2D, CBISECTOR3D, SBISECTOR.
FIGURE:
Bisectors of many CSG primitives such as points, lines, planes,
spheres, cones, cylinders, and torii are rational. In (left), the
rational bisector of a line and a sphere is
shown while (right) shows the bisector
of a sphere and a torus tangent to each other. See
BSCTCONCON, BSCTCONLN, BSCTCONPL, BSCTCONPT, BSCTCONSPR,
BSCTCYLPL, BSCTCYLPT, BSCTCYLSPR, BSCTPLNLN, BSCTPLNPT, BSCTSPRLN,
BSCTSPRPL, BSCTSPRPT, BSCTSPRSPR, BSCTTRSPT, BSCTTRSSPR.
creates a B-spline curve or a B-spline surface from the given Bezier curve
or Bezier surface. The B-spline curve or surface is assigned an open end knot
vector(s) with no interior knots, in the parametric domain of zero to one.
creates Bezier curve(s) or surface(s) from a given B-spline curve or a
B-spline surface. The B-spline input is subdivided at all internal knots to
create Bezier curves or surfaces. Therefore, if the input B-spline does have
internal knots, a list of Bezier curves or surfaces is returned. Otherwise,
a single Bezier curve or surface is returned.
The returned Beziers will have BspDomainMin/Max attributes with the original
Bspline domain of the Bezier.
computes the alpha sector for TwoCrvs of E3 type or between a
curve and a point, CrvPt. Alpha varies between zero and one.
An alpha-sector is created where for Alpha equals zero, the created
surface will contain the first curve, and whereas for Tolerance equals
one, the created surface will contain the second curve.
For CrvPt case, if the Crv is E2, the alpha sector is a curve and if it
is E3, the alpha sector is a surface.
See also CBISECTOR2D, CBISECTOR3D.
computes the angular map of planar curve Crv. This bivariate map
corresponds pairs of locations in Crv with tangents that are Angle
degrees apart.
If, for example, Angle is 90 degrees, locations with orthogonal
tangents are identified. The zero set of this bivariate map provides the
actual correcpondence and this zero set is computed with Tolerance
accuracy, that approximately sets the number of desired surface samples.
If Tolerance is negative the function whose zero set is the angular
map is returned instead.
If DiagSpan is non zero, the angular diagonal span is sampled
DiagSpan samples and is computed instead.
The DiagSpan will provide for each parameter t the forward and
backward step that could be taken before hitting an angular span of
Angle degrees for the first time.
computes the Angular map of curve Crv ay angle Angle with
tolerance 30 and then extract the angular diagonal span with the same
parameters and 300 samples.
See provided figure for more insight. Shown is a given planar
curve, with three angular maps of 30, 60 and 90 degrees. The angular
diagonal span is also drawn in dark thin lines.
FIGURE:
Angular maps computed for the given planar curve on the left, at 30,
60, and 90 degrees, using CANGLEMAP. Also show is the angular diagonal
span in thin dark color.
See also CVIEWMAP, CVISIBLE, CARRANGMNT.
CurveType CARCLEN( CurveType Crv, NumericType Fineness, NumericType Order )
approximates an arc length curve out of the given curve Crv. The
new approximated curve is sampled with tolerance that is governed by
Fineness and will be of order Order.
The returned curve is not guaranteed to share the exact same trace as
the original curve Crv.
Example:
c2 = carclen( c, 1e-4, 3 );
approximates c as a quadratic arc length curve c2 by sampling
the original curve with tolerance 1e-4.
computes the integral area curve, ACrv, of the given curve Crv,
up to a sign. If Crv is a closed curve with domain t0 to t1, then the
difference of ACrv(t1) - ACrv(t0) is the requested area.
Example:
computations over the given arrangment of planar curves Crvs upto
accuracy that is governed by Eps. Operation can be one of:
1 - computes all the curve curve intersection locations in the
arrangment and keep the results in "InterPts" attributes on the
returned curves.
2 - computes all the curve curve intersection locations in the
arrangment and split all curves at all those intersections.
3 - computes Y-minimum lower envelop for this curves' arrangement.
4 - computes radial lower envelop around point Center Pt.
CenterPt is ignored if Operation is not equal to 4.
Example:
LinearLowEnv = carrangmnt( Crvs, 1e-12, 3, 0 );
computes the Y-minimum envelop of curve Crvs.
See provided figure for one example of Y-minimum envelop of curves.
FIGURE:
Y-minimum envelop for a set of curves, computed using CARRANGMNT.
The lower envelop is shown in thick lines.
See also CVIEWMAP, CVISIBLE, CANGLEMAP, CARNGMNT2.
computations over the given arrangment of planar curves Crvs upto
accuracy. Operation can be one of:
1 - create a new arrangment.
Params contains four items: (Tolerance for equality of end points,
Planarity tolerance to consider arrangement planar, TRUE to project all
curves to be on computed plane, Mask for input type to consider:
0x01 to handle polylines. 0x02 to handle curves. 0x04 to handle
trimming curves in trimmed surfaces).
2 - copy an arrangement.
Params contains no items.
3 - filter duplications in the input arrangement.
Params contains two items: (Epsilon to consider the curves the
same, TRUE to update end points to be the same).
4 - filter duplications in the tangential input arrangement.
Params contains one item: (Epsilon angle in degrees to consider
two curves with the same tangent).
5 - Splits curves at special points,
Params contains two items: (Mask for splitting type to consider:
0x01 to split at inflection pts | 0x02 to split at max curvatures |
0x04 to split at C1 disconts, Tolerance of splitting computation).
6 - Split piecewise curves at large angular deviation of
adjacent edges.
Params contains one item: (Angular deviation (in degrees) to
split linear curves at).
7 - Split curves at intersection locations.
Params contains one item: (Intersection computation tolerance).
8 - Splits curve near prescribed points.
Params contains three items: (Number of points to split curves
at, A list object of pts to examine and slit if near them, Tolerance
to consider a point near/on a curve).
9 - Merge adjacent curves.
Params contains one item: (Angular deviation (in degrees) to
merge C1 discont. curves at).
10 - Least square fit linear curves.
Params contains one item: (Fitting Parameter to fit smooth
quadratic C1 curves to linear curves. Higher order curves are not
affected. If Param positive, the fitted curve size is set to
InputCrvSize * FitC1Crv / 100 (i.e. Param serves as percetange of
input size). If Param negative, the Fitted curve size is simply set
to ABS(Param))
11 - Evaluate the curve arrangement.
Params contains one item: (TRUE to ignore hanging curves that
join other curves at only one of their end points).
12 - Classify the curve arrangement. This returns nothing.
Params contains one item.
13 - Report the result.
Params contains one item: (A mask of desired report:
0x01 to dump info on crvs | 0x02 to also dump the crvs |
0x04 to report end pts in arrangment if evaluated |
0x08 to report regions in arrangment if evaluated).
14 - Dumps to stdout information on the arrangement.
Params contains three item: (Style of expected output:
1 for individual crv segs in each region (loop etc.) or
2 for merged curves so every region is one curve or
3 for topology as an ordered list of curve segments and
each region is a list of indices into the first list.
A negative -i index means index i but a reversed crv.
101, 102, 103: same as 1,2,3 but pt is evaluated at 1/13
of curve parameteric domain to identify orientation,
Tolerance of topology reconstruction (in case 3 only),
Zoffset in Z for the i'th region, by amount i*ZOffset).
15 - Free a curve arrangement.
Params contains no item.
creates a Bezier curve out of the provided control point list. CtlPtList
is a list of control points, all of which must be of type (E1-E9 P1-P9),
or regular PointType defining the curve's control polygon. The curve's point
type will be of a space which is the union of the spaces of all points.
computes bi-arc fitting to a given curve Crv, with a tolarence
Tol in L-infinity sense, and a maximum angular span of each arc of
at most MaxAngle degrees. Returned is a list of arcs as rational
Bezier curves with an arc "center" point attribute to ease the reconstruction
of the analytic representation of the geometry.
computes bi-arcs fitting to a given curve in the shape of a human hand,
with arcs with at most 90 degrees and tolerance of 0.01.
FIGURE:
Bi-arcs are fitted to the given curve in the shape of a human hand,
at two different tolerances, using CBIARCS.
See also QUADCRVS, CUBICCRVS.
computes the self bisector curve(s) for Crv or the bisector(s)
of TwoCrvs or the bisector of a curve and a point, CrvPt. If
(bf ZeroSet) is TRUE, the zero-set surface is computed and is used mainly
for displaying the zero-set. If it is FALSE, the bisector is returned.
The zero-set is computing using the functions F1, F2 and F3 in the paper
Gershon Elber and Myung Soo Kim. ``Bisector Curves of Planar Rational
Curves.'' CAD, Vol 30, No 14, pp 1089-1096, December 1998} which is
determined by the BisectFunc parameter. If BisectFunc = 1, then
F1 is used and so on. Tolerance controls the accuracy of the
computation, with 10 as a good starting value. If Tolerance is
negative, NumerImprove can be either TRUE or FALSE, allowing or
disabling a final numerical improvement stage. SameNormal can also
assume a TRUE or FALSE value, selecting only opposite facing normals,
if TRUE.
The bisector curve of a curve (E2) and a point CrvPt is
computed analytically. Other parameters are ignored.
See also CBISECTOR3D, CALPHASECTOR, SBISECTOR.
computes the bisector surface TwoCrvs or the bisector surface of a
curve and a point, CrvPt, in R3. The BisectFunc determines the
function to be used for generating the bisector surface between the two E3
curves. If 1, a 3-space bisector surface is generated to the given
curves or a curve and a point. If 4, a surface whose zero set prescribes
the bisectors of the given curves is returned.
For a bisector between a curve and a point, the BisectFunc parameter
is ignored and a 3 space surface is always computed.
See also CBISECTOR2D, CALPHASECTOR, SBISECTOR.
computes a bisector surface of a Z parallel line and a circle in the
XY plane.
FIGURE:
(left) Bisectors of two quadratic Bezier curves in the plane. (right) A
bisector surface of a line and a circle in three space. See
the CBISECTOR2D and CBISECTOR3D functions respectively.
creates a B-spline curve out of the provided control point list, the
knot vector, and the specified order. CtlPtList is a list of control
points, all of which must be of type (E1-E9 P1-P9, or regular PointType
defining the curve's control polygon. The curve's point type will be of a
space which is the union of the spaces of all points.
The length of the KnotVector must be equal to the number of control
points in CtlPtList plus the Order. If, however, the length of
the knot vector is equal to #CtlPtList + Order + Order - 1, the curve
is assumed to be periodic.
The knot vector list may be specified as either list( KV_OPEN ),
list( KV_FLOAT ) or list( KV_PERIODIC ) in which a uniform
open, uniform floating or uniform periodic knot vector with the appropriate
length is automatically constructed.
creates a periodic curve and extracts its four polynomial domains as four
open end B-spline curves.
FIGURE:
A cubic periodic curve created using KV_PERIODIC end conditions.
compute the intersection point(s) of Crv1 and Crv2 in the
XY plane. Since this computation involves numeric operations, Epsilon
controls the accuracy of the parametric values of the result.
It returns a list of PointTypes, each containing the parameter of Crv1
in the X coordinate, and the parameter of Crv2 in the Y coordinate.
If, however, Epsilon is negative, a scalar field surface representing
the square of the distance function is returned instead.
If SelfInter is TRUE, Crv1 and Crv2 can be the same
curve, and self intersection points are searched for instead.
computes the parameter values of the intersection point of crv1 and
crv2 to a tolerance of 0.0001.
FIGURE:
A intersection point of two freeform curve computed using CCINTER.
computes the curvature field's magnitude square of Crv in the XY
plane if Operation is 1, or its extreme points if Operation equals
2. This set includes not only points of maximum (convexity) and mimumum
(concavity) curvature, but also points of zero curvature locations, such as
inflection points. A list of parameter value(s) of the location(s) with
extreme curvature along the Crv is returned in the latter case.
Since this operation is partially numeric, Epsilon is used to set
the needed accuracy.
If, however, Operation is 3, the input curve is being split at the
extreme curvature location and a list of curve segments is returned instead.
This function computes the (square of the) curvature scalar field for
planar curves as,
x' y'' - x'' y'
k(t) = ----------------
2 2 3/2
( x' + y' )
and computes (the square of) kN for three-dimensional curves as the
following vector field,
C' x C'' C' (C' x C'') x C'
k(t) N(t) = K(t) B(t) x T(t) = -------- x ----- = ---------------
3 | C' | 4
| C'| | C' |
The extremum values are extracted from the computed curvature field.
This (square of the) curvature field is a high order curve, even if the
input geometry is of low order. This is especially true for rational curves,
for which the quotient rule for differentiation is used and almost doubles
the degree in every differentiation.
See also CCRVTREVAL, CINFLECT, CNRMLCRV, CZEROS, CEXTREMES, and SCRVTR.
finds the extreme curvature points in Crv and displays them all
with the curve.
FIGURE:
Extreme curvature locations on a freeform curve computed using CCRVTR.
computes the topology changes in the curvature field of curve Crv as
control point index CtlPtIdx in the curve is moving. The motion of the
control points is limited to be between Min and Max in X and Y.
See MZERO for the meaning of the SubdivTol and NumerTol.
The returned value depends on Operation: If Operation is 0, a
multivariate of dim(Crv) + 1 that is representing the curvature topology field
is returned. If Operation is 1, the marching cubes of Operation == 0
is computed and returned as a polygonal surface. If Operation is 2 the
silhouette of 1 is computed and returned and if Operation is 3 the result
of 2 is evaluated back into Euclidean space.
FIGURE:
The Hodograph (thick) of a B-spline circle (thin) constructed as four
90 degrees rational Bezier arcs, computed using CDERIVE.
See also CINTEG, SDERIVE, TDERIVE, and MDERIVE
subdivides a curve into two sub-curves at the specified parameter value.
Curve can be either a B-spline curve in which Param must be
within the Curve's parametric domain, or a Bezier curve in which Param
can be arbitrary, extrapolating if not in the range of zero to one.
It returns a list of the two sub-curves. The individual curves may be
extracted from the list using the NTH command.
subdivides the curve Crv at the parameter value of 0.5.
FIGURE:
A B-spline curve is subdivided into two distinct regions using CDIVIDE.
See also SDIVIDE, TDIVIDE, and MDIVIDE
CurveType CEDITPT( CurveType Curve, CtlPtType CtlPt, NumericType Index )
provides a simple mechanism to manually modify a single control point number
Index (base count is 0) in the Curve, by substituting CtlPt
instead. CtlPt must have the same point type as the control points of
the Curve. The original curve Curve is not modified.
computes the offset envelope of a given planar curve Curve. The
offset envelope is the envelope of cones with apex on point on Curve
in the Z direction. Height is the height of the cone which also
equals the offset distance or the width of the cones. Tolerance
controls the accuracy of the offset approximation.
If the Curve is closed, two surfaces are created in the offset envelope,
one for the inside and another for the outside. If Curve is open, a single
envelope offset surface is computed, wrapping around both sides.
computes an envelope offset surface for a cubic Bezier curve c1 of
Height of 0.5 and Tolerance of 0.01.
FIGURE:
The envelope offset of a freeform planar curve computed using CENVOFF.
evaluates the provided Curve at the given Param value.
Param should be in the curve's parametric domain if the Curve is
a B-spline curve, or between zero and one if the Curve is a Bezier curve.
The returned control point has the same point type as the control points
of the Curve.
Example:
CPt = CEVAL( Crv, 0.25 );
evaluates Crv at the parameter value of 0.25.
See also SEVAL, MEVAL, TEVAL.
computes the extreme set of the given Crv in the given axis (1 for X,
2 for Y, 3 for Z). Since this computation is numeric, an Epsilon is
also required to specify the desired tolerance. It returns a list of
all the parameter values (NumericType) in which the curve takes an extreme
value.
Example:
extremes = CEXTREMES( Crv, 0.0001, 1 );
computes the extreme set of curve crv, in the X axis, with
error tolerance of 0.0001. See also CZERO.
FIGURE:
The X local extremums of a freeform curve are isolated using CEXTREMES.
computes the curvature field of planar curve E2Crv in the first form,
and reconstructs an E2 planar curve from the given curvature field
CrvtrE1Crv in the second form.
In the first form, Samples defines the numer of samples to use along
the input curve while if ArcLen TRUE the samples are also made along the
arc length of E2Crv.
In the second form, a planar curve is reconstructed from the curvature field
of CrvtrE1Crv, with Accuracy to control the accuracy. If the
reconstructed curve is suppose to be closed, set Periodic to TRUE.
In both forms, Order sets the order of the return curve.
computes the X- or Y-extreme values of the implicit univariate defined as
the zero set of Srf. In addition, this function also detects
hyperbolic tangent contact of Srf with the plane Z = 0. Dir
specified the desired direction of the extremum to extract, one of COL or
ROW.
See MZERO for the meaning of the SubdivTol and NumerTol.
Example:
ViewMap = CIEXTREME( Srf, col, 0.01, 1e-9 );
See figure for an example.
FIGURE:
An example of computing the X- and Y-extreme locations of this implicit
curve defined as the zero set of the surface. Also detected surface
tangency contacts with the plane Z = 0.
computes and returns a scalar field (the numerator of the curvature field,
the sign of the curvature field if you like) whose zeros are the inflection
points of Crv in the XY plane, if Operation is 1.
If Operation is 2, the inflection points are derived and returned as
list of all the parameter values (NumericType) in which the curve has an
inflection point.
Since this computation is partially numeric, an Epsilon is also
required to specify the desired tolerance.
If, however, Operation is 3, the input curve Crv is being split
at all the inflection points and the different, inflection free, curve
segements are returned in a list.
computes the set of inflection points of curve crv with error
tolerance of 0.001. This set is then scanned in a loop and
evaluated to the curve's locations which are then displayed with the crv.
See also CZEROS, CEXTREMES, and CCRVTR.
FIGURE:
The Inflection points of a freeform curve can be isolated using CINFLECT.
compute a B-spline curve that interpolates or approximates
the list of points in PtList or a given curve Crv. The
B-spline curve will have order Order and Size control points,
and will be periodic if periodic is non zero. The knots will be
spaced according to Param which can be one of PARAM_UNIFORM,
PARAM_CHORD, PARAM_CENTRIP or PARAM_NEILFOL or lists of parameter
values and knots (see below). The PARAM_UNIFORM prescribes a uniform
knot sequence, PARAM_CHORD specifies knot spacing according to the chord
length and PARAM_CENTRIP according to the square root of the chord length.
Finally, PARAM_NEILFOL takes into consideration the angles between three
consecutive points.
A periodic curve will be coerced to have a PARAM_UNIFORM knot sequence.
If Params is a list object, it should contain two lists of
numerical values. The first list contains the parameter values at which
to approximate or interpolate the data points. Hence, the length of this
list must equal the length of the PtList data. The second list
specifies the knot vector of the construct B-spline curve.
Use of Periodic end conditions can create cases with degenerated
linear systems (determinant equal zero). Increase or decrease of the
Order of the B-spline by one will resolve the problem.
All points in PtList must be of type (E1-E9, P1-P9) control point,
or regular PointType. If Size is equal to the number of points in
PtList, the resulting curve will interpolate the data set.
Otherwise, if Size is less than the number of points in PtList,
the point data set will be least square approximated. At no time can
Size be lower than Order. Size of zero forces
interpolation by selecting Size to be the size of the data set.
All interior knots will be distinct, preserving maximal continuity.
The resulting B-spline curve will have open end conditions.
Example:
pl = nil();
for ( x = 0, 1, 100,
snoc(point(cos(x / 5), sin(x / 5), x / 50 - 1), pl)
);
c = CINTERP( pl, 3, 21, PARAM_UNIFORM, false );
samples a helical curve at 100 points and least square fit of a quadratic
B-spline curve with 21 points to the data set. The curve will have a uniform
knot spacing and is not periodic. See also SINTERP, TINTERP and LINTERP.
FIGURE:
A Helix, sampled at 100 locations, is least square fitted using
CINTERP by a quadratic B-spline curve and 21 control points.
CurveType CIRCLE( VectorType Center, NumericType Radius )
constructs a circle at the specified Center with the specified
Radius. The returned circle is a B-spline curve of four piecewise Bezier
90 degree arcs. The construced circle is always parallel to the XY plane.
Use the linear transformation routines to place the circle in the appropriate
orientation and location.
defines a circular polygon in a plane perpendicular to Normal that
contains the Trans point. The constructed polygon is centered at
Trans. RESOLUTION vertices will be defined with Radius from
distance from Trans.
Alternative ways to construct a polygon are manual construction of the
vertices using POLY, or the construction of a flat ruled surface using
RULEDSRF.
reads the mouse coordinates as well as mouse events from displace devices,
or times out after TimeOut miliseconds. A list object
of two sub-objects, a points and a vector, named "_PickCrsr_" is returned.
These point and vector define the three-dimensional line of the mouse in
object space.
Mouse events are typically processed by the display device. However, by
the command "CLNTPICKCRSR" (in iritinit.irt) which sends a "PICKCRSR"
request to the display devices, mouse events will be sent to the server.
The server can be requested to keep mouse events for "CLNTCRSR" to be read
via the IritState command and the "CursorKeep" attribute.
Both the point and the vector will have a numeric attribute of "EventType"
that will have the following meaning:
1
Mouse motion event
2
Mouse down event
5
Mouse up event
In case of a time out the returned list object will be empty and will
have the name "_PickFail_".
reads one object from a client communication channel.
Handler contains the index of the communication channel opened via
CLNTEXEC. If no data is available in the communication channel, this
function will block for at most Block milliseconds until data is found
or timeout occurs. In the latter, a single StringType object is returned
with the content of "no data (timeout)". If Handler equals -1, the
regular display device (forked via, for example, VIEWOBJ command) is used.
See also VIEWSET, CLNTWRITE, CLNTCLOSE, and CLNTEXEC.
CurveType CMOEBIUS( CurveType Crv, NumericType Ratio )
rebalances the weights of a rational curve using the Moebius transformation.
The shape of the curve remains identical while the speed is modified.
Ratio controls the ratio between the last and the first weights. If
Ratio = 0, the first and last weights are made equal.
create a new curve which is a metamorph of the two given curves.
The two given curves must be compatible (see FFCOMPAT) before this blend
is invoked. This is very useful if a sequence that "morphs" one curve to
another is to be created. Several metamorphosis methods are supported
according to the value of Method,
0
Simple convex blend.
1
Corner/Edge cutting scheme, scaled to same curve length.
2
Corner/Edge cutting scheme, scaled to same bounding box.
3
Same as 1 but with filtering out of tangencies.
4
Same as 2 but with filtering out of tangencies.
5
Multiresolution decomposition based metamorphosis. See CMULTRES.
In Method 1, Blend is a number between zero (Crv1)
and one (Crv2) defining the similarity to Crv1 and Crv2,
respectively. A single curve is returned.
In Methods 2 to 5, Blend is a step size for the
metamorphosis operation and a whole list describing the entire
metamorphosis operation is returned.
Examples:
for ( i = 0, 1, 300,
c = CMORPH( crv1a, crv1b, 0, i / 300.0 ):
color( c, yellow ):
viewobj( c )
);
crvs = CMORPH( crv1a, crv1b, 2, 0.003 );
snoc( crv1b, crvs );
for ( i = 1, 1, sizeof( crvs ),
c = nth( crvs, i ):
color( c, yellow ):
viewobj( c )
);
Turtle2 = ffmatch( Wolf, Turtle, 20, 100, 2, false, 2 );
ffcompat( Wolf, Turtle2 );
for ( i = 0, 1, 25,
c = CMORPH( Wolf, Turtle2, 0, i / 25 ):
color( c, yellow ):
viewobj( c )
);
creates three metamorphosis animation sequences, one that is based on
a convex blend, and two that are based on corner/edge cutting schemes.
See also PMORPH, SMORPH, TMORPH, and FFMATCH.
FIGURE:
A morphing sequence using convex blend (top left), edge cutting
(top right), and using FFMATCH and convex blend (bottom).
computes a multiresolution decomposition of curve Crv using least
squares approximation, if LeastSquares is TRUE, or using B-Wavelets
if LeastSquares is FALSE. The latter is optimal but slower.
The resulting list of curves describes an hierarchy of curves in linear
subspaces of the space in which Crv lay.
If LeastSquares is TRUE, the curves could be summed algebraically to
form Crv. Each of the curves in the hierarchy is a least squares
approximation of Crv in the subspace in which it is defined.
If LeastSquares is FALSE, a list of orthogonal
projections of the Crv onto the prescibed subspaces (by the knot
sequences) is provided.
Finally, Discont is a Boolean flag that controls the way tangent
discontinuities are preserved throughout the decomposition. If, however,
Discont is -1, LeastSquares will indicate the index of the knot in Crv
to compute its BWavelet function.
Example:
MRCrv = CMULTIRES( Animal, false, true );
sum = nth( MRCrv, 1 );
MRCrvs = list( sum * tx( 3.0 ) );
for ( ( i = 2 ), 1, sizeof( MRCrv ),
sum = symbsum( sum, nth( MRCrv, i ) ):
snoc( sum * tx( ( 3 - i ) * 1.5 ), MRCrvs )
);
All = MRCrvs * sc ( 0.25 );
view( All, on );
computes a multiresolution decomposition to curve CrossSec as
MRCrv and displays all the decomposition levels by summing them all
up. The use of none as on object name allows one to display an
object in the display device without replacing the previous object in the
display device, carrying the same name.
This creates two metamorphosis animation sequences, one based on
a convex blend and one based on a corner/edge cutting scheme.
FIGURE:
A multiresolution decomposition of a curve of an animal using
least squares. The original curve is shown on the left.
symbolically computes a vector field curve representing the non-normalized
normals of the given curve. That is, a normal vector field, evaluated at
t, provides a vector in the direction of the normal of the original
curve at t. The normal curve once computed is in fact equal to kN where
k is the curvature of Crv and N is its normal.
compute the convex hull of the given set of Poly or Curve
with tolerance for curves only, which is governed by the polygon subdivision
accuracy as set via FineNess. FineNess is ignored for polylines.
For curves, the result might be partial if the curve is not closed or
periodic. See also CRV2TANS and CRVPTTAN.
Example:
Pts1 = nil();
Pts2 = nil();
for ( i = 0, 1, 7,
R = 0.2 + fmod( i, 2 ) / 2:
Pt = ctlpt( E2, R * cos( i * 2 * pi / 8 ), R * sin( i * 2 * pi / 8 ) ):
snoc( Pt, Pts1 ):
snoc( coerce( Pt, point_type ), Pts2 ) );
Crv = coerce( cbspline( 4, Pts1, list( KV_PERIODIC ) ), KV_OPEN );
CHPts = CNVXHULL( poly( Pts2, 0 ), 0 );
CHCrv = CNVXHULL( Crv, 10 );
computes the convex hull of a given control polygon and freeform curve.
FIGURE:
A convex hull of a set of points and of a freeform B-spline curve.
The left show a convex hull of a set of points. The right shows the
convex hull (thick line) of a freeform curve.
provides a coercion mechanism between different objects or object types.
PointType, VectorType, PlaneType, and CtlPtType can be all coerced to each
other by using the NewType of POINT_TYPE, VECTOR_TYPE, PLANE_TYPE,
or one of E1-E9, P1-P9 (CtlPtType). Similarly, CurveType, SurfaceType,
TrimSrfType, TriSrfType, TrivarType, and MultivarType can all be coerced to
hold different CtlPtType control points, or even different open end
conditions from KV_PERIODIC to KV_FLOAT to KV_OPEN. Freefroms can be
coerced to a Power, Bezier or a B-spline type via the NewType of
POWER_TYPE, BEZIER_TYPE or the BSPLINE_TYPE.
If a scalar (E1 or P1) curve is coerced to E2 or P2 curve or
a scalar (E1 or P1), the surface is coerced to an E3 or P3 surface, and the
Y (YZ) coordinate(s) is (are) updated to hold the parametric domain of the
curve (surface). That is X = U (Y = V).
Curves, Surfaces, and Trivariates can be coerced to/from Multivariates
using the CURVE_TYPE, SURFACE_TYPE, TRIVAR_TYPE and MULTIVAR_TYPE.
coerces Crv to a new curve that will have an E2 CtlPtType control
points. Coerction of a projective curve (P1-P9) to a Euclidean curve
(E1-E9) does not preseve the shape of the curve. The second example
coerces a bivariate MultiVar into a Srf and back and compares
the result to the original multivariate MultiVar... The third
example coerces a B-spline surface BspSrf to a Bezier form, returning
one or more Bezier surfaces representing the same geometry as BspSrf.
symbolically compute the composition curve Crv1(Crv2(t)) or
Srf(Crv(t)). In the above first form of Crv1(Crv2(t), Crv1
can be any curve while Crv2 is assumed to be a one-dimensional curve
that is either E1 or P1 (higher dimensions are ignored).
In the above second form of Srf(Crv(t)), the Srf can be any surface,
while the Crv is assumed to be a two-dimensional curve, that is either E2
or P2 (higher dimensions are ignored). Both Crv2 in the curve's composition,
and Crv is the surface's composition must be contained in the curve or
surface parametric domain.
composes a circle Crv to be on the surface Srf.
FIGURE:
A circle in the parametric space of the freefrom surface is composed
to create a closed loop curve on the surface using COMPOSE.
creates a truncated CONE geometric object, defined by Center as the
center of the main base of the CONE, with the Direction as both the CONE's
axis and the length of CONE, and the two radii Radius1/2 of the two bases
of the CONE. If Caps equals zero, no caps are created. If Caps equal
one (two), only the bottom (top) cap is created. If Caps equal three,
both the top and the bottom caps are created.
Unlike the regular cone (CONE) constructor which inherits
discontinuities in its generated normals at the apex, CON2 can be used to
form a (truncated) cone with continuous normals.
See RESOLUTION for the accuracy of the CON2 approximation as a polygonal
model. See also CONE. See IRITSTATE's "PrimRatSrfs" and "PrimRatSrfs"
state variables.
constructs a truncated cone with bases parallel to the XY plane at
Z = -1 and Z = 3, and with radii of 2 and 1 respectively. Both
caps are created.
FIGURE:
A cone (left) can be constructed using the CONE constructor and
a truncated cone (right) using the constructor CONE2.
creates a CONE geometric object, defined by Center as the center of
the base of the CONE, Direction as the CONE's axis and height, and
Radius as the radius of the base of the CONE. If Caps equals
zero, no cap is created. If Caps equal one, the bottom
(top) cap is created.
See RESOLUTION for accuracy of the CONE approximation as a polygonal model.
constructs a cone based in an XY parallel plane, centered at the origin
with radius 1 and with tilted apex at ( 1, 1, 1 ). Only the bottom cap is
created.
See IRITSTATE's "PrimRatSrfs" and "PrimRatSrfs" state variables.
See also CON2.
In the first form, this will construct a quadratic form that represents the
planar conic section prescribed by the list of six coefficients ABCDEF as:
A x^2 + B xy + C y^2 + D x + E y + F = 0,
The conic will be parallel to the XY plane at Z level of Zlevel.
The section of the curve will be from StartPoint to EndPoint,
or alternatively, unlimited by specifying 'off' for StartPoint and
EndPoint. The conic might be rational (for circles and ellipses, for
example) or intergral (for parabolas).
Alternatively, in the second form, if the first list object
parameter contains two planar curves in the XY plane, a piecewise linear
curve at Z level of Zlevel is computed that presents the
elliptic/hyperbolic distance Dist from the given two curves.
The elliptic distance refers to the sum of distance (that equal
Dist) to the two curves, while hyperbolic distance refers
to the difference of distances. Finally, if EvalCurve = 0, the
surface whose zero set is the desired curve, is returned instead. If
EvalCurve = 1, distance curves are returned in the parametric
space as correspondence between the two curves' parameters. If
EvalCurve = 2, the conic curves themselves are returned.
Note only elliptic surfaces are compact and are reconstructed in whole.
contours surface ContouredSrf by intersecting plane ContourPlane
with a polygonal approximating ContouredSrf with resolution set
via variable RESOLUTION (10 is a good starting resolution value, 20 is
extreme).
If ContouredSrf is a scalar field surface of type E1 or P1 and
MappedSrf is provided, ContouredSrf is contoured above its
parametric domain (U is X, V is Y) and the resulting parametric curve
is composed with MappedSrf to yield the returned value.
Further, if ValidatePt is prescribed, it should contain two elements,
a vector, V, and an angle, A, in degrees. Only the contour points for which
the normal of surface MappedSrf there has less than A degrees from V
are returned.
computes the normal field of the surface glass, projects it onto
the viewing direction of (1, 1, 1) and contours the resulting scalar field
with the plane X = 0, to extract the silhouette curves from viewing direction
(1, 1, 1).
FIGURE:
Computes the silhouette of a freeform glass surface from viewing
direction (1, 1, 1). On the left, the original view is seen. On the
right, a different, general, view is provided.
convert non-convex polygons in Object, into convex ones. New vertices
are introduced into the polygonal data during this process. The Boolean
operations require the input to have convex polygons only (although it may
return non convex polygons...) and it automatically converts non-convex input
polygons into convex ones, using this same routine.
However, some external tools (such as irit2ray and poly3d-h) require convex
polygons. This function must be used on the objects to guarantee that
only convex polygons are saved into data files for these external tools.
Example:
CnvxObj = CONVEX( Obj );
save( "data", CnvxObj );
converts non-convex polygons into convex ones, so that the data file can be
used by external tools requiring convex polygons.
AnyType COORD( AnyType Object, NumericType Index )
extracts an element from a given Object, at index Index. From
a PointType, VectorType, PlaneType, CtlPtType and MatrixType. A NumericType
is returned with Index 0 for the X axis, 1 for the Y axis etc.
Index 0 denotes the weight of CtlPtType. For a PolygonType that
contains more than one polygon, the Indexth polygon is returned. For
a PolygonType that contains a single Polygon, the Indexth vertex is
returned. For a freeform object (curve, surface, etc.), the Indexth
CtlPtType is returned. For a ListType, COORD behaves like NTH and returns the
Indexth object in the list. For a StringType, the Indexth
character is returned as its ASCII numeric code.
Example:
a = vector( 1, 2, 3 );
vector( COORD( a, 0 ), COORD( a, 1 ), COORD( a, 2 ) );
a = ctlpt( P2, 6, 7, 8, 9 );
ctlpt( P3, coord( a, 0 ), coord( a, 1 ), coord( a, 2 ), coord( a, 3 ) );
a = plane( 10, 11, 12, 13 );
plane( COORD( a, 0 ), COORD( a, 1 ), COORD( a, 2 ), COORD( a, 3 ) );
constructs a vector/ctlpt/plane and reconstructs it by extracting the
constructed scalar components of the objects using COORD.
computes a coverage for an iso surface of a trivariate function TV,
using curves. NewOfStrokes strokes are distributed on the iso surface
with a length that is set via MinMaxPwrLen. MinMaxPwrLen is
a triplet of the form (Min, Max, Power) that determines the length of the
strokes as,
Avg = (Max + Min) / 2, Dev = (Max - Min) / 2
Length = Avg + Dev * Random(0, 1) ^ Pwr.
StepSize controls the steps size of the piecewise linear approximation
formed and should typically be smaller than Min.
StrokeType can be one of,
1
Draw strokes along minimal principal curvature.
2
Draw strokes along maximal principal curvature.
3
Draw strokes along both principal curvatures.
4
Draw strokes along constant X planes.
5
Draw strokes along constant Y planes.
6
Draw strokes along constant Z planes.
IsoVal controls the constant value of the iso surface level.
See also ADAPISO, COVERPT, MRCHCUBE, TVLOAD.
Finally, ViewDir is the direction of view, used for silhouette computation.
draws 500 strokes on the iso surface of trivariate ThreeCyls at iso
value IsoVal and step size of 0.2. Strokes are drawn in length of
3 to 10 along lines of curvatures of minimal curvature.
FIGURE:
A uniform coverage of 500 curved strokes of an iso surface of a
trivariate function, computed using COVERISO command.
computes a uniform point distribution on the given polygonal Model.
Approximately NumOfPts points are uniformly distributed on the
model's surface, provided ViewDir is the zero vector.
If ViewDir is a non zero vector, the distribution is made to be
uniform from this given viewing direction.
In all cases, NumOfPts is an upper bound of the the real number of
distributed points, which will be in the same order.
computes two uniform distributions of 1000 and 3000 points on Solid1.
Pts1 is uniform in three space, while Pts2 is viewed
uniform from the -Z direction.
FIGURE:
A uniform coverage of 1000 and 3000 points of a polygonal model in
three space, computed using the COVERPT command. On the left, the
distribution is directional, from the viewing direction, while on
the right, shows a point distribution that is uniform in 3-space.
Distant points are smaller, emulating point depth cueing.
creates a polynomial/rational curve out of the provided control point list.
The created curve is employing the monomial power basis. CtlPtList is a
list of control points, all of which must be of type (E1-E9 P1-P9), or
regular PointType defining the curve's control polygon. The curve's point
type will be of a space which is the union of the spaces of all points.
constructs a quadratic power basis curve, coerces it to a Bezier form,
coerces the Bezier form back to the power basis, and then compares the result
for equality.
raises the 90 degrees corner Bezier curve Crv to be a quadratic.
FIGURE:
Raises a 90 degrees corner quadratic Bezier curve to a quintic
using CRAISE. The control polygons are also shown.
See also CREDUCE, TRAISE, SRAISE, and MRAISE.
computes all circles that are bi-tangent to the given two curves Crv1
and Crv2. The circles will posses a radius of Radius. The
accuracy of the computation is governed by the tolerance Tol. Returned
is a list center point locations with "Params" attributes of parameter values
of the tangent locations at the two curves.
Example:
Cntrs = CRC2CRVTAN( c1, c2, R, 1e-3 );
computes all the circles of radius 0.1 that are bi-tangent to the two
curves c1 and c2. Tolerance of computation is 1e-3.
FIGURE:
Computes all the bi-tangent circles to the given two curves via
the CRC2CRVTAN function.
See also SKEL2DINT, CRV2TANS, TNSCRCR.
reduces the Curve to the NewOrder Order specified. This function
approximates the lower order curve in the infinity norm sense, minimizing
the maximal deviation between the original curve Curve and the low
order curve NewOrder. NewOrder will identify with Curve
only if Curve was degree raised before.
provides the ability to Replace a knot vector of Curve, or refine
it. KnotList is a list of knots at which to refine Curve. All knots
should be contained in the parametric domain of the Curve. If the knot
vector is replaced, the length of KnotList should be identical to the
length of the original knot vector of the Curve. If Curve is a
Bezier curve, it is automatically promoted to be a B-spline curve.
refines Crv and adds three new knots at 0.25, 0.5, and 0.75.
FIGURE:
Refines a 90 degrees corner quadratic Bezier curve at three interior
knots (the result is a B-spline curve) using CREFINE.
The control polygons are also shown.
See also SREFINE, TREFINE, and MREFINE.
extracts a region from the Curve between MinParam and MaxParam.
Both MinParam and MaxParam should be contained in the
parametric domain of the Curve, except for Bezier curves when
MinParam and MaxParam can be arbitrary (extrapolating if not
between zero and one).
Example:
SubCrv = CREGION( Crv, 0.3, 0.6 );
extracts the region from the Crv from the parameter value 0.3 to the
parameter value 0.6.
FIGURE:
Extracts a sub region from a curve using CREGION.
See also SREGION, TREGION, and MREGION.
reparametrizes the Curve over a new domain from MinParam to MaxParam.
This operation does not affect the geometry of the curve and only affine
transforms its knot vector. A Bezier curve will automatically be promoted
into a B-spline curve by this function.
If MinParam equals MaxParam and both equates with one of the
parameterization keywords of PARAM_UNIFORM, PARAM_CENTRIP, PARAM_CHORD, or
PARAM_NIELFOL, then that parametrization is approximated for the curve, by
changing the knot sequence. Note this last operation affects the geometry
of the curve.
sets the domain of the given two curves to be from zero to ten. The
Bezier curve arc1 is promoted to a B-spline curve.
See also SREPARAM, TREPARAM, and MREPARAM.
computes all the bi-tangents of Crv, in the XY plane. That
is, all lines that are tangent to Crv at two different locations.
A list of points with X and Y coefficients representing the
parametric locations on Crv of the bi-tangent is returned. FineNess
controls the numerical accuracy of the computation. A value of 10 will
provide a good start and the larger this number is, the better the
accuracy will be. See also CRVPTTAN and CNVXHULL.
Example:
Tans = nil();
Crv2Tns = Crv2Tans( Crv, 10 );
for ( i = 1, 1, sizeof( Crv2Tns ),
pt = nth( Crv2Tns, i ):
snoc( ceval( Crv, coord( pt, 0 ) ) +
ceval( Crv, coord( pt, 1 ) ), Tans ) );
finds the bi-tangents of Crv and converts them to a set of line
segments.
FIGURE:
Computes the bi-tangents of a freeform curve, using CRV2TANS.
See also CRC2CRVTAN, TNSCRCR
computes the (gamma) kernel of a given planar curve Crv. If
Gamma is zero, regular kernel is computed. Else, the gamma curves of
Gamma degrees is being computed. If Euclid is TRUE then the
result is returned in the Euclidean space, or if zero, in the parametric
space.
Mode can be 0 for a (gamma) kernel solution, 1 to extract silhouette
sampling only out of the trivariate function, and 2 for the gamma kernel
surface/trivariate functions themselves to be returned.
Fineness controls the refinement that is applied to the numeric
solution. For Mode 0 it sets the number of knots to insert into
the (x, y, t) trivariate function. In Mode 2, it lists two numeric
values, the subdivision and numeric tolerances, of the silhouette extraction
process (See MZERO for their meaning). In Mode 2, it controls the
extent of the surfaces/trivariates.
compute the closest (if IsMinDist is TRUE, farthest if FALSE) point
on the Curve to the line specified by PtOnLine and LnDir as a
point on the line and a line direction.
Since this operation is partially numeric, Epsilon is used to set
the needed accuracy. It returns the parameter value of the location on
Crv closest to the line.
If, however, Epsilon is negative, -Epsilon is used instead,
and all local extrema in the distance function are returned as a list
(both minima and maxima).
If the line and the curve intersect, the point of intersection is
returned as the minimum.
finds the closest point on Crv to the line defined by linePt
and lineVec.
FIGURE:
Computes the locations on the freeform curve with local extreme
distance to the given line, using CRVLNDST.
NumericType CRVPTDST( CurveType Crv, PointType Point, NumericType IsMinDist,
NumericType Epsilon )
or
ListType CRVPTDST( CurveType Crv, PointType Point, NumericType IsMinDist,
NumericType Epsilon )
compute the closest (if IsMinDist is TRUE, farthest if FALSE) point
on Crv to Point.
Since this operation is partially numeric, Epsilon is used to set
the needed accuracy. It returns the parameter value of the location on
Crv closest to Point.
If, however, Epsilon is negative, -Epsilon is used instead,
and all local extrema in the distance function are returned as a list
(both minima and maxima).
Example:
Param = CRVPTDST( Crv, Pt, FALSE, 0.0001 );
finds the farthest point on Crv from point Pt.
FIGURE:
Computes the locations on the freeform curve with local extreme
distance to the given point, using CRVPTDST.
computes all the tangents to Crv that go through point Pt,
all in the XY plane. A list of points with X and Y
coefficients representing the parametric locations on Crv of the
bi-tangent is returned. FineNess controls the numerical accuracy of
the computation. A value of 0.01 will provide a good start, and the smaller
this number is, the better the accuracy will be. See also CRV2TANS and
CNVXHULL.
Example:
Tans = nil();
Pt = point( 2, 0, 0 );
CrvPtTns = CrvPtTan( Crv, Pt, 0.01 );
for ( i = 1, 1, sizeof( CrvPtTns ),
snoc( ceval( Crv, nth( CrvPtTns, i ) ) + coerce( Pt, e3 ), Tans ) );
finds the tangents of Crv through Pt and converts them to a
set of line segments.
FIGURE:
Computes the tangents of a freeform curve through a point,
using CRVPTTAN.
constructs a polynomial approximation of a spiral planar curve of
NumLoops loops and specified Pitch. The curve is approximated
as a least sqaures fit of Samples samples and CtlPtsPerLoop
control points per loop.
Example:
Spiral = cspiral( 5, 0.7, 500, 6 );
See figure for this spiral of 5 loops.
FIGURE:
Approximates a spiral curve using CSPIRAL.
extract an isoparametric curve out of Srf in the specified
Direction (ROW or COL (or DEPTH for triangular surface) at the
specified parameter value Param.
Param must be contained in the parametric domain of Srf in
Direction direction.
The returned curve is in the surface Srf.
Example:
Crv = CSURFACE( Srf, COL, 0.45 );
extracts an isoparametric curve in the COLumn direction at the parameter
value of 0.15 from surface Srf.
See also CMESH, COMPOSE, STRIVAR, MFROMMV.
FIGURE:
Extracts an isoparametric curve from the given surface, using CSURFACE.
constructs a single control point to be used in the construction of curves
and surfaces. Points can have from one to five dimensions, and may be
either Euclidean or Projective (rational). Point type is set via the
constants E1 to E9 and P1 to P9. The coordinates of the point are specified
in order; weight is first if rational.
constructs an E3 point at the origin and a P2 rational point with
a weight of 0.707. The Projective Pi points are specified as
CTLPT(Pn, W, W X1, ... , W Xn).
extracts the trimming curves of a trimmed surface TSrf.
If Parametric is not zero, then the trimming curves are extracted
as parametric space curves of TSrf. Otherwise, the trimming curves
are evaluated into Euclidean space as curves on the surface TSrf.
Example:
TrimCrvs = CTRIMSRF( TrimSrf, FALSE );
extracts the trimming curves of TrimSrf as Euclidean curves on
TrimSrf.
FIGURE:
Extracts the trimming curves in Euclidean space (middle) and
parametric space (right) of a trimmed surface (left), using CTRIMSRF.
approximates given curve Crv using piecewise cubic curves upto
the prescribed tolerance Tolerance. If MaxLen is positive it
is used to limit the arc length of the cubic curves' segments.
Example:
PCubicCrvs = CUBICCRVS( Crv, 0.01, 0.5 );
creates a piecewise cubic approximation to curve Crv upto tolerance 0.01
and maximal arc length of cubic segments of 0.5. See also QUADCRVS, CBIARCS.
computes algebraic constraints that reflects the visible domain of planar
curve Crv as seen from direction prescribed by planar vector curve
ViewCrv. ViewCrv is typically a unit circle curve, parametrizing
all possible (360 degrees) planar views.
See MZERO for the meaning of the SubdivTol and NumerTol
tolerances.
If TrimInvisible is FALSE, the return set prescribes the 2D silhouette
locations on Crv from the specific view direction. If
TrimInvisible is TRUE, attempt ismade to remove the invisile portions.
Result is returned as 3D polylines, in (t, v, r) space where t and r
parametrize Crv and v parametrizes ViewCrv. This, since a
silhouette point Crv(t) could hide a independent curve location Crv(r).
computes the visible regions of planar curve Crv as seen from
either view point Pt or from view direction Dir. Eps
controls the accuracy of the computation. Dir must have its Z
components zero, whereas Pt's Z coefficient must be one.
Example:
Crvs = CVISIBLE( c, Pt, 1e-5 );
See figure for a example.
FIGURE:
The visibility of the given curve on the left is sampled along its 360
degrees to create a visibility atlas of the curve on the right,
using CVISIBLE. Then SETCOVER is used to find the minimal set that can
see the entire curve, esselntially solving the so-called art-gallery
problem.
See also CANGLEMAP, CVIEWMAP, CARRANGMNT, SETCOVER.
creates a CYLINder geometric object, defined by Center as the center of
the base of the CYLINder, Direction as the CYLINder's axis and height,
and Radius as the radius of the base of the CYLINder.
If Caps equals zero, no caps are created. If Caps equal
one (two), only the bottom (top) cap is created. If Caps equal three,
both the top and the bottom caps are created.
See RESOLUTION for the accuracy of the CYLINder approximation as a
polygonal model. See IRITSTATE's "PrimRatSrfs" and "PrimRatSrfs" state
variables.
constructs a cylinder with two caps of radius 10 along the X axis
from the origin to X = 1.
FIGURE:
A cylinder primitive can be constructed using the CYLIN constructor.
computes the zero set of the given Crv in the given axis (1 for X,
2 for Y, 3 for Z). Since this computation is numeric, an Epsilon is
also required to specify the desired tolerance. It returns a list of
all the parameter values (NumericType) the curve is zero.
computes the X zero set of curve cb with error tolerance
of 0.001. This set is then scanned in a loop and evaluated to
the curve's locations, which are then displayed.
See also CINFLECT.
FIGURE:
Computes the zero set of a given freeform curve, in the given axis,
using CZEROS.
computes the distance function between the two given freeform shapes.
The returned variety is bi-variate, tri-variate, or a four-variate, depending
on the dimensionality of the input, in order. Based on DistType, the
following distance functions could be used:
DistType Value
Description
0
Computes the distance vector function, (V1 - V2).
1
Computes the distance square function, (V1 - V2)^2.
2
Projection of the distance vector onto the normal
field of the first varietly, < V1 - V2, N1 >.
3
Projection of the distance vector onto the normal
field of the second varietly, < V1 - V2, N2 >.
In cases 2 and 3, the normal field is not a unit field.
computes a bound on the minimal and maximal distance square between the
given two curves, by computing a bounding box on this scalar distance square
field.
defining the ellipse of minimal area that bounds these 3 points Pti.
computation is conducted in the XY plane, with Z ignored. If Offset
is not zero, the ellipse is offset approximated by Offset amount.
creates three random points in the XY plane and compute the implicit
minimal area ellipse for these three points. the Ellipse is realized
geometrically using the ConicSec function.
See also CONICSEC, IMPLCTTRANS, QUADRIC, MAP3PT2EQL.
compute the evolute of a curve or a surface.
For curves, the evolute is defined as,
N(t)
E(t) = C(t) + ----
k(t)
where N(t) is the unit normal of C(t), and k(t) is its curvature.
E(t) is computed symbolically as the symbolic sum of C(t) and
N(t) / k(t).
For surfaces, this function computes the mean evolute which is equal to,
n(u, v)
E(u, v) = S(u, v) + ---------
2 H(u, v)
where n(u, v) is the unit normal of S(u, v), and H(u, v) is its mean
curvature. E(u, v) is computed symbolically.
The result of this symbolic computation is exact (upto machine precision),
unlike similar operations such as OFFSET or AOFFSET, that are only
approximated.
create an extrusion of the given Object. If the Object is a
PolygonObject, its first polygon is used as the base for the extrusion in
Dir direction. If the Object is a CurveType, an extrusion surface is
constructed. If the Object is a SurfaceType, an extrusion trivariate
is constructed. If the Object is a ListType, a list of extruded objects
is created for the objects found in Object.
If Caps equals zero, no caps are created. If Caps equal one
(two), only the bottom (top) cap is created. If Caps equal three,
both the top and the bottom caps are created.
Note that caps are created for a closed Object only, so the Object
must be either a polygon or a closed curve for caps to be generated.
Direction Dir cannot be coplanar with the polygon plane. The curve
may be nonplanar.
constructs a closed cross section Cross by duplicating one half of
it in reverse and merging the two sub-curves. Cross is then used as
the cross section for the extrusion operation.
FIGURE:
An extrusion of a freeform curve using EXTRUDE to create a freeform
surface.
compares the given two curves, Crv1 and Crv2 for an
identical trace. Curves could have identical trace while with
different degrees (via degree raising of one of them), differet knot
sequences (by applying refinements to either curves or both), or even
different speed (via composition). This function reduces both curves
to a canonical representation by reverse engineering unnecessary
degree raising, refinements, or composition and then compare the two
curves upto the given tolerance Tolerance.
Returned is a list of 5 numeric values. The first number equals 1
if the curves are the same, 2 if the are the same but domain is not
exactly the same, or 3 f the curves are different. The other four numbers
in the list are the domains of the two given curves that overlap as
(Start1, End1, Start2, End2).
make the given two curves or surfaces compatible by making them share
the same point type, the same curve type, the same degree, and the
same continuity. The same point type is gained by promoting a lower
dimension into a higher one, and non-rational to rational
points. Bezier curves are promoted to B-spline curves if necessary,
for curve type compatibility. Degree compatibility is achieved by
raising the degree of the lower order curve. Continuity is achieved
by refining both curves to the space with the same (unioned) knot
vector. This function returns nothing and compatibility is made in place}.
compute a bound on the extreme values a curves Crv or surface
Srf can assume. Returned control points provide a bound on the
minimum (maximum) values that can be assumed if Minimum is TRUE
(FALSE).
Example:
Bound = FFEXTREME( Srf, false );
computes a bound on the maximal values Srf can assume.
computes a reparametrization to Crv2 so it fits Crv1, the best
under some prescribed norm, NormType. Currently the following norms
are valid for NormType
Value
Description
1
Suitable for ruled and blended curves, for modeling.
See RULEDSRF.
2
Suitable for metamorphosis of curves. See CMORPH.
3
Distance norm in "walking the dog" notion.
4
Bisector (skeleton) matching norm for two curves.
Whenever negative norms can result (for example, in cases were self
intersection cannot be prevented in ruled surface constructions), one can
allow negativity with no extra penalty by applying negative NormType.
Use of positive-only norms would yield no output at all if no matching
with positive weights can be established, whereas allowing negative
norm values would result in a globally optimal result, but with possible
self intersectiions.
The reparametrization is computed by sampling a fixed set of size
Samples off both curves, and fitting a B-spline curve of length
Reduce as the reparametrization curve. Hence, Reduce must
be less than or equal to Samples. The reparametrization curve
will have order of ReparamOrder. If Rotate is TRUE or ON,
then attempt is made to rotate the reparametrization of the
curves. Rotation can be used on closed curves only.
merge the scalar curves/surfaces/multivariates in the list of curves
E1Curves or list of surfaces E1Surfaces or list of
multivariates E1Multivars to one vector curve/surface/multivariate
of point type PointType.
Example:
Srf = FFMERGE( list( SrfW, SrfX, SrfY ), P2 );
merges three scalar surfaces into a single surface with point type P2.
See also FFSPLIT.
returns the size of the control mesh/polygon of the given freeform
in a list.
See Also MESHSIZE, FFMESH, FFPTTYPE, FFGTYPE, FFCTLPTS, FFKNTVEC, FFORDER,
PDOMAIN.
compute a uniform point distribution for Crv or Srf. If
Param is FALSE, the distribution is selected to be uniform in the
Euclidean space; otherwise if TRUE, the distribution is made uniform in the
parametric space. NumOfPts sets the number of points in the
distribution.
The returned list of points prescribes parameter values in the freeforms.
For Crv, the returned list is a list of reals, in the parameter space
of Crv. For Srf, the returned list is a list of points, whose
X and Y coefficients hold the U and V parameters of Srf.
See also COVERPT.
computes the distribution of 100 points in curve c1 which has
highly nonuniform speed characteristics. Two distributions are computed,
one to be uniform in the parametric space and one to be uniform in the
Euclidean space.
FIGURE:
(top) A distribution of 30 points uniformly in Euclidean space.
(bottom) A distribution of 30 points uniformly in parameteric space.
Both examples were computed using FFPTDIST.
ListType FFSPLIT( CurveType Crv )
or
ListType FFSPLIT( SurfaceType Srf )
or
ListType FFSPLIT( MultivarType MV )
split the given curve Crv or surface Srf or multivariate MV
into its scalar components that are returned as a list of scalar
curves/surfaces/multivariates.
fits a primitive object to the given polygonal model, PlObj.
The numeric fitting process is controled via a bound on the number of
iterations NumIters and the resulting tolerance of the fit that is
required, Tol. Returned is a list of numeric values with the
error of the fit as the first value. The rest of the list numeric values
are the coefficients of the algebraic fitted form (see table below).
FitType can be one of:
0
A Planar face. Returned list holds (A, B, C, D), the four
coefficients of the plane equation.
1
A Sphere. Returned list holds (Xcntr, Ycntr, Zcntr, Radius)
of the fitted sphere.
2
A Cylinder. Returned list holds (Xcntr, Ycntr, Zcntr,
Xdir, Ydir, Zdir, Radius) of the fitted cylinder.
3
A Circle. Returned list holds (Xcntr, Ycntr, Radius) of
corrects inconsistencies in polygonal geometry, between normals of polygons
and normals at the vertices based on TrustInfo. If TrustInfo is
0
Trust the normals at the vertices.
1
Trust the normals of the polygons.
2
Reorient all the polygon's normals and vertices
normals to follow the orientation of first polygon.
3
Same as 2 but splits disjoints part in the input to
different objects.
The computation on an object will be applied individually to each part
found in the object list Obj. Option 2 of TrustInfo will correct
cases where adjacent polygons are not oriented the same, based on detection
of adjacencies.
creates a parallelepiped - generalized BOX polygonal object, defined by
Point as its base position, and Dx, Dy, Dz as 3 3D vectors to define
the 6 faces of this generalized BOX. The regular BOX object is a special case
of GBOX where Dx = vector(Dx, 0, 0), Dy = vector(0, Dy, 0), and
Dz = vector(0, 0, Dz).
Dx, Dy, Dz must all be independent in order to create an
object with positive volume.
provides a method to get input from the keyboard within functions and
or subroutines. RequestedType can be a NUMERIC_TYPE,
POINT_TYPE, VECTOR_TYPE, or PLANE_TYPE in which the entered line
will be parsed into one, three, or four numeric values (operated by
either spaces or commas) and the proper object will be created and
returned. In any other case, including failure to parse the numeric
input, a STRING_TYPE object will be constructed from the entered line.
Example:
Pt = GETLINE( point_type );
to read one point (three numeric values) from stdin.
computes the intersection curves of the given two ring surfaces,
defined as spine surfaces with axis SrfiAxis, i = 1, 2 and circular
cross section along the normal plane of the axis curve with radii
SrfiRad.
The ring ring intersection (RRI) problem is tranformed into a zero set
finding on another function. If ZeroSetFunc is true, the function
whose zero set provides the RRIsolution is returned. Otherwise, if
ZeroSetFunc is false, the RRI solution itself is returned. The zero
set is computed via numerical zero set finding methods and Tolerance
controls the fineness of the approximated solution.
FIGURE:
Computation of the intersection curve between two ring surfaces via
the GGINTER command. On the left, the zero set function is displayed
while on the right, the computed intersection between two ocylinders
is shown.
constructs two cylinders as s1 and s2, defines the same two
cylinders as a ring surface with axes spines of c1 and c2 and
a constant radius, one in r1 and r2, and computes the zero set
of the intersection and the intersection curve itself.
See also RRINTER, SSINTER and SSINTR2.
converts all Curves(s), (Trimmed) Surface(s), and Trivariate(s) Object
into pointlists using the RESOLUTION variable. The larger the RESOLUTION is,
the finer the resulting approximation will be. Returns a single pointlist
object if Merge is TRUE.
If Optimal is false, the points are sampled at equally spaced
intervals in the parametric space. If Optimal true, a better, more
expensive computationally algorithm is used to derive optimal sampling
locations so as to minimize the maximal distance between the curve and
piecewise linear approximation (L infinity norm).
approximates all Surface(s)/Trimmed surface(s)/Trivariate(s) in Object
with polygons using the POLY_APPROX_OPT, POLY_APPROX_TRI,
POLY_MERGE_COPLANAR, RESOLUTION and FLAT4PLY variables.
If POLY_APPROX_OPT is FALSE, RESOLUTION vaguely prescribes the number of
uniform (in parametric space) samples to sample the surface in each direction.
If POLY_APPROX_OPT is TRUE, POLY_APPROX_TOL prescribes the maximal
deviation of the polygonal approximation from the original surface, in object
space coordinates.
IF POLY_APPROX_TRI is TRUE, only triangles are generated on the output
set.
POLY_MERGE_COPLANAR controls the way coplanar adjacent polygons are merged
into one (or not.)
FLAT4PLY is a Boolean flag controlling the conversion of an (almost) flat
patch into four (TRUE) or two (FALSE) polygons. Normals are computed to
polygon vertices using surface normals, so Gouraud or Phong shading can be
exploited. It returns a single polygonal object.
If Normals is set, surface normals will be evaluated at the
vertices. Otherwise flat shading and constant normals across polygons are
assumed.
Example:
Polys = GPOLYGON( list( Srf1, Srf2, Srf3 ), off );
converts to polygons the three surfaces Srf1, Srf2, and Srf3
with no normals. See also GPOINTLIST, GPOLYLINE, POLY_APPROX_OPT,
POLY_APPROX_TOL, POLY_APPROX_TRI, POLY_APPROX_UV,
POLY_MERGE_COPLANAR, RESOLUTION and FLAT4PLY.
converts all Curves(s), (Trimmed) Surface(s), and Trivariate(s) Object
into polylines using the RESOLUTION variable. The larger the RESOLUTION is,
the finer the resulting approximation will be. It returns a single polyline
object.
If Optimal is false, the points are sampled at equally spaced
intervals in the parametric space. If Optimal true, a better, more
expensive computationally algorithm is used to derive optimal sampling
locations so as to minimize the maximal distance between the curve and
piecewise linear approximation (L infinity norm).
converts to polylines the three surfaces Srf1, Srf2, and Srf3
and the three curves Crv1, Crv2, and Crv3. See also
GPOINTLIST, GPOLYGON, RESOLUTION and FLAT4PLY.
computes the Hausdorff distance between Obj1 and Obj2, with Eps
as the tolerance of the computation. Note obj1 or Obj2 can be either a
point, a curve, and to a certain extent a surface. If OneSided is TRUE, the
one sided Hausdorff distance from Obj1 to Obj2 is computed. Returned
is a list of two items, the first prescribes the parameter location of the Hausdorff
distance event on the Obj1 and the second prescribes the parameter location
of the Hausdorff distance event on Obj2.
construct a cubic fit between Bndry1 and Bndry2 so that
first derivative continuity constraints, as prescribed by Tan1 at
Bndry1 and Tan2 at Bndry2, are preserved.
It returns either a curve or a surface, according to type of input parameters.
examines if the offset curve OffsetCrv has local self-intersections
with respect to the original input curve Crv. Returns TRUE if
local self intersections detected, FALSE otherwise.
ListType IMPLCTTRANS( 1, ListType ImplicitConicSec, MatrixType Mat )
or
ListType IMPLCTTRANS( 2, ListType ImplicitQuadric, MatrixType Mat )
transforms a given conic section as the 6 coefficients A-F of:
Ax^2 + Bxy + Cy^2 + Dx + Ey + F = 0,
Ax^2 + Bxy + Cy^2 + Dx + Ey + F = 0,
in which case 6 coefficients are expected in ImplicitQuadric or
transforms a given quadric section given as the 10 coefficients A-J,
A x^2 + B y^2 + C z^2 + D xy + E xz + F yz + G x + H y + I z + J = 0,
using the given transformation matrix Mat.
Example:
ImplicitMappedEllipse = IMPLCTRANS( 1, ImplicitEllipse, Mat );
See also CONICSEC, QUADRIC, ELLIPSE3PT, MAP3PT2EQL.
InstanceType INSTANCE( StringType GeomName, MatrixType Mat );
creates an instance of the geometry prescribed by GeomName to be
related to a different position as specified by matrix Mat.
The use of instances is advantageous where the same geometry is to be
displayed/processed in several different locations in space. A modification
of the original geometry Geom will affect all instances that reference
it. The reference is by the original object's name. The original
object can be a single object or a whole hierarchy of objects.
verifies if the given freeform geometry in Obj is a line,
circle, plane, sphere, surface of revolution, extrusion, ruled surface,
or a sweep surface, upto some tolerance Eps. GeomType
prescribes the type to check for as one of the GEOM_LINE/CIRCLE etc.
constants.
The return value is a list of two objects. The first is a numeric value
with the success/failure of the result. A zero is returned in a failure case
whereas non zero value hints on the direction relevant. As an example a
ruled surface along U will return 1 and a ruled surface along V will return
a 2. The second object is a list with the construction entities of Obj,
if any. For example, for a detected sphere, the center and radius will be
returned.
computes the isocline edges of the given Srf from the prescribed
viewing direction ViewDir. Isocline curves are curves on the surface
at which location the surface normal forms a fixed angle, Theta,
in degrees, with the prescribed viewing direction, ViewDir.
The selection of 90 degrees for Theta results in the extraction of
silhouette edges. The end result is a piecewise linear approximation of the
exact isocline edges, and its accuracy is controlled via the RESOLUTION
variable.
IfMode is zero, the isoclines are simply computed and returned.
IfMode is either -1 or +1, the surface regions with normals with angles
of less than or great than Theta are returned as trimmed surfaces.
IfMode is either -2, the surface regions with normals with angles
of less than than Theta are returned along with ruled surface that
are stitched along the removed region. This -2 mode is useful in mold
design.
If Euc is TRUE, the isocline edges are returned on the surface,
in Euclidean space. Otherwise, the isocline edges are returned in the
parametric space of Srf.
computes the isocline edges forming 80 degrees between the surface
normal and the given viewing direction (1, -2, 1) for surface
glass, and returns the isocline edges in the Euclidean space.
See also SILHOUETTE.
cleans unnecessary knots from the given curve Crv. The returned
curve is identical to the given curve, but in, possibly, a sub space with
less knots. Note this function can undo refinement operations.
refines a polynomial circle approximation and then restores the original
curve via the KNOTCLEAN operation. The last line validates this cleaning.
See also KNOTREMOVE.
removes knots from curve Crv so as to keep the global error less than the
Tolerance.
c1r = KNOTREMOVE( c1, 0.01 );
curve c1r is the curve with the minimum number of knots possible such
that the global error (distance between c1 and c1r) is less than
0.01. See also KNOTCLEAN.
computes a least squares fit of a line to a list of points, PtList.
A list of three elements, a point on the fitted line, a unit
vector in the direction of the line and the average distance between a point
and the fitted line, is returned.
randomly samples 100 points to be approximately along a line and computes
a least squares fit of a line to this data. LnPos, LnDir, and
LnErr contain a point on the fitted line, the unit direction of the
fitted line and the average distance between a point and the line,
respectively. See also CINTERP and SINTERP.
approximates an offset of OffsetDistance by sampling NumOfSamples
samples along the offset curve and least square fitting them using a B-spline
curve of order Order and NumOfDOF control points.
would result in the "(2, 3, 1)" scaling vector, "(5, 7, 0)" translation
vector and a rotation around X matrix of 45 degrees, all in one returned
list object. See also MATDECOMP2 and MATRECOMP
decomposes a given homogeneous transformation into its three Euler
rotation angles, RotX, RotY, RotZ, unifrom scale factor, and three
translation factors, and returns a list of these seven numeric
coefficients.
Recomposes the seven numeric coeffcients of
(RotX, RotY, RotZ, Scale, TransX, TransY, TransZ)
to an homogeneous matrix.
Example:
MATRECOMP( list( Pi/2, 0, 0, 3, 5, 7, 0 ) );
would result in an homogeneous matrix that rotates by 90 degrees in
x, scales by a factor of 3 and translates by 5 and 7 in x and y,
respectively. See also MATDECOMP and MATDECOMP2.
creates a Bezier polynomial/rational multivariate out of the
provided control mesh. Orders is a list of orders whose size
define the number of dimensions that the multivariate has.
CtlPts is a linear list of control points. All control points
must be of type (E1-E9, P1-P9), or regular PointType defining the
multivariate's control mesh. The multivariate's point type will be
of a space which is the union of the spaces of all points.
computes the bisector surface in R3 of two surfaces or a curve and a
surface, posed as multivariate functions.
The returned results depend upon the value of RetType.
If RetType = 1, the algebraic constraints are returned as a list of
multivariates. If RetType = 2, a list of points in R3 on the bisector
sheet(s) is returned. If RetType = 3, a list of points in (u, v, x, y, z)
space, as E5 points, is returned, where (u, v) are the respective parameter
locations of the (must be) surface MV1. These E5 points can then
directly be employed by SINTERP through which to fit a surface. Finally,
if RetType = 4, marching cubes is applied to extract a piecewise
linear approximation of the solution, in Euclidean space.
This bisector problem is posed as a set of two multivariate algebraic
constraints with three variables. The simultaneous solution of these
constraints is computed using the MZERO function. See MZERO for the
meaning of the SubdivTol and NumerTol tolerances.
computes two examples of a bisector between a plane and a biquadratic
surface and between a plane and a line. The cloud of points is computed
twice, once interpolated by a surface, and also displayed as is.
FIGURE:
A bisector between two surfaces (left) and a plane and
a line (right) computed using MBISECTOR.
creates a Bspline polynomial/rational multivariate out of the provided
control mesh of lengths Lengths and orders Orders in each axis.
The sizes of Lengths and Orders define the number of dimensions
that the multivariate has.
CtlPts is a linear list of control points. All
control points must be of type (E1-E9, P1-P9), or regular PointType
defining the multivariate's control mesh. The multivariate's point
type will be of a space which is the union of the spaces of all
points. KVLst is a list of knot sequences of the new Bspline
multivariate.
MultivarType MDERIVE( MultivarType MV, NumericType Dir )
returns a vector field multivariate representing the differentiated
multivariate MV, in the given direction. Evaluation of the
returned multivariate at a given parameter value will return a vector
tangent to TV in Dir at that parameter value.
DMV = MDERIVE( MV, 2 );
computes the partial derivative of the multivariate MV with respect
to its second variable. See also CDERIVE, SDERIVE, and TDERIVE.
subdivides a multivariate into two at the specified parameter value Param
in the specified Direction. MV can be either a B-spline
multivariate in which Param must be contained in the parametric
domain of the multivariate, or a Bezier multivariate in which Param
can be arbitrary, extrapolating if not in the range of zero to one.
It returns a list of the two sub-multivariates. The individual multivariates
may be extracted from the list using the NTH command.
subdivides Mv2 at the parameter value of 0.3 in the direction 3 and
then extracts the two subdivided multivariate.
See also CDIVIDE, SDIVIDE, and TDIVIDE.
merges a set of polylines/polyline objects in PolyList to larger polyline
object. All elements in the PolyList in the second form must be of
PolygonType type. This function merges two polylines if their end point is the
same upto Eps.
will merge the four 2-vertices polylines into one polyline prescribing
a square. Note polylines might be reversed in the merging process.
See also MERGEPOLY.
merges a set of polygonal objects in the PolyList list to a single polygonal
object. All elements in the ObjectList must be of PolygonType type. This
function performs the same operation as the overloaded ^ operator
would, but may be more convenient to use under some circumstances.
evaluates the provided multivariate MV at the given Params
values. Params is a list of NumericTypes of length equal to the
dimension of the multivariate that must be contained in the multivariate
parametric domain, if MV is a B-spline multivariate, or all between zero
and one if MV is a Bezier multivariate. The returned control point has the
same type as the control points of MV.
Example:
CPt = MEVAL( MV1, list( 0.1, 0.25, 0.22, 0.7 ) );
evaluates the four-variate MV1 at the parameter values of
(0.1, 0.25, 0.22, 0.7).
See also CEVAL, SEVAL, TEVAL.
coerces surface s to a multivariate, extracts a one-dimensional-less
multivariate (a curve) from the second direction (first direction is
direction zero), at index 2 and compares the result for equality to
the curve extracted using cmesh from s.
extracts a multivariate of one lower dimension from multivariate MV by
extracting an iso-variate of MV in direction Dir at parameter
value Param.
Example:
MVFirst = MFROMMV( MV, 0, FirstParam );
extracts a multivariate for one less dimension than MV as the
constant first parameter of MV at parameter value FirstParam.
See also STRIVAR, CSURFACE.
merges MV1 and MV2 together into one multivariate along the
direction Dir. The first direction starts from zero. If Discont,
the merge is assumed to be along a discontoinuous edge.
Example:
MVFirst = MMERGE( M1, M2, 2, false );
merges M1 and M2 along the third direction.
See also SMERGE,
computes an offset of OffsetDistance with a globally bounded error
(controlled by AngularError). The smaller the AngularError is, the better
the approximation to the offset. The bounded error is achieved by adaptive
refinement of the Crv.
The offset is computed via matching of the tangent fields of the
given curve Crv and an arc spanning the same angular domain.
Further, AngularError measures the angular deviation allowed
between the two tangent fields.
computes an offset approximation to Crv with OffsetDistance of
-0.4 and AngularError of 10 and 5 degrees, respectively.
See also OFFSET, TOFFSET, AOFFSET, LOFFSET, and FFMATCH.
approximate the zero and first moments of curve Crv.
Example:
a = circle( vector( 0, 0, 0 ), 1 );
a = cregion( a, 0, 1 );
p = moment( a, 0 );
v = moment( a, 1 );
view(list(a, p, v), on);
a = cregion( a, 0, 1 ) * rz( 45 );
p = moment( a, 0 );
v = moment( a, 1 );
view(list(a, p, v), on);
computes and displays the zero and first moments of a quarter of a circle
in two orientations.
creates a polynomial/rational multivariate out of the provided control mesh.
Orders is a list of orders whose size define the number of dimensions
that the multivariate has.
The created multivariate employs the monomial power basis. CtlPts is a
linear list of control points.
All control points must be of type (E1-E9, P1-P9), or regular PointType
defining the multivariate's control mesh. The multivariate's point type
will be of a space which is the union of the spaces of all points.
applies (a variation of) the marching cubes algorithm (see
W. E. Lorensen and H. E. Cline. "Marching Cubes: A High Resolution 3D
Surface Construction Algorithm." Computer Graphics (SIGGRAPH '87
Proceedings), Vol. 21, No. 4, pp 163-169, July 1987.) to the given
volumetric data set or trivariate. VolumeSpec can be a list of
four or five objects as follows:
In the first case, the list of images are considered slices in the volume.
All images are read in and stacked together to form the volume. The RGB
colors are converted into a gray scale values.
In the second case, the trivariate TV is iso surface contoured at level
IsoVal along the prescribed Axis (Note a trivariate need not
be a scalar function, whereas Marching Cubes assumes a scalar function).
The sampling rate of the trivariate is governed by SamplingFactor
with SamplingFactor equal 1.0 sets sampling rate that equates with
the dimensions of the trivaariate (control mesh volume size).
If TVNormals is not zero, much more accurate normals are derived using
the trivariate function though it is also slower. Otherwise, first order
differencing on the cubes is employed for normal estimation.
In the third case, the volume file prescribed by FileName is
loaded and iso surface contoured. The file is assumed to hold
Width * Height * Depth (Width first, Depth order last) scalar
numeric values of type DataType:
1
Regular float or int ASCII (separated by white spaces)
2
Two bytes short integer.
3
Four bytes long integer.
4
One byte (char) integer.
5
Four bytes float.
6
Eight bytes double.
Beware of the little vs big Endian problem! We assume here that you have read
the volume in the same machine type in which this file was written.
CubeDim allows the user to prescribe the real cell size (not
necessarily cubical). SkipFactor allows the skipping of data in large
data sets. SkipFactor = 1 skips nothing. SkipFactor = 2, skips
every other scalar value, reducing in half all dimensions, etc.
Last but not least, IsoVal sets the iso surface level.
iso surface contours the X axis of trivariate ThreeCyls and uses
the trivariate to get better normals' estimations. Cell size is unit
cube like, no dat is skipped and the iso surface level is 0.12.
FIGURE:
The result of applying Marching Cubes to a trivariate scalar function
using the MRCHCUBE command.
provides the ability to Replace a knot vector of MV or refine
it in the specified direction Direction.
KnotList is a list of knots at which to refine MV. All knots should be
contained in the parametric domain of MV in Direction. If the knot
vector is replaced, the length of KnotList should be identical to the
length of the original knot vector of MV in Direction. If MV
is a Bezier multivariate, it is automatically promoted to be a B-spline
multivariate.
extracts a region of MV between MinParam and MaxParam
in the specified Direction. Both MinParam and MaxParam
should be contained in the parametric domain of MV in Direction.
reparametrizes MV over a new domain from MinParam to MaxParam,
in the prescribed Direction. This operation does not affect the geometry
of the multivariate and only affine transforms its knot vectors. A Bezier
multivariate will automatically be promoted into a B-spline surface by this
function.
computes a minimum spanning circle to polyline(s) (first form), or to
a list of curves (second form).
Tols is a list of two numeric values, SubdivTol and NumerTol, that
are used only if the minimum spannng circle of a set of curves is required.
See MZERO for the meaning of the SubdivTol and NumerTol
tolerances.
The returned circle will have 'center' and 'radius' attributes with the
circles parameters. If a cone is returned, 'angle' and 'center' of the cone
will be returned.
Example:
Msc = MSCIRC( Crvs, list( 0.01, 1e-10 ) ):
See figure for minimum spanning circle of curves.
FIGURE:
The minimum spanning circle of a set of planar curves is computed with
the aid of MSCIRC. Two examples are shown.
computes the minimum spanning cone of a set of input vectors, Vecs.
Returned is a list of the cone's parameters as well as a geometry
representation of the cone.
computes a minimum spanning sphere to a list of 3D points.
Returned is a geometric representation of the cone with "radius" and
"center" attributes of the parameters of the sphere.
computes the contact locations, if any, when S1 is stationary and
S2 is moving along the MotionCrvs animation curves. Currently
only "MOV_XYZ" and "SCL" animation curves are supported.
SubdivTol and NumerTol control the tolerance of the computation
as in MZERO. If UseExpreTrees, expression trees are used in the
computation which is typically faster.
constructs a multivariate power basis from the given polynomial
Expression. The Expression can be any infix notational expression
using +-/*^ with no parenthesis. The parameters are the 26 letters A-Z.
The dimension of the multivariate is set by Dim and should be in line
with the variables used. A stands for the first dimension, B for the second,
etc., so if Dim equal 3, only A, B, and C could appear in Expression.
Having a higher letter with a lower dimension constitutes an error.
computes the intersection of two planar curves (Geometry is a list of
two planar curves) or three surfaces (Geometry is a list of three
surfaces).
SubdivTol and NumerTol control the tolerance of the computation
as in MZERO. If UseExpreTrees, expression trees are used in the
computation which is typically faster.
ListType NCCNTRPATH( PolyType Obj, NumericType Offset, NumericType ZBaseLevel,
NumericType TPathSpace, NumericType Units )
or
ListType NCCNTRPATH( SurfaceType Obj, NumericType Offset, NumericType ZBaseLevel,
NumericType TPathSpace, NumericType Units )
builds Numerically controlled (NC) tool path to mill (machine) the given Obj
geometry. The Offset prescribes the necessary offset, due to the tool's ball
end radius. ZBaseLevel sets a base level the toolpath will not go below.
and Units sets the used units with 0 for inches and 1 for mm. The toolpath
is built as parallel contours of the (offset of the) input Obj, contours that
are TPathSpace spacing apart.
The following attributes are optional and supported by NCCNTRPATH:
NC data can be saved using the SAVE command in G-code if the saved file type is
".nc". See SAVE for more, including the meaning of the different attributes in the
above example. See also NCPCKTPATH.
computes tool path to 2D pocket machining from +Z direction the given Obj
geometry (a closed curve or a closed polygon). ToolRadius sets the offset to
use in the pocket whereas RoughOffset sets the offset to use during roughing
(RoughOffset better be larger than ToolRadius). TPathSpace sets
the space between adjacent pockets slices in the zigzag motion and TPathJoin
prescribes the maximum distance to connect adjacent slices (if larger a full
retracting will be performed).
Units sets the used units with 0 for inches and 1 for mm and if
TrimSelfInters is TRUE also attempts to eliminate self intersections due
to the applied offsets.
NC data can be saved using the SAVE command in G-code if the saved file type is
".nc". See SAVE for more, including the meaning of the different attributes in the
above example. See also NCCNTRPATH.
computes the simultaneous zeros of several scalar multivariate functions, in
MVs. SubdivTol specifies the subdivision tolerance in the
parametric domain of the multivariates, whereas NumerTol prescribes the
tolerance of the numerical improvement stage. A numerical improvement stage
is applied if |NumerTol| < SubdivTol. If NumerTol is
negative, and a numeric improvement stage is indeed applied, all points that
fail to improve to the requested accuracy are purged away.
A list of control points, each designating one location in the
parameter space of the multivariates, is returned.
The number of multivariates cannot exceed the dimension of the
multivariates. That is, if the MVs are trivariates, then, at most, three
of them may be provided. If less are provided, then the dimension of the
solution space is larger than zero and a finite cloud of points
sampled from that solution space will be returned.
promote the multivariate MV to a higher dimension. In the first form
(a list of one numeric value), the multivariate will be promoted to have one
more dimension (i.e. a bivariate would become a trivariate). The new added
axis will be AddDir.
The second form (a list of two numeric values) allows the original
multivariate to be placed at axes from StartAxis and have a new
dimensional NewDim.
coerces a surface to a multivariate, promotes it to a trivariate-multivariate,
extracts an iso-surface bivariate-multivariate along the new introduced axis
from the trivariate-multivariate and compares it to the original surface. It
should be equal!
offset Poly, Crv, Srf or a TrimSrf, by translating
all the vertices or control points in the direction of the normal of the
poly/curve or of the (trimmed) surface by an OffsetDistance amount.
For a Poly object, the input can be a single polygon or a single
polyline, in which case the offset is computed in the XY plane, or can be
a polygonal model in which case the offset is computed in R^3. In the
former case, the result is an offset of the original polygon/line
in the XY plane and is exact. In the latter case, the normals at the
vertices of the polygonal model are employed (and are locally estimated
if non detected), and all vertices are moved in the vertices normals,
scaled by this offset distance. For offset in R^3, if Smoothing
is TRUE, normals at the vertices are always recomputed and smoothed out.
Also for an offset in R^3, if MiterEdge is TRUE, attempts to properly
compenstate for miter edges' based offset is made.
Otherwise, each control point has a node parameter value associated with
it, which is used to compute the normal. The returned curve or surface only
approximates the real offset. If the resulting approximation does not satisfy
the accuracy required by Tolerance, Crv or Srf or
TrimSrf is subdivided and an offset approximation fit is computed for
the two halves. For curves, one can request a Bezier interpolation scheme in
the offset approximation by setting BezInterp. BezInterp is
not yet supported for (trimmed) surfaces.
Negative OffsetDistance denotes offset in the reversed direction of the
normal.
If OffsetDistance is a (scalar) curve, the curve's first coordinate
is used to prescribe a variable offset amount along the curve for which we
compute the variable offset. Both Crv and OffsetDistance must share
the same parametric domain.
Example:
OffCrv = OFFSET( Crv, -0.4, 0.1, off );
offsets Crv by the amount of -0.4 in the reversed normal direction,
Tolerance of 0.1 and no Bezier interpolation.
See also TOFFSET, AOFFSET, LOFFSET and MOFFSET.
FIGURE:
Offset approximation (thick) of a B-spline curve (thin).
computes the orthotomic of a cubic Bezier curve that has an inflection
point. Note that inflection points are reduced to cusps in the orthotomic
result.
FIGURE:
An orthotomic (thick) of a cubic Bezier curve. The inflection
point in the cubic Bezier is reduced to a cusp in the orthotomic.
Computed using the ORTHOTOMC command.
provides a mechanism to set/get an attribute to a vertex of a polygon.
Unlike the regular ATTRIB/RMATTR functions, PATTRIB allows access to the
Index vertex in polygon Poly, access that is otherwise impossible.
Index starts at zero for the first vertex.
The attribute will have a name Name and a value Value. If Value
is NIL(), no attributes are set and the named attribute, if any, is returned.
This PATTRIB function only allows numeric values or strings as Value.
estimates curvature properties of given polygonal model Pl, assuming
Pl originated from a continuous freeform surfaces. NumOfRings
sets the number of rings around a vertex that will be used to estimate the
curvature properties of the vertex. If (CubicFit is TRUE, a cubic
fit is computed to the local vertex neighborhood, or a quadratic fit, if
FALSE.
The return polygonal object is identical to Pl, but with the
following attributes set at each vertex:
Given a polygonal model, Obj, decimate and merge polygons, effectively
reducing the size of the data subject to a maximal deviation distance as
controlled via Threshold and DecimType. DecimType can be
either TRUE when Threshold has a continuous zero to one control over
the output size or FALSE when Threshold prescribes the exact number of
polygons desired.
creates a surface of a glass, approximates it with polygons and then
decimates the latter.
FIGURE:
A polygonal object (left) can be decimated and reduced (right) to
within a given tolerance by using PDECIMATE.
computes the importance of a local neighborhood in a triangular polygonal
mesh {bf Pl}, based on the dihedral angles of the edges in that neighborhood.
If GenImprtncPolylines FALSE, every vertex in the returned mesh will
have a "SilImp" (See the connection of this importance to silhouettes?)
attribute with its importance. Otherwise, if GenImprtncPolylines TRUE,
polylines that stylistically convey the importance of the different regions
in this mesh are returned.
clips a polygonal model Poly against a plane Pln.
Three polygonal objects are returned in a list: polygons on the positive side
of the plane, polygons that intersect the plane, and polygons on the negative
side of the plane, in this order.
If one of these lists is empty, a numeric zero is substituted.
Example:
Pls = PLANECLIP( Pl, plane( 1, 1, 0, 0 ) );
clips polygonal object Pl against the plane X+Y=0.
creates a new polygonal object which is a metamorph of the two given
polygonal objects that share the same topology. That is, Pl1 and Pl2
must share the same number of polygons and the i'th polygon in Pl1 must
be equal in its number of vertices to the i'th polygon of Pl2.
This is very useful if a sequence that "morphs" one polygonal model to
another is to be created.
PointType PNORMAL( PolyType Poly, NumericType Index, VectorType Normal )
provides a mechanism to set/get the normal of vertex number Index
in a polygon Poly. Index starts at zero for the first vertex.
Normal replaces the current normal that is also returned. If
Normal is not a VectorType, no new normal is set but the current
normal is still returned, allowing normals to be queried.
computes the polar silhouettes of surface Srf from view direction
ViewDir. if EuclideanSpace TRUE, the polar silhouettes are
returned in Euclidean space, over Srf. Otherwise, the polar silhouettes
are returned in the parametric domain of Srf.
creates a single polygon/polyline (and therefore open) object, defined by
the vertices in VrtxList (see LIST). All elements in VrtxList
must be one of PointType, VectorType, CtlPtType, or PolygonType types.
If IsPolyline, a polyline is created; otherwise, a polygon.
constructs an object with a single polygon in the shape of the letter I.
FIGURE:
Polygons or polylines can be manually constructed using the
POLY constructor.
PolygonType POLYHOLES( PolygonType OuterPoly, PolygonType Island )
or
PolygonType POLYHOLES( PolygonType OuterPoly, ListType Islands )
merges the given Island(s) into the main polygon OuterPoly,
creating a polygon with holes. The outer polygon OuterPoly is assumed
to be oriented in the opposite direction to that of the Island(s).
tests if a point Pt is inside a 3D closed polyhedra Pl in 3-space
or if a point Pt is inside a 2D closed polygon Pl in 2-space, if
Pl contains only one (planar) polygon.
Returns TRUE if inside, FALSE otherwise.
computes the intersection edge of two polygons in two different ways. Note,
however, that while PPINTER considers only the first polygon in a
polygonal object, the Boolean operations considers them all.
extracts silhouettes from surface Srf (note an InclinationAngle of 90
degrees extract silhouettes), from three different viewing direction.
See also PCRVTR, SILHOUETTE, ISOCLINE, PPROPFTCH and SASPCTGRPH.
compute a layout (prisa) of the given surface(s) Srfs or {TrimSrfs},
and return a list of (trimmed) surface objects representing the layout.
The surface is approximated to within Epsilon in direction Dir
into a set of ruled surfaces, and then developable surfaces that are laid out
flat onto the XY plane. If Epsilon is negative, the piecewise ruled
surface approximation in 3-space is returned.
SamplesPerCurve controls the piecewise linear approximation of the
boundary of the ruled/developable surfaces. Space is a vector whose
X component controls the space between the different surfaces' layout, and
whose Y component controls the space between different layout pieces.
If CrossSecs is not zero, the 3D cross sections, approximated as
planar, of each laid out region are also provided.
computes a layout of a wine glass in wgl_prisa and a three-dimensional
ruled surface approximation of wglass in wgl_ruled.
FIGURE:
The layout (prisa in hebrew...) of a freeform surface can be approximated
using the PRISA function.
computes the barycentric coordinates of InterPt with respect
to the triangle defined by Pt1, Pt2, Pt3.
A vector of three coefficents, which are the weights of the three
points of the triangle, are returned. InteriorPt is assumed to be in the
triangle.
registers one points set, PtSet1, with another, PtSet2.
The two points sets are assumed to be rigid motion of one another.
StepSize controls the step size of the numerical process and must be
a positive real less than 1.0. The larger StepSize is, the faster the
convergance with less stability. Finally, Tolerance prescribes the
necessary accuraacy in L-infinity sense. This function will converge for
small rotational deviations only.
merges a list of points Points to polylines. Merges the points until
two adjacent points are at most MergeTol apart. Points is a list
of with PointType or CtlPtType. In the later case the control point can be of
arbitrary dimension.
computes the closest two points on the two lines defined by point
LineiOrig and ray LineiRay. See also DSTLNLN.
A list object with the two points is returned.
approximates given curve Crv using piecewise quadratic curves upto
the prescribed tolerance Tolerance. If MaxLen is positive it
is used to limit the arc length of the cubic curves segments.
Example:
PQaudCrv = QUADCRVS( Crv, 0.01, 0.5 );
creates a piecewise quadratic approximation to curve Crv upto tolerance
0.01 and maximal arc length of cubic segments of 0.5.
See also CUBICCRVS, CBIARCS.
constructs four quadric surfaces, a sphere, a portion of a hyperboloid of
one sheet, a portion of a hyperboloid of two sheets, and promotes an
ellipse to an ellipsoid of Z height of 0.1.
Note only elliptic surfaces are compact and are reconstructed in whole.
Because the parametrization of the quadric is predetermined, one might need
to use SREGION and SMOEBIUS to extract subregions and/or reparametrize the
surface.
computes locations on the given planar curves or 3-space surfaces that
would bounce rays from one object to the next, in an infinite cycle. Such
traps are denoted ray traps. Ray-traps are computed for the given list
of Crvs or Srfs, in the given order. The ray-trap problem is
posed as a set of n multivariate algebraic constraints with n variables,
given n objects prescribed in Crvs or Srfs. The simultaneous
solution of these constraints is computed using the MZERO function. See
MZERO for the meaning of the SubdivTol and NumerTol tolerances.
If Orient, attempt is made to orient the curves/surfaces which is
likely to speed up the process. If UserExprTree, expression trees
constraints are used instead of tensor products. Again, typically faster
and much less memory use.
computes reflection lines/ovals to the given surface Srf as
seen from view direction ViewDir. The resulting piecewise linear
curves are in Euclidean space if Euclidean is TRUE and in Srf
parameter space, otherwise.
The reflection/ovals themselves are defined via LinesSprs.
For reflection lines, LinesSprs consists of
computes the reflection lines of surface Srf from viewing
direction ( 0, 1, 2 ) having five reflected lines and computes five
reflection ovals from viewing direction ( 1, 1, 0 ).
See also ReflectLns attributes in the display devices.
computes the intersection curves of the given two ruled surfaces,
defined as
SrfiCrv1 * v + SrfiCrv2 * (1 - v)", i = 1, 2, v in [0,1].
The ruled ruled intersection (RRI) problem is tranformed into a zero set
finding on another function. If ZeroSetFunc is true, the function
whose zero set provides the RRIsolution is returned. Otherwise, if
ZeroSetFunc is false, the RRI solution itself is returned. The zero
set is computed via numerical zero set finding methods and Tolerance
controls the fineness of the approximated solution. If Tolerance is
negative, the absolute value is employed as Tolerance but the
intersection curves are computed as if the two ruled surfaces are infinite
(i.e. v is unbounded).
FIGURE:
Computation of the intersection curve between two ruled surfaces via
the RRINTER command. On the left, the four intersection curves are
shown, while (right) shows the computed function whose zero set
provides the request RRI solution.
fits a ruled surface to the given general surface Srf along the
specified Dir direction. Normally DomainExtension is zero by can
be used to extend the domain so the ruling can start/end outside Srf's
domain. Finally SamplingRate sets the number of samples to use along
the fitting Dir.
Example:
rSrf = ruledfit( Srf, col, 0.0, 40 );
fits a ruled surface to Srf along the col direction with no
extension and 40 samples.
FIGURE:
A ruled surface fitting to a general hyperbolic surface using RULEDFIT.
See also RULEDSRF.
construct a ruled surface between the two curves Crv1 and Crv2
or two polylines Poly1 and Poly2.
The curves do not have to have the same order or type, and will be promoted
to their least common denominator. The polys must have the same number of
points and both must be either polygons or polylines.
constructs a planar ruled surface between two curves, c1 and c2.
The naive construction causes self intersection, but by employing FFMATCH
the self intersection can be resolved.
FIGURE:
A naive construction of a ruled surface (left) using RULEDSRF
results in self intersection. FFMATCH is employed (right) to
automatically resolve this self intersection.
constructs a ruled trivariate between the two surfaces Srf1 and
Srf2.
The surfaces do not have to have the same order or type, and will be
promoted to their least common denominator.
constructs a truncated cone-volume as a ruled trivariate between two surfaces,
s1 and s2.
FIGURE:
A ruled volume as a trivariate between two disc surfaces, created via
the RULEDTV function.
computes the domain on the AccessSrf surface that is accessible from the
orientation that is optionally prescribed by OrientFieldSrf, without
gouging into the CheckSrf surface. If OrientFieldSrf is not
a surface, the normal field of AccessSrf is employed.
AccessSrf and OrientFieldSrf must share a (u, v) domain,
whereas CheckSrf can present a different (s, t) domain.
If AccessLimitDir is indeed a vector, the access is limited for
direction V such that the inner product of V and AccessLimitDir is
positive.
The accuracy of the computation is governed by a two stage solution,
a subdivision stage with tolerance SubdivTol followed by a numerical
improvement stage with NumericTol accuracy. The second, numeric,
stage is invoked only if NumericTol < SubdivTol.
The returned results are a set of points on the boundary of the accessible
region. The points are in E4 space as (u, v, s, t) 4-tuples.
computes the access domain of plane Pln along the normal, Z, direction
while preventing gouging into the check surface pSphere.
FIGURE:
The limit of the accessible area of the plane along the normal
direction, without gouging into the sphere is computed and presented
using the SACCESS function.
See MZERO for the meaning of SubdivTol and NumerTol.
approximates the aspect graph of surface Srf by computing the
principal directions with zero curvature at the parabolic points of Srf.
The aspect graph is defined over the unit sphere and identifies all
direction from which the silhouette curves of Srf change topology.
evalutes the asymptotic direction of surface Srf at parametric
location (U, V), if any. If Euclidean is not zero, the directions
are returned in Euclidean space, otherwise, in parametric space. Returned
is a list of upto two vectors.
creates a Bezier surface using the provided control mesh. CtlMesh is a
list of rows, each of which is a list of control points. All control points
must be of type (E1-E9, P1-P9), or regular PointType defining the surface's
control mesh. The surface's point type will be of a space which is the
union of the spaces of all points.
FIGURE:
A Bezier surface (left) of degree 3 by 5 and a B-spline surface (right)
of degree 3 by 3 (bi-quadratic). Both share the same control mesh.
See also CBEZIER, SBSPLINE and SPOWER.
creates a B-spline surface from the provided UOrder and VOrder
orders, the control mesh CtlMesh, and the two knot vectors KnotVectors.
CtlMesh is a list of rows, each of which is a list of control points.
All control points must be of point type (E1-E9, P1-P9), or regular
PointType defining the surface's control mesh. The surface's point type will
be of a space which is the union of the spaces of all points.
KnotVectors is a list of two knot vectors. Each knot vector is a
list of NumericType knots of length #CtlPtList plus the Order.
If, however, the length of the knot vector is equal to #CtlPtList +
Order + Order - 1}, the curve is assumed to be periodic.
The knot vector may also be a list of a single constant KV_OPEN or
KV_FLOAT or KV_PERIODIC, in which a uniform knot vector with the
appropriate length and with an open, floating or periodic end condition
will be constructed automatically.
SurfaceType SCRVTR( SurfaceType Srf, ConstType PtType, ConstType Dir )
symbolically computes the extreme curvature bound on Srf.
If Dir is either ROW or COL, then the normal curvature square
of Srf in Dir is computed symbolically and returned.
Otherwise, an upper bound on the sum of the squares of the two
principle curvatures is symbolically computed and returned.
The returned value is a surface that can be evaluated to the curvature
bound, given a UV location. The returned surface value is a scalar field
of point type P1 (scalar rational).
However, if PtType is one of E1, P1, E3, or P3, the returned surface
is coerced to this given type. If the types are one of E3, or P3, then the
Y and Z axes are set to be equivalent to the U and V parametric domains.
This function computes the square of the normal curvature scalar
field for surfaces as (in the U parametric direction, same for V),
2
d S
< n , --- >
2
u du
k (u, v) = ------------
n
dS ds
< -- , -- >
du du
and computes the sum of the squares of the principle curvatures as,
computes the square of the normal curvature in the U and V directions, flips
its scalar value from X to Z using rotations and scales the fields to
reasonable values, and then displays them.
It also displays a total bound on the normal curvature.
Due to the large degree of the resulting fields, be aware that rational
surfaces will compute into large degree curvature bound fields. See also
IRITSTATE "InterpProd" option for faster symbolic computation.
FIGURE:
From left to right: original surface, normal curvature in the U
direction, normal curvature in the V direction, sum of the square of
principle curvatures (different scales).
All computed using SCRVTR.
computes the principle curvatures and directions of surface Srf
at parametric location (U, V). A list of four elements
(k1, V1, k2, V2), with k1/V1 being the first principle curvature/direction
and k2/V2 being the second, is returned. If Euclidean is TRUE then
the principle curvatures are returned in Euclidean space.
Consecutive calls with the same surface Srf to SCRVTREVAL will yield
more efficient evaluations as derivative data is cached.
Tiles a composition of Bump over surface BaseSrf
UDup by VDup times, creating a detailed bump geometry. Bump
can be any polygonal geometry whatsoever with XY coordinates that are
contained in the unit square [0, 1] x [0, 1], while Z serves as the elevation
above the surface. The composed geometry could inherit the UV texture
ccordinates from the UV coordinates found in Bump if LclUVs is TRUE
or inherit BaseSrf UV coordinates if LclUVs is FALSE.
constructs a bumpy BumpTorus with a bump tiled 6 x 8 times over the
surface.
+ = FIGURE:
Polygonal geometry (left) could be tiled over arbitrary surface,
torus in this case (middle), to yield a bumpy shape (right)
using the SDDMMAP function.
SurfaceType SDERIVE( SurfaceType Srf, NumericType Dir )
returns a vector field surface representing the differentiated surface
in the given direction (ROW or COL). Evaluation of the returned surface at
a given parameter value will return a vector tangent to Srf in
Dir at that parameter value.
computes the two partial derivatives of the surface Srf and computes
its normal as their cross product, at the parametric location (0.5, 0.5).
See also CDERIVE, TDERIVE, and MDERIVE.
subdivide a (possibly trimmed) surface into two at the specified parameter
value Param in the specified Direction (ROW or COL). Srf
can be either a B-spline surface in which Param must be contained in
the parametric domain of the surface, or a Bezier surface in which Param} can be arbitrary, extrapolating if not in the range of zero to one.
It returns a list of upto two sub-surfaces. The individual surfaces may be
extracted from the list using the NTH command. If Srf is a trimmed
surface, it may be the case that one of the two subdivided surfaces is
completely trimmed out, and hence only one surface will be returned.
subdivides Srf at the parameter value of 0.5 in the ROW direction.
FIGURE:
A surface can be subdivided into two distinct regions using SDIVIDE.
See also CDIVIDE, TDIVIDE, and MDIVIDE
computes the self intersection locations / curves of a given curve or
surface. Returned is a list of points / piecewise linear curves. The
returned locations, if in the parameteric space (see below), are pairs
of parameter values along the curve in case of a curve and a 4-tuple
holding the pair of surface location, in case of surfaces.
See MZERO for the meaning of SubdivTol and NumerTol.
If MinNrmlDeviation is positive it specifies the minimal deviation
angle required for the two normal at the self intersection (of the two
different interesecting locations), in degrees. If negative, a different
approach algother is used that eliminates the redundant diagonal factor
in the self intersection constraint.
If Euclidean, the returned data is in Euclidean space. Otherwise,
the returned data is in parameteric space.
computes the minimal subset of the given set RangesSet, that covers
the entire domain spanned by RangesSet. A range is a list object with
two numeric values, the start and end of this specific range. Each element
in RangesSet can be either a range, or a list of ranges.
OverlapTolerance specifies the tolerance to use in overlapping
ranges.
Returned is a list of indices (first element zero) that prescribe the
minimal coverage.
Note that the former case of a single range per element is solved in an
almost linear time whereas the later case of multiple ranges per element is
exponential. Hence, do not attempt to find minimal coverage of more than a
few elements in the later case.
provides a simple mechanism to manually modify a single control point number
UIndex and VIndex (base count is 0) in the control mesh of Srf
by substituting CtlPt instead. CtlPt must have the same point type as
the control points of Srf. The original surface Srf is not modified.
evaluates the provided (possibly trimmed) surface Srf at the given
UParam and VParam parameters. Both UParam and VParam
should be contained in the surface parametric domain if Srf is a
B-spline surface, or between zero and one if Srf is a Bezier surface.
The returned control point has the same type as the control points of
Srf.
Example:
CPt = SEVAL( Srf, 0.25, 0.22 );
evaluates Srf at the parameter values of (0.25, 0.22).
See also CEVAL, MEVAL, TEVAL.
computes the flecnodal curves over a given freeform geometry, Srf.
The flecnodal curves are curves of contact of order four with a line in an
asymptotic direction. SubdivTol and NumericTol controls the
subdivision and numeric tolerances of the approximation. Typically the
subdivision tolerance is fairly coarse. MergeTol prescribes the
tolerance of merging individual points into polylines. A negative value
will prescribe no merge. The ContactOrder should be 3 to compute
flecnodal curves and 4 to compute flecnodal points.
Example:
flecs = SFlecnodal( srf, 0.05, -1e-6, 1e-1, 3 );
See MZERO for the meaning of SubdivTol and NumerTol.
SurfaceType SFOCAL( SurfaceType Srf, NumericType Dir )
evaluates the focal surface field of surface Srf using the normal
curvature in the isoparametric direction as given by Dir (either
ROW or COL). Note this function is not using the principal curvatures as
is generaly the case for focal surfaces.
evaluates the focal surface using the COL isoparametric direction's
normal curvature of the glass surface.
FIGURE:
A focal surface (right) of a glass surface (left) can be computed
using SFOCAL.
constructs a surface by substituting the curves in CrvList as rows
in a control mesh of a surface. The curves in CrvList are made compatible
by promoting Bezier curves to B-splines if necessary, and raising the degrees
and refining as required before substituting the control polygons of the
curves as rows in the mesh. The other direction order is set by
OtherOrder, which cannot be larger than the number of curves.
If B-spline (OtherOrder is smaller than number of curves) end
conditions are set via OtherEndCond and can be one of KV_OPEN,
KV_FLOAT or KV_PERIODIC.
The surface interpolates the first and last curves only, if a Bezier
or open end conditions are selected; otherwise, no curve is interpolated.
FIGURE:
A surface can be constructed from a list of curves substituted
as rows into its mesh using SFROMCRVS. The surface does not
necessarily interpolate the curves.
evaluates the Gaussian curvature (K) field of surface Srf. If
NumerOnly is TRUE, only the numerator of the Gaussian curvature
is derived. Otherwise, if NumerOnly is FALSE, the full exact
Gaussian field is derived. NumerOnly TRUE may be used in cases
where the zero set of K is needed (parabolic lines).
evaluates the Gaussian curvaure of Srf1.
FIGURE:
The Gaussian curvature field (right) of the quadratic by
cubic surface (left) is computed using SGAUSS. The Gaussian
curvature field is scaled down to %1 to fit into the figure.
Compare with figure~protectref{fig-smean}.
See also EVOLUTE and SMEAN.
compute the silhouette edges of the given Srf or Pl from the
prescribed viewing direction ViewDir. The end result is a piecewise
linear approximation of the exact silhouette, and its accuracy is controlled
via the RESOLUTION variable, in the case of a freeform surface Srf.
If Euc is TRUE, the silhouette curves are returned on the surface,
in Euclidean space. Otherwise, the silhouette curves are returned in the
parametric space of Srf.
Both Euc and the RESOLUTION variables have no affect in the case of
a polygonal model Pl.
computes the silhouette curves of surface glass as viewed from
viewing direction (1, -2, 1), and returns the silhouette curves
in Euclidean space. See also ISOCLINE, PPROPFTCH and SASPCTGRPH.
computes a B-spline polynomial surface that interpolates or approximates
the rectangular grid or scattered set of points in PtList. The
B-spline surface will have orders UOrder and VOrder and mesh
of size USize by VSize control points. If the data is on a grid,
the knots will be spaced according to Param which can be one of
PARAM_UNIFORM, PARAM_CHORD, PARAM_CENTRIP or PARAM_NEILFOL. Currently,
only PARAM_UNIFORM is supported. For a scattered point set, the Param
parameter is ignored.
PtList is a list of points for grid data in which all
lists carry the same amount of points, thereby defining a
rectangular grid. For scattered data, PtList is a linear list
of points. All points in PtList must be of type (E1-E9, P1-P9)
control point, or regular PointType. If USize and VSize
are equal to the number of points in the grid data set of PtList,
the resulting surface will interpolate the data set. Otherwise,
if USize or VSize is less than the number of points in
the grid of PtList, the point data set will be least square
approximated. At no time can USize or VSize be larger that the
number of points in PtList or lower than UOrder and VOrder,
respectively. If USize or VSize are zero, the grid size
is used, forcing an interpolation of the data set.
If PtList contains a linear list of points, these points are
treated as scattered. Each scattered point is assumed to be holding the
parameteric location at which to interpolate its first two coefficients.
The other coefficients are the interpolation values. In other words,
to interpolate scattered data of type E3, E5 control points in a linear
list must be provided in (u, v, x, y, z) format. Scattered data is
interpolated over a unit square (0 to 1) parameteric domain in both u
and v.
All interior knots will be distinctly preserving maximal continuity.
The resulting B-spline surface will have open end conditions.
See also SINTPCRVS, SFROMCRVS.
Example:
pl = nil();
pll = nil();
for ( x = -5, 1, 5,
pl = nil():
for ( y = -5, 1, 5,
snoc( point( x, y, sin( x * Pi / 2 ) * cos( y * Pi / 2 ) ),
pl )
):
snoc( pl, pll ) );
s1 = SINTERP( pll, 3, 3, 8, 8, PARAM_UNIFORM );
s2 = SINTERP( pll, 3, 3, 11, 11, PARAM_UNIFORM );
samples an explicit surface sin(x) * cos(y) at a grid of 11 by 11 points,
least square fit with a grid of size of 8 by 8 surface s1, and
interpolates surface s2 using this data set. See also CINTERP and
LINTERP.
FIGURE:
A surface least square fitting a data set with insufficient
degrees of freedom (left) and actually interpolating the data
set (right), all using SINTERP.
constructs a surface by fitting it to the curves in CrvList. The
curves in CrvList are made compatible by promoting Bezier curves to
B-splines if necessary, and raising the degrees and refining as required
before fitting a surface through them all. The other direction order is
set by OtherOrder, which cannot be larger than the number of curves.
If B-spline (OtherOrder is smaller than number of curves) end
conditions are set via OtherEndCond and can be one of KV_OPEN,
KV_FLOAT or KV_PERIODIC. Finally OtherParam sets the
parametrization in the other direction and can be one of PARAM_CENTRIP,
PARAM_CENTRIP, PARAM_CHORD, or PARAM_NIELFOL.
See also SINTERP, SFROMCRVS.
computes locations in the plane of points that are equadistant from the
three given entities. Entities can be points or control points or curves,
all in the XY plane. The equadistant points are computed as the mutual
intersection of the bisectors of the entities. Infinite bisectors (such
as the bisector of two points) are extended up to OutExtent.
Epsilon controls the tolerances while FineNess controls the
subdivision fineness in the bisector intersection computations.
MZeroTols controls the subdivision/numeric tolerances of the MV solver,
as a list of the two numeric tolerances.
computes the eight points that are equadistant to three circles.
FIGURE:
Computes the eight points that are equadistant to three circles,
using SKEL2DINT.
See also CRC2CRVTAN.
evaluates the mean curvature field of surface Srf as follows:
if NumerOnly is true, it computes the numerator of only the Mean curvature.
Otherwise, if NumerOnly is false, the square of the exact Mean
curvature field is derived. NumerOnly TRUE may be used in cases
where the zero set of H is needed (k1 == -k2 points).
evaluates the square of the mean curvature of Srf1.
FIGURE:
The square of the mean curvature field (right) of the quadratic by
cubic surface (left) is computed using SMEAN. The square of the
mean curvature field is scaled down to %1 to fit into the figure.
Compare with figure~protectref{fig-sgauss}.
See also EVOLUTE and SGAUSS.
merges two surfaces along the requested direction (ROW or COL). If
SameEdge is non-zero (ON or TRUE), then the common edge is assumed to be
identical and copied only once. Otherwise (OFF or FALSE), a ruled surface
is constructed between the two surfaces along the (not) common edge.
CurveType SMOEBIUS( CurveType Crv, NumericType Ratio, NumericType Dir )
rebalances the weights of a rational surface using the Moebius
transformation. The shape of the surface remains identical, while the
speed is modified in the direction Dir.
Ratio controls the ratio between the last and first weights of
the first row/column. If Ratio = 0, the first and last weights are
made equal.
Given a (list of) polygonal object(s), Obj, compute normals to
the vertices by averaging the normals of the polygons that share the
vertices. Only vertices where the deviation between the polygons' normals
and the averaged normal is less than MaxAngle are updated.
If MaxAngle is negative, all vertices normals are cleared and all
polygon normals reevaluated.
This is useful for polygonal data sets that have no vertex normals.
Example:
A = box( vector( -1, -1, -1 ), 2, 2, 2 );
B = SMOOTHNRML( A, 90 );
computes average normals to a curve resulting in the smoothly shaded display
of a cube. See also FIXPLNRML.
compute the integral moment surface, MSrf, of the given surface
Srf, up to a sign. The computed moment can be either a first order
moment when Moment = 1, or a second order moment when Moment = 2.
If Srf is a closed surface with domain (u0, v0) to (u1, v1), then
the difference of MSrf(u1, v1) - MSrf(u0, v0) is the requested
moment. Otherwise, the computation is for the volume occupied between the
surface Srf and the XY plane.
If Eval is TRUE, the actual numerical value of the moment is returned.
The moment integral surface is returned if Eval is FALSE.
Axis1 and Axis2 prescribe the two axes to compute the moments
for a second order moment computation. For a first order moment
computation only Axis1 is considered.
creates a new surface which is a convex blend of the two given surfaces.
The two given surfaces must be compatible (see FFCOMPAT) before this blend
is invoked. This is very useful if a sequence that "morphs" one surface to
another is to be created.
Example:
for ( i = 0.0, 1.0, 11.0,
Msrf = SMORPH( Srf1, Srf2, i / 11.0 ):
color( Msrf, white ):
attrib( Msrf, "rgb", "255,255,255" ):
attrib( Msrf, "reflect", "0.7" ):
save( "morp1-" + i, Msrf )
);
creates a sequence of 12 surfaces, morphed from Srf1 to Srf2
and saves them in the files "morph-0.itd" to "morph-11.itd".
See also PMORPH, CMORPH and TMORPH.
FIGURE:
A morphing sequence between a bottle and a glass. Snapshots computed
using SMORPH.
symbolically computes a vector field surface representing the non-normalized
normals of the given surface. That is, the normal surface, evaluated at
(u, v), provides a vector in the direction of the normal of the original
surface at (u, v). The normal surface is computed as the symbolic cross
product of the two surfaces representing the partial derivatives of the
original surface.
Example:
NrmlSrf = SNRMLSRF( Srf );
FIGURE:
A vector field normal (right) computed for a unit sphere (left) using
SNRMLSRF. The normal field degenerates at the north and south
poles because the surface is not regular there.
computes the parabolic edges of a freeform surface, Srf, as
the zero set of the Gaussian curvature. A scalar field with the sign of
the Gauss curvature is computed and its zero is derived.
If Euclidean is false, the list of (piecewise linear) parabolic
curves is returned in the parametric space of Srf. Otherwise, if
Euclidean is true, the parabolic curves are mapped onto Srf.
Example:
pl = nil();
pll = nil();
for ( x = -3, 1, 3,
pl = nil():
for ( y = -3, 1, 3,
snoc( point( x, y, sin( x * Pi / 2 ) * cos( y * Pi / 2 ) ),
pl ) ):
snoc( pl, pll ) );
EggBase = sinterp( pll, 4, 4, 0, 0, PARAM_UNIFORM );
Resolution = 15;
Parab = SPARABOLC( EggBase, true );
constructs a surface in the shape of an egg carton's base and then derives its
parabolic edges in Euclidean space.
PolygonType SPHERE( VectorType Center, NumericType Radius )
creates a SPHERE geometric object, defined by Center as the center of
the SPHERE, and with Radius as the radius of the SPHERE.
See RESOLUTION for accuracy of SPHERE approximation as a polygonal model.
See IRITSTATE's "PrimRatSrfs" and "PrimRatSrfs" state variables.
splits an objected of several linked list data elements such as polygons,
curves, or suraces, into a list object that contains an object for each of
the individual objects.
Example:
ObjLst = SPLITLST( axes );
splits the axes object into a list object of several objects each holding
a single polyline.
creates a polynomial/rational surface out of the provided control mesh.
The created surface employs the monomial power basis. CtlMesh is a
list of rows, each of which is a list of control points. All control points
must be of type (E1-E9, P1-P9), or regular PointType defining the surface's
control mesh. The surface's point type will be of a space which is the
union of the spaces of all points.
constructs a bilinear power basis surface, coerces it to a Bezier form,
coerces the Bezier form back to a power basis, and then compares the result
for equality.
computes the radial curvature of surface Srf, as viewed from view
direction ViewDir. See MZERO for the meaning of the SubdivTol
and NumerTol tolerances. MergeTol specifies the tolerance to
use to merge points into polygons,
computes the intersection of ray (Pt, Dir) with Bezier surface
Srf, using the Bezier clipping scheme. The returned list is of the
form "list( NumInters, UV0, EucPt0, ..., UVn, EucPtn )".
provides the ability to Replace a knot vector of Srf or refine
it in the specified direction Direction (ROW or COL).
KnotList is a list of knots at which to refine Srf. All knots should
be contained in the parametric domain of Srf in Direction. If the knot
vector is replaced, the length of KnotList should be identical to the
length of the original knot vector of Srf in Direction. If Srf
is a Bezier surface, it is automatically promoted to be a B-spline surface.
extract a region of Srf between MinParam and MaxParam
in the specified Direction. Both MinParam and MaxParam
should be contained in the parametric domain of Srf in Direction,
except for Bezier surfaces when MinParam and MaxParam can be
arbitrary (extrapolating if not between zero and one).
extracts the region of Srf from the parameter value 0.3 to the
parameter value 0.6 along the ROW direction. The COLumn direction is
extracted as a whole.
FIGURE:
A region can be extracted from a freeform surface using SREGION.
See also CREGION, TREGION, and MREGION.
reparametrize Srf over a new domain from MinParam to MaxParam,
in the prescribed Direction. This operation does not affect the geometry
of the (trimmed) surface and only affine transforms its knot vectors. A
Bezier (trimmed) surface will automatically be promoted into a B-spline
surface by this function.
If MinParam equals MaxParam and both equates with one of the
parameterization keywords of PARAM_CENTRIP, PARAM_CENTRIP, PARAM_CHORD, or
PARAM_NIELFOL, then that parametrization is approximated for the surface, by
changing the knot sequence. Note this last operation affects the geometry
of the surface.
reverse Srf by flipping the U and V parametric directions.
Note that the unary minus (i.e -Srf) also reverses the surface by
reversing the U parametric direction. If the surface is a trimmed surface,
the trimming curves are flipped accordingly to yield the same shape.
computes the developable sheet(s) bi-tangent to given two surfaces
Srfs. Srfs can be either a list of two surfaces or a single
surface in which self bi-tangencies are being sought.
If Orientation is 0 all bi-tangent sheet(s) are returned. Otherwise, if
Orientation equal +1 or -1, bi-tangent sheets(s) with same or different
tangency orienation are returned, respectively. See MZERO for the meaning
of the SubdivTol and NumerTol tolerances.
Returns are lists, one per developable sheet, of sample points in E4, having
two pairs of parameter values of the bi-tangent points in the two surfaces,
in their parametric domain.
computes the self bi-tangencies of a given bottle-like surface.
FIGURE:
Extracts self bi-tangent developable out of the given surface
using SRF2TANS.
See also SRF3TANS.
computes the plane(s) tri-tangent to given three surfaces Srfs.
Srfs can be either a list of three surfaces or a list of one
surface in which self bi-tangencies are being sought.
If Orientation is 0 all tri-tangent planes are returned. Otherwise, if
Orientation equal +1 or -1, tri-tangent sheets(s)with same or different
tangency orienation are returned, respectively. See MZERO for the meaning
of the SubdivTol and NumerTol tolerances.
Returns are lists, one per developable sheet, of sample points in E6, having
three pairs of parameter values of the tri-tangent points in the three
surfaces, in their parametric domain.
computes the two outer oriented tri-tangencies to three approximate
ellipsoids. Extract and draw the two tri-tangent triangles.
FIGURE:
Extracts tri-tangent planes out of the given three approximate
ellipsoids using SRF3TANS.
See also SRF2TANS.
ListType SRFFFORM( SurfaceType Srf, NumericType Form )
derives the four coefficients of the 1st, 2nd or 3rd surface fundamental
forms. Form can be one of 1, 2, or 3 only, designating the requested
form. Since this 2x2 matrix is symmetric, only three coefficients are
returned as a list of three scalar surfaces as (A11, A12 == A21, A22).
compute the minimal (IsMinDist TRUE) or maximal (IsMinDist FALSE)
distance betweeb surface Srf and the line defined by LnPt, a point
on the line, and LnDir, the direction of the line.
See MZERO for the meaning of the SubdivTol and NumerTol
tolerances.
approximates the kernel of (closed and continuous) surface Srf by
deriving the parabolic points of Srf and intersecting half planes
tangent to Srf and placed at a sampled set of parabolic locations. The
fineness of the parabolic curves' approximation is governed by Fineness
and the sampling rate is controled by SkipRate.
Example:
Krnl = SRFKERNEL( Srf, 40, 15 );
estimates the kernel of Srf with Fineness of 40 and SkipRate
of 15.
compute the minimal (IsMinDist TRUE) or maximal (IsMinDist FALSE)
distance between surface Srf and point Pt.
See MZERO for the meaning of the SubdivTol and NumerTol
tolerances.
Example:
Dst = SRFPTDST( Srf, Pt1, FALSE, 0.1, 1e-6 );
computes the maximal distance between Srf and point Pt1.
See also SRFLNDST, CRVPTDST.
computes the first intersection, if any, of the prescribed ray originating
from RayOrigin in direction RayDirection with surface Srf.
It returns the intersection point in the parametric space of Srf with
the U and V coordinates as the X and Y coefficients of the returned value.
The intersection is computed between the ray and a polygonal approximation
of the surface Srf as set via the RESOLUTION variable.
If RayDirection is the zero vector, the closest position on Srf
to RayOrigin is returned instead.
Tolerance sets the accuracy of the computation.
This function is tailored toward many invokations of ray-surface test
against the same surface. Hence, it caches local data for faster processing.
To signal the function that the processing of the current surface is
complete, use a Tolerance of zero.
This is a complete example of constructing a ray and intersecting it against a
surface of a glass at two different resolutions, resulting in two different
accuracies. See also RESOLUTION.
computes the intersection curve of two surfaces, Srf1 and Srf2,
up to Epsilon accuracy. The returned data is in Euclidean space if
Euclidean is true; otherwise it is in the parametric space.
A list of two lists (for the two surfaces) of n curves each,
where n is the number of intersection curves, is returned.
If Alignment is true, the surfaces are rotated to that one bbox
of one surface whose axes are aligned, increasing the probability of detecting
disjoint cases.
computes the Euclidean intersection curves of a cone and a sphere,
in general positions. The Euclidean curves on the first surface are
extracted while purging the Euclidean curves on the second surface.
See also RRINTER, SSINTR2 and GGINTER.
computes the intersection curve of two surfaces, Srf1 and Srf2,
up to SubdivTol/NumerTol accuracy. The returned data is in Euclidean
space if Euclidean is true; otherwise it is in the parametric space.
Step controls the forward step size while tracing the intersection
curves.
A list of pairs of (piecewise linear) intersection curves is returned, one
for each connected component. If Euclidean is true a Euclidean curve
is also evaluated and returned.
compute the tangent vector to the (possibly trimmed) surface Srf at the
parameter values UParam and VParam in Direction. The
returned vector has a unit length. If Normalize TRUE, the returned
vector is normalized as well.
Example:
Tang = STANGENT( Srf, ROW, 0.5, 0.6, TRUE );
computes the unit tangent to Srf in the ROW direction at the parameter
values (0.5, 0.6).
extracts an iso surface from a trivariate function TV in the specified
Direction (ROW or COL or DEPTH) at the specified parameter value
Param.
Param must be contained in the parametric domain of TV in
Direction direction.
The returned surface is in the trivariate TV.
extracts an iso surface of TV1, in the col direction at
parameter value 0.4.
FIGURE:
Extracts an iso bilinear surface from a trilinear function,
using STRIVAR.
See also SMESH, CSURFACE, MFROMMV.
create a surface of revolution by rotating the first polygon/curve of the
given Object, around the Z axis. Use the linear transformation functions
to position a surface of revolution in a different orientation.
constructs a piecewise linear B-spline curve in the XZ plane and uses it to
construct a surface of revolution by rotating it around the Z axis.
See also SURFPREV, SURFREVAXS, SURFREV2, SURFREVAX2, and TVREV.
FIGURE:
A surface of revolution, VTailAntn in surfrev documentation, can be
constructed using SURFREV or SURFPREV.
create a surface of revolution by rotating the first polygon/curve of the
given Object, around the Axis axis. Use the linear transformation
functions to position a surface of revolution in a different location.
Example:
Glass = SURFREVAXS( GCross, vector( 1, 0, 1 ) );
constructs a surface of revolution by rotating GCross around the axis of (1, 0, 1).
See also SURFPREV, SURFREV, SURFREV2, SURFREVAX2.
create a surface of revolution by rotating the first polygon/curve of the
given Object, around the Z axis. The rotation does not form a complete
circle and is from the StartAngle to the EndAngle only, in degrees,
starting from the X axis toward the Y axis, in the XY plane. Use the linear
transformation functions to position a surface of revolution in a different
orientation.
Example:
Glass = SURFREV2( GCross, 45, 180 );
constructs a surface of revolution by rotating it around the Z axis from 45
to 180 degrees.
See also SURFPREV, SURFREVAXS, SURFREV, SURFREVAX2.
create a surface of revolution by rotating the first polygon/curve of the
given Object, around the Axis axis. The rotation does not form
a complete circle and is from the StartAngle to the EndAngle only, in
degrees, starting from the X axis toward the Y axis, in the XY plane.
Use the linear transformation functions to position a surface of revolution
in a different location.
constructs a polygonal surface of revolution by rotating PolygonType
PolyCross around the axis (1, 0, 1), from 45 to 180 degrees.
See also SURFPREV, SURFREVAXS, SURFREV2, SURFREV.
computes a decomposition of a freeform surface Srf into regions, each
visible with a cone visibility of ConeSize degrees from one direction.
In other words, all points in one region have angular deviation of their
surface normal of less than ConeSize degrees from the set viewing
direction. Resolution controls the accuracy of the computation; the higher
this value is, more exact the result. 20 is a good starting value. Each
returned region is a trimmed surface that has a "ViewDir" attribute that
contains the viewing direction of this region.
Example:
c1 = cbezier( list( ctlpt( E3, 1.0, 0.0, 0.5 ),
ctlpt( E3, 1.1, 0.0, 0.0 ),
ctlpt( E3, 1.0, 0.0, -0.5 ) ) );
Simp = sregion( surfPRev( c1 ), col, 0.0, 1.0 ) * rz( 45 ) * rx( 90 );
Decomp = SVISIBLE( Simp, 20, 30 * pi / 180 );
SimDecomp = nil();
Mod = 5;
for ( i = 1, 1, sizeof( Decomp ),
o = nth( Decomp, i ):
v = getattr( o, "ViewDir" ):
l = ( ctlpt( E3, 0, 0, 0 ) + coerce( v, e3 ) ) * sc( 1.5 ):
j = floor( ( i - 1 ) / Mod ):
snoc( list( o, Simp, l, axes )
* view_mat * tx( ( i - 1 - j * Mod ) * 2 - 4 )
* ty( -j * 2 ),
SimDecomp ) );
view( SimDecomp, on );
decomposes a given surface Simp into regions of 30 degrees at most,
goes over the decomposed regions and orders them five in a row.
FIGURE:
A decomposition of a freeform surface into cone visible regions
of 30 degrees. The direction of visibility is also presented.
Computed using the SVISIBLE command.
computes the integral volume surface, VSrf, of the given surface
Srf, up to a sign.
If Srf is a closed surface with domain (u0, v0) to (u1, v1), then
the difference of VSrf(u1, v1) - VSrf(u0, v0) is the requested
volume. Otherwise, the computation is for the volume occupied between the
surface Srf and the XY plane if Method equals one, and the
volume occupied between the surface Srf and the
origin if Method equals two.
If Eval is TRUE, the actual numerical value of the volume is returned.
The volume integral surface is returned if Eval is FALSE.
constructs a generalized cylinder surface. This function sweeps a specified
cross section CrossSection along the provided Axis. If a list
of curves CrossSectionList is specified instead, the cross sections
are blended along the Axis of the curve so that the first/last cross
section in the list fits the first/last location on the Axis.
By default, when frame specification is OFF, the orientation
of the cross section is computed using the Axis curve tangent and
normal. However, unlike the Frenet frame, attempt is made to minimize
the normal change, as can happen along inflection points in Axis.
If a VectorType FrameVec is provided as a frame orientation setting,
it is used to fix the binormal direction to this value. In other words, the
orientation frame has a fixed binormal. If a CurveType FrameCrv is
specified as a frame orientation setting, this vector field curve is
evaluated at each placement of the cross section to yield the needed binormal.
The resulting sweep is only an approximation of the real sweep. The
resulting sweep surface will not be exact, in general.
Refinement of the axis curve at the proper location, where accuracy is
important, should improve the accuracy of the output. The parametric domains
of FrameCrv do not have to match the parametric domain of Axis,
and its parametric domain is automatically made compatible by this function.
constructs a rounded rectangle cross section and sweeps it along an arc,
while orienting it several ways. The axis curve Axis is manually
refined to better approximate the requested shape.
See also SWPSCLSRF for sweep with scale.
FIGURE:
Three examples of the use of SWEEPSRF (Srf1, Srf2, Srf3 from left to
right in sweepsrf documentation).
constructs a generalized cylinder surface. This function sweeps a specified
cross section CrossSection along the provided Axis. If a list
of curves CrossSectionList is specified instead, the cross sections
are blended along the Axis of the curve so that the first/last cross
section in the list fits the first/last location on the Axis.
The cross section may be scaled by a constant value Scale, or scaled
along the Axis parametric direction via a scaling curve ScaleCrv.
By default, when frame specification is OFF, the orientation
of the cross section is computed using the Axis curve tangent and
normal. However, unlike the Frenet frame, attempt is made to minimize
the normal change, as can happen along inflection points in Axis.
If a VectorType FrameVec is provided as a frame orientation setting,
it is used to fix the binormal direction to this value. In other words, the
orientation frame has a fixed binormal. If a CurveType FrameCrv is
specified as a frame orientation setting, this vector field curve is
evaluated at each placement of the cross section to yield the needed binormal.
ScaleRefine is an integer value to define possible refinement of the
Axis to reflect the information in ScalingCrv. A value of zero will
force no refinement while a value of n > 0 will insert n times the
number of control points in ScaleCrv into Axis, better emulating
the scaling requested.
The resulting sweep is only an approximation of the real sweep. The
scaling and axis placement will not be exact, in general.
Manual refinement (in addition to ScaleRefine) of the axis curve at
the proper location, where accuracy is important, should improve the accuracy
of the output. The parametric domains of ScaleCrv and FrameCrv do
not have to match the parametric domain of Axis, and their domains are
made compatible by this function.
constructs a rounded rectangle cross section and sweeps it along a circle,
while scaling and orienting in several ways. The axis curve Axis is
automatically refined in Srf2 to better approximate the requested
scaling.
See also SWEEPSRF for sweep with no scale.
FIGURE:
Three examples of the use of SWPSCLSRF (Srf1, Srf2, Srf3 from left
to right in SWPSCLSRF documentation).
creates two algebraic sum surfaces, one in the shape of a cylinder as
a sum of a line and a circle, and one circular sweep.
FIGURE:
An algebraic swung sum of a circle and a line creating a portion
of a sphere (left) and a general swung surface between a circle and
a periodic curve (right), both using SWUNGASUM.
computes a normal surface as the cross product of the two surface partial
derivatives (see SNRMLSRF).
See also SYMBIPROD, SYMBDPROD, SYMBPROD, SYMBSUM, SYMBDIFF.
compute the symbolic difference of the two given
curves/surfaces/multivariates as a curve, surface or multivariate.
The difference is computed coordinate-wise.
CurveType SYMBDPROD( CurveType Crv1, CurveType Crv2 )
or
CurveType SYMBDPROD( CurveType Crv1, VectorType Vec2 )
or
SurfaceType SYMBDPROD( SurfaceType Srf1, SurfaceType Srf2 )
or
SurfaceType SYMBDPROD( SurfaceType Srf1, VectorType Vec2 )
or
MultivarType SYMBDPROD( MultivarType MV1, MultivarType MV2 )
or
MultivarType SYMBDPROD( MultivarType MV1, VectorType Vec2 )
compute the symbolic dot (inner) product of the two given
curves/surfaces/multivariates as a scalar
curve/surface/multivariate. As an alternative, one parameter can
also be a regular vector.
computes a scalar curve that at parameter t is equal to the distance
square between Crv1 at t and Crv2.
See also SYMBCPROD, SYMBIPROD, SYMBPROD, SYMBSUM, SYMBDIFF.
compute the inner product of two B-spline basis functions. The first form
defines the function space to be the same as the function space of Crv
of order Order1 (first basis function) by Order2. The second
basis function in the inner product is defined as,
_
|
| Bi,o1(t) Bj,o2(t) dt.
|
-
The second form prescribes the indices of the two basis functions,
i and j. The first form returns zero in case of an error. The second
form returns the result of the inner product.
prints all possible inner products of the B-spline function space of
pcircle, of cubics vs. cubics.
See also SYMBCPROD, SYMBDPROD, SYMBPROD, SYMBSUM, SYMBDIFF.
compute the symbolic product of the two given curves/surfaces/multivariates
as a curve, surface or multivariate. The product is computed coordinate-wise.
Example:
ProdSrf = SYMBPROD( Srf1, Srf2 )
See also SYMBCPROD, SYMBDPROD, SYMBIPROD, SYMBSUM, SYMBDIFF.
creates a Bezier trivariate using the provided control mesh. CtlMesh
is a list of planes, each of which is a list of rows, each of which is a list
of control points. All control points must be of type (E1-E9, P1-P9), or
regular PointType defining the trivariate's control mesh. The surface point
type will be of a space which is the union of the spaces of all points.
creates a trivariate Bezier which is linear in the first direction, and
quadratic in the second and third.
FIGURE:
A trivariate Bezier of degree 2 by 3 by 3 (left) and a trilinear
B-spline (right). Both share the same control mesh.
Given a surface closed in one direction (like a sweep of a closed curve),
the surface is subdivided into four segments in the parametric space that
are then fed into TBOOLSUM. This is useful if a volume bounded by
Srf should be "filled" abd parameterized.
Example:
Srf = BOOLONE( CylinderSrf );
creates a cylinder volume, parameterizing the entire volume of
CylinderSrf.
FIGURE:
A volumetric Boolean sum of a cylinder (left) using TBOOLONE
and a general volumetric Boolean sum of six surfaces (right)
using TBOOLSUM.
See also TBOOLSUM, BOOLONE.
constructs a volume using the provided six surfaces as its six boundary
surfaces. Surfaces do not have to have the same order or type, and will be
promoted to their least common denominator. The end boundary curves of the
six surfaces should match. Surfaces Srf1, Srf2, Srf3,
and Srf4 should share one parameteric direction and should form
a topological cylinder where Srf5 and Srf6 serve as two bottom
and top caps for. Srf5 and Srf6 are optional and if not
provided, surface Boolean sum is use to construct them from surfaces
Srf1, Srf2, Srf3, and Srf4.
creates a B-spline trivariate with the provided UOrder, VOrder
and WOrder orders, the control mesh CtlMesh, and the three knot
vectors in KnotVectors.
CtlMesh is a list of planes, each of which is a list of rows, each
of which is a list of control points. All control points must be of point
type (E1-E9, P1-P9), or regular PointType defining the trivariate's control
mesh. Trivariate point type will be of a space which is the union of the
spaces of all points.
KnotVectors is a list of three knot vectors. Each knot vector is a
list of NumericType knots of length #CtlPtList plus the Order.
If, however, the length of the knot vector is equal to #CtlPtList +
Order + Order - 1}, the curve is assumed to be periodic.
The knot vector may also be a list of a single constant, KV_OPEN,
KV_FLOAT or KV_PERIODIC, in which a uniform knot vector with the
appropriate length and with open, floating or periodic end conditions
will be constructed automatically.
computes differential curvature properties of an isosurface of
the given trivariate TV at the given (parameteric) location
Pos. Following the value of ComputeWhat, the result equals,
-1
Initialization (a must prelude)
0
Conclusion (a must postlude)
1
Returns a vector hold of the gradient
2
Returns a list of three vectors
equal to the Hessian of this location
3
Returns a list of two scalar values
(Principle curvatures) and two vectors
(Principal directions).
Every evaluation must start with an invocation of ComputeWhat
equal to -1 and terminate with ComputeWhat 0. In both cases, 1 is
returned in case of success.
TrivarType TDERIVE( TrivarType TV, NumericType Dir )
returns a vector field trivariate representing the differentiated
trivariate in the given direction (ROW, COL, or DEPTH). Evaluation of the
returned trivariate at a given parameter value will return a vector
representing the partial derivative of TV in Dir at that
parameter value.
subdivides a trivariate into two at the specified parameter value Param
in the specified Direction (ROW, COL, or DEPTH). TV can be either
a B-spline trivariate in which Param must be contained in the parametric
domain of the trivariate, or a Bezier trivariate in which Param must be
in the range of zero to one.
It returns a list of the two sub-trivariates. The individual trivariates
may be extracted from the list using the NTH command.
subdivides Tv2 at the parameter value of 0.3 in the DEPTH direction,
FIGURE:
A trivariate can be subdivided into two distinct regions using
TDIVIDE.
See also CDIVIDE, SDIVIDE, and MDIVIDE
provides a simple mechanism to manually modify a single control point number
UIndex, VIndex and WIndex (base count is 0) in the control mesh
of Srf by substituting CtlPt instead. CtlPt must have the same
point type as the control points of Srf. Original surface Srf is
not modified.
evaluates the provided trivariate TV at the given UParam,
VParam and WParam values. UParam, VParam,
WParam must be contained in the surface parametric domain if TV
is a B-spline trivariate, or between zero and one if TV is a Bezier
trivariate. The returned control point has the same type as the control
points of TV.
Example:
CPt = TEVAL( TV1, 0.25, 0.22, 0.7 );
evaluates TV at the parameter values of (0.25, 0.22, 0.7).
See also CEVAL, SEVAL, MEVAL.
creates a displayable geometry that represents the text in Str, with
Spacing space between individual characters. Each character is scaled
by Scaling where scaling of one generates a close to unit size
character.
Example:
a = TEXTGEOM("Text", vector( 0.12, 0, 0 ), 0.1 );
b = TEXTGEOM("IRIT", vector( 0, -0.12, 0 ), 0.1 );
creates a horizontal Text and a vertical top to bottom IRIT,
both as geometrical objects. See TEXTWARP and IRITSTATE's "LoadFont"
state variable.
warps the given text, Text, using surface Srf as warping
function with HSpace setting the horizontal spacing between
characters, VBase and VTop controls the vertical spacing
of the characters in Srf, and Ligature, if not zero, sets
the amount to contract the distance between two adjacent characters.
FIGURE:
Font and text warping using the TEXTWARP function.
Example:
constructs a trivariate by substituting the surfaces in SrfList as
planes in a control mesh of a trivariate. Surfaces in SrfList are
made compatible by promoting Bezier surfaces to B-splines if necessary,
and raising degree and refining as required before substituting the
control meshes of the surfaces as planes in the mesh of the trivariate.
The other, third, direction order is controlled by OtherOrder and
OtherEndCond. OtherOrder cannot be larger than the number of
surfaces, and OtherEndCond prescribes the desired end conditions as
one of KV_OPEN, KV_FLOAT or KV_PERIODIC.
The trivariate interpolates the first and last surfaces only.
constructs a trivariate from five planar surfaces and displays both the
trivariate and the five planar surfaces, in different colors.
FIGURE:
A trivariate (thin lines) is constructed via five planar surfaces
(thick lines) using the TFROMSRFS constructor...
Given a trivariate data structure or a list of points in R3, the above
computes a fitted trivariate in the prescribed function space (i.e.
U/V/WLength and U/V/WOrder) that interpolates/least squares approximates the
given trivariate, TV, at the node parameter values.
PtList is a list of points in Rn, n > 3. The first three coordinates
of each points in PtList prescribes the (u, v, w) parametric value and
the rest, the interpolation values. To construct a mapping from R3 to R3,
the points of PtList should be in R6. To construct a scalar trivariate
function, R4 points are expected. The (u, v, w) points are assumed to be
containted in a unit curve paramteric space - zero to one in all three
dimensions.
If U/V/WOrder are zero and the first parameter is a trivariate, the
respective order is taken for TV.
If U/V/WLength are zero and the first parameter is a trivariate, the
respective length is taken for TV.
creates a new trivariate which is a convex blend of the two given
trivariates. The two given trivariates must be compatible (see FFCOMPAT)
before this blend is invoked. This isv ery useful if a sequence that "morphs"
one trivariate to another is to be created and in combination with MRCHCUBE.
Example:
Size = 0.05;
for ( i = 0, step, 1.0,
Tv = TMORPH( Tv1, Tv2, i ):
view( mrchcube( list( Tv, 1, off ),
point( Size, Size, Size ), 1, IsoVal ), on ) );
creates a sequence of 1/step trivariates, morphed from Tv1 to Tv2
and displays an extracted iso surface at level IsoVal.
See also MRCHCUBE, PMORPH, CMORPH and SMORPH.
computes the two outer, if OuterTans TRUE, or the two inner
if OuterTans FALSE, bi-tangents between the prescribed two circles.
Note the bi-tangents might no exist of one circle is containt in the other.
Trims local and global self intersections in curve OffCrv (surface
OffSrf) that is an offset approximation to curve Crv (surface
Srf) with parameters Params as follows:
For curves, Params contains the 4 paramers (Method, Tol, TrimAmount,
NumerTol) stating with the Method of trimming which can be 1 of distance map
trmming or 2 for self intersection via uv-elimination. 2nd paramter is the
tolerance of the subdivision search, 3rd is the trimming amount which should
be a tad below the offset distance and the last parameter is a numerical
tolerance to improve trimmed locations.
For surfaces Params hold 5 parameters (TrimAmount, Validate,
Euclidean, SubdivTol, NumerTol). The TrimAmount is again a tad below the
offset distance, Validate is a boolean to activate the filering of self
intersecting regions, Eculidean sets the output form to be in Euclidean or
parametric space and finally SubdivTol and NumerTol is used by the
multivariate solver.
approximates several offset curves at offset amounts of 0.15 * i to
curve c0 and trim the self intersections detected in them.
FIGURE:
Properly trimmed offsets could be created using the TOFFSET function.
creates a TORUS geometric object, defined by Center as the center
of the TORUS, Normal as the normal to the main plane of the TORUS,
MRadius and mRadius as the major and minor radii of the TORUS.
See RESOLUTION for the accuracy of the TORUS approximation as a polygonal
model. See IRITSTATE's "PrimRatSrfs" and "PrimRatSrfs" state variables.
constructs a torus with its major plane as the XY plane, major radius of
0.5, and minor radius of 0.2.
FIGURE:
A torus primitive can be constructed using a TORUS constructor...
provides the ability to Replace a knot vector of TV or refine
it in the specified direction Direction (ROW, COL, or DEPTH).
KnotList is a list of knots at which to refine TV. All knots should be
contained in the parametric domain of TV in Direction. If the knot
vector is replaced, the length of KnotList should be identical to the
length of the original knot vector of TV in the Direction. If TV
is a Bezier trivariate, it is automatically promoted to be a B-spline
trivariate.
extracts a region of TV between MinParam and MaxParam
in the specified Direction. Both MinParam and MaxParam
should be contained in the parametric domain of TV in the Direction.
extracts three regions of Tv1 along the ROW direction.
FIGURE:
A region can be extracted from a freeform trivariate using TREGION.
See also CREGION, SREGION, and MREGION.
reparametrizes TV over a new domain from MinParam to MaxParam,
in the prescribed Direction. This operation does not affect the geometry
of the trivariate and only affine transforms its knot vectors. A Bezier
trivariate will automatically be promoted into a B-spline surface by this
function.
converts Model into a new model with exactly the same shape that holds
only triangles. If the Regular is not zero, the object is regularized as
well.
Example:
create a trimmed surface from the provided surface Srf and the
trimming curve TrimCrv or curves TrimCrvs. If HasUpperLevel
is FALSE, an additional trimming curve is automatically added that
contains the entire parametric domain of Srf. No validity test is
performed on the trimming curves which are assumed to be two-dimensional
curves contained in the parametric domain of Srf.
constructs three trimmed surfaces. Tsrf1 contains the outer boundary
and excludes what is inside TCrv1, TSrf2 contains only the
domain inside TCrv1. TCrv3 has three holes corresponding to the
three trimming curves. See also TRMSRFS.
FIGURE:
Three trimmed surfaces created from the same B-spline surface.
The original surface is outline by thin lines and the trimmed
surfaces are outlined by thick lines.
create a set of trimmed surfaces from the provided surface Srf and
the set of contours Cntrs in Srf's parametric domain.
The contours in Cntrs can be polylines, curves, or a list of
such entities. The contours in Cntrs must be either closed or start
and end on the boundary of the parametric domain of Srf. Further,
these contours must be (self) intersection free.
The returned result is a (list of) trimmed surfaces, each defining one
sub-region that results from Cntrs's trimming.
constructs trimmed surfaces using two contours. One contour is a polyline
with two points, and the other is a quadratic Bezier curve. See also TRIMSRF.
FIGURE:
Three trimmed surfaces created from the same B-spline surface using
the TRMSRFS and two prescribed contour in the surface's parametric
domain.
creates a triangular Bezier surface of order Order using the
provided control mesh. CtlMesh is a list of control points of
size (Order + 1) * Order / 2. All control points
must be of type (E1-E9, P1-P9), or regular PointType defining the surface's
control polygon. The surface point type will be of a space which is the union
of the spaces of all points.
creates a B-spline surface from the provided Order and Length,
the control mesh CtlMesh, and the knot vector KnotVector.
CtlMesh is a list of control points of size (Length + 1) *
Length / 2. All control points must be of point type (E1-E9,
P1-P9), or regular PointType defining the surface's control mesh.
The surface point type will be of a space which is the union of the spaces
of all points.
KnotVector is a list of NumericType knots of length Length
plus the Order.
The knot vector may also be a list of a single constant KV_OPEN or
KV_FLOAT, in which a uniform knot vector with the appropriate length
and with an open or floating end condition will be constructed automatically.
Not fully supported at this time. See also TSBEZIER and TSGREGORY.
TriSrfType TSDERIVE( TriSrfType Srf, NumericType Dir )
returns a vector field surface representing the differentiated triangular
surface in the given direction (ROW, COL, or DEPTH). Evaluation of
the returned surface at a given parameter value will return a vector
tangent to Srf in Dir at that parameter value.
evaluates the provided triangular surface Srf at the given
UParam, VParam, WParam parameters.
UParam, VParam, and WParam must all be non negative
and must sum to one for a Bezier triangular surface or to the maximum
domain, if a B-spline surface.
Example:
CPt = TSEVAL( Srf, u, v, 1.0 - u - v );
evaluates Srf at the parameter values prescribed by u and v.
cCreates a triangular Gregory surface of order Order using the
provided control mesh. CtlMesh is a list of control points of
size (Order + 1) * Order / 2 + 3. All control points
must be of type (E1-E9, P1-P9), or regular PointType defining the surface's
control polygon. The surface point type will be of a space which is the union
of the spaces of all points.
computes the normal vector to a triangular surface Srf at the
parameter values UParam, VParam, WParam. The returned
vector has a unit length.
UParam, VParam, and WParam must all be non
negative and must sum to one for a Bezier triangular surface or to
the maximum domain, if a B-spline surface.
Example:
Normal = TSNORMAL( Srf, 0.5, 0.5, 0.0 );
computes the normal to Srf at the parameter values (0.5, 0.5, 0.0).
loads a volumetric data set from file FileName in as a
trivariate of orders Orders. DataType can be one of:
1
Regular ASCII (separated by white spaces).
2
Two bytes short integer.
3
Four bytes long integer.
4
One byte (char) integer.
5
Four bytes float.
6
Eight bytes double.
Beware of the little vs big Endian problem! We assume here you have read the
volume in the same machine type in which this file was written.
VolSize provides the dimensions of the volume, with width first and
depth last. Uniform open end condition knot vectors are constructed to all
three axes.
computes trivariate of revolution for the given polynomial surface(s) by
rotating the input along the Z axis. Result is a polynomial
approximation for the real circular shape.
Example:
Tv = TVRev( Disk );
Createa a trivariate torus, TV by rotating the input Disk surface
along the Z axis. See also SURFPREV, TVREV.
computes the zero set of the Jacobian of the given trivariate, TV.
This zero set is the implicit boundary of the trivariate and, for example,
equals the envelop of the sweep of a bivariate surface in space (see
example below). The zero set is returned as a polygonal data set
approximation with Fineness tolerance. If Euclidean, the
resulting polygons are in Euclidean space. Otherwise, the polygons are
returned in the trivariate's parametric domain. Finally, SkipRate
provides a mechanism to skip to every SkipRate row, column and plane
while a SkipRate skips nothing.
A trivariate TV is constructed as a sweep of surface Srf
along a quadratic Bezier curve with (0, 0), (3, 3), (6, 0) as control points,
and then the zero set of the Jacobian is derived to yield the envelope of
this motion of Srf.
FIGURE:
The envelope of the motion of the wine glass surface in space can
be derived with the aid of the TvZrJacob function.
Sets UV coordinates to polygonal object Obj. The UV coordinates
are set using the XY Euclidean coordinates if Scales is a list that
holds two scaling factors (XScale, YScale), or the UV coordinates are
set via the two largest span in XYZ for each polygon, if Scales is
a list of three scaling factors (XScale, YScale, ZScale).
Translates offers a way to shift the UV coordinates in the texture
2D domain, Translates of (0, 0) does nothing.
Needless to say, the ?Scale factors scales the Euclidean coordinates before
being sets as UV texture coordinates.
Given two objects, Obj1 and Obj2, where Obj1 is assumed to
be above (in the Z direction) Obj2, this function computes the amount
that Obj1 could be moved down, the -Z direction, until it collides with
Obj2. The collision detection is considered using a polygonal
approximation that has a Fineness resolution (see RESOLUTION variable).
The computation cost is linear in NumOfIters with quadratic accuracy
convergence. Values of ten for both Fineness and NumOfIters are
reasonable selections. While Obj1 is considered in its exact form, in
Obj2, only the bbox of the shape is considered.
Example:
view( chair, 1 );
for ( x = 0, 1, 5,
b = box( vector( x / 10, 0, 2 ), 0.1, 0.1, 0.1 ):
view( b * tz( ZCOLLIDE( chair, b, 10, 10 ) ), 0 ) );
places and draws six different cubes on top of the object called chair.
All the routines in this section construct a 4 by 4 homogeneous
transformation matrix representing the required transform. These matrices
may be concatenated to achieve more complex transforms using the matrix
multiplication operator *. For example, the expression
constructs a projection matrix to project the universe onto the given
projection plane ProjPlane, with the eye position at EyePos
(divided by EyeInf). Note that if EyeInf is zero, the eye is
at infinity.
creates a rotation matrix that takes the Z axis into Dir, while the X
axis is aligned with Dir2. The lengths of Dir and Dir2 are
ignored.
See also ROTV2V, ROTVEC, ROTZ2V, ROTVEC.
sets the width of the object. This display width is used in pixels in
display devices for width of line drawing, if supported by the display device.
See also ATTRIB, COLOR, and AWIDTH.
ATTRIB( AnyType Object, StringType Name, AnyType Value )
provides a mechanism to add an attribute of any type to an Object,
with name Name and value Value. This ATTRIB function is tuned
and optimized toward numeric values or strings as Value although any
other object type can be saved as attribute.
These attributes may be used to pass information to other programs about
this object, and are saved with the objects in data files.
Attributes placed on a list object or even a whole hierarchy of
objects will be propagated into all items in the list or hierarchy.
There are a few exception to this propagation. The "animation" attribute
is not propagated and is kept in the internal nodes, forming a hierachy of
animation commands for all the objects contained in the list/hierarchy.
The "invisible" attribute is saved at all levels of the hierarchy, used to
denote a complete sub tree that is invisible (yet can serve as a source at
which instances can point).
sets the RGB color and refraction index of the Glass object and
later removes the RGB attribute.
Attribute names are case insensitive. Spaces are allowed in the Value
string, as well as the double quote itself, although the latter must be
escaped:
ATTRIB(Glass, "text", "Say "this is me"");
See also RMATTR for removal of attributes, CPATTR for copying them,
GETATTR to get an attribute, ATTRPROP for setting attributes on all
subtrees of parts, as well as AWIDTH, ADWIDTH, COLOR and PATTRIB.
In Glass1, only Glass1 will be set with "texture" while in
Glass2, the "texture" attribute will propagate to the sub-parts of
Glass2, namely to the Base, Handle, Wine.
sets the width of the object to one of those specified below. This width
is used in real object side dimensions in tools such as scan converters and
rendering tools for rendering lines and curves, as well as postscript.
See also ATTRIB, COLOR, and ADWIDTH.
closes a communication channel to a client. Handler contains the
index of the communication channel opened via CLNTEXEC. If Kill, the
client is sent an exit request for it to die. Otherwise, the communication
is closed and the client runs standing alone. See also VIEWOBJ, VIEWSET,
CLNTREAD, CLNTWRITE, and CLNTEXEC.
writes one object Object to a communication channel of a client.
Handler contains the index of the communication channel opened via
CLNTEXEC. If the Handler equals -1, the regular display device
(forked via, for example, VIEWOBJ command) is used. If Handler equals
CLIENTS_ALL, a broadcast of Object to all clients is performed.
See also VIEWOBJ, VIEWSET, CLNTREAD, CLNTCLOSE, and CLNTEXEC.
sets the color of the object to one of those specified below. Note that an
object has a default color (see irit.cfg file) according to its origin -
loaded with the LOAD command, PRIMITIVE, or a BOOLEAN operation result.
The system internally supports colors (although you may have a B&W
system) and the colors recognized are:
BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, and WHITE.
See the ATTRIB command for more fine control of colors using the RGB
attribute. See also AWIDTH and AWIDTH.
1. One-line comment: starts anywhere in a line at the '#' character, up to
the end of the line.
2. Block comment: starts at the COMMENT keyword followed by a unique
character (anything but white space), up to the second occurrence of that
character. This is a fast way to comment out large blocks.
copies all attribute from object SrcObj into object DestObj. All
attributes, if any, in DestObj are purged. Needless to say, both objects
must exist at the time of attribute copy.
breaks the execution and returns to the IRIT main loop, after printing a
Message to the screen. This may be useful in user defined functions to
break execution in cases of fatal errors.
defines a function that converts univariate expressions into explicit, E1,
Bezier curves. For example
"Univariate2Bezier( "3 * x ^ 2 - 2 * x + 5", 3 );"
would return a cubic Bezier curve representing "3 * x ^ 2 - 2 * x + 5".
FOR( NumericType Start, NumericType Increment, NumericType End, AnyType Body )
executes the Body (see below), while the FOR loop conditions hold.
Start, Increment, End are evaluated first, and the loop is executed
while <= End if Increment > 0, or while >= End if Increment < 0.
If Start is of the form "Variable = Expression", then that variable is
updated on each iteration, and can be used within the body.
The body may consist of any number of regular commands, separated by
COLONs, including nesting FOR loops to an arbitrary level.
Example:
step = 10;
rotstepx = rotx(step);
FOR ( a = 1, 1, 360 / step,
view_mat = rotstepx * view_mat:
view( list( view_mat, axes ), ON )
);
displays axes with a view direction that is rotated 10 degrees at a
time around the X axis.
Because of the usually huge size of geometric objects, this procedure
may be used to free them. Reassigning a value (even of different type)
to a variable automatically releases the old variable's allocated space
as well. See also FNFREE.
defines a function named FuncName with N parameters and M local variables
(N, M >= 0). Here is a (simple) example of a function with no local variables
and a single parameter that computes the square of a number:
sqr = FUNCTION(x):
return = x * x;
Functions can be defined with optional parameters and optional local
variables. A function's body may contain an arbitrary set of expressions
including for/while loops, (user) function calls, or even recursive function
calls, all separated by colons.
The returned value of the function is the value of an automatically defined
local variable named return. The return variable is a regular local variable
within the scope of the function and can be used as any other variable.
If a variable's name is found in neither the local variable list nor
the parameter list, it is searched for in the global variable list (outside
the scope of the function). Binding of names of variables is static as in the
C programming language.
Because binding of variables is performed in execution time, there is a
somewhat less restrictive type checking of parameters of functions that are
invoked within a user's defined function.
A function can invoke itself, i.e., it can be recursive. However, since a
function should be defined when it is called, a dummy function should be
defined before the recursive one is defined:
executes TrueBody (a group of regular commands, separated by COLONs -
see FOR loop) if the Cond holds, i.e., it is a numeric value other than
zero, or optionally, if it exists, executes FalseBody. If the Cond
does not hold, i.e., it evaluates to a numeric value equal to zero.
Examples:
IF ( machine == IBMOS2, resolution = 5, resolution = 10 );
IF ( a > b, max = a, max = b );
sets the resolution to 10, unless running on an IBMOS2 system, in which
case the RESOLUTION variable will be set to 5 in the first statement, and
set to max to the maximum of a and b in the second statement.
executes the script file FileName. Nesting of an include file is allowed
up to 10 levels deep. If an error occurs, all open files in all nested files
are closed and data are waited for at the top level (standard input). Files
are searched for inclusion in the current directory. If not found, and the
inclusion is from a different file at some directory, that directory is
searched as well. Finally, if all the above fails, the directories specified
via the IRIT_INCLUDE environment variable are also searched.
A script file can contain any command the solid modeler supports.
Example:
INCLUDE( "/tmp/general.irt" );
includes the file "/tmp/general.irt". Any inclusion inside general.irt will
search for the included file in the current directory, then in /tmp, and then
in the directories specified via IRIT_INCLUDE.
A low level query tool for checking the current state of the IRIT internal
tables. According to the values of QueryType the following is printed
to stdout:
QueryType
Printed content
1
All the known functions/user defined functions/constants
constructs an object as a list of several other objects. Only a reference
is made to the Elements, so modifying Elem1 after being included in the list
will affect Elem1 in that list next time list is used!
Each inclusion of an object in a list increases its internal used
reference. The object is freed iff theused reference is zero.
As a result, attempt to delete a variable (using FREE) which is referenced
in a list removes the variable, but the object itself is freed only when the
list is freed.
loads an object from the given FileName. The object may be any object
defined in the system, including lists, in which the structure is recovered
and reconstructed as well (internal objects are inserted into the global
system object list if they have names). If no file type is provided, ".itd"
is assumed.
This command can also be used to load binary files. ASCII regular data
files usually take longer to load than binary files due to
the required parsing. Binary data files can be loaded directly, like ASCII
files in IRIT, but can only be inspected through IRIT tools such
as dat2irit. A binary data file must have a ".ibd" (IRIT Binary Data) type in
its name.
Compressed files can be loaded if the given file name has a postfix
of ".Z" or .".gz". The gnu utility "gzip" will be invoked via a pipe
for that purpose.
See also IRITSTATE's option "FlatLoad" for optioanl flattening of the object
hierarechy during a load.
LOGFILE( NumericType Set )
or
LOGFILE( StringType FileName )
If Set is non zero (see TRUE/FALSE and ON/OFF), then everything
printed in the input window will go to the log file specified in the
irit.cfg configuration file. This file will be created the first time
logfile is turned ON. If a string FileName is provided, it will
be used as a log file name from now on. It also closes the current log
file. A "LOGFILE( on );" must be issued after a log file name change.
Example:
LOGFILE( "Data1" );
LOGFILE( on );
printf( "Resolution = %lf\n", list( resolution ) );
LOGFILE( off );
to print the current resolution level into file Data1.
AnyType NREF( ListType ListObject, NumericType Index )
returns a reference to the Index (base count 1) element of the
list ListObject. The reference points to the original object and
hence can be used to modify (add attributes for example) to objects in
lists. Assignment of this reference to a new object would result in a copy
of the object. In contrast, a FREE of a reference to an object would have
an undefined result.
Example:
Lst = list( a, b, c );
attrib( NREF( Lst, 2 ), "NewAttr", on );
adds a new attribute to the second element of Lst. See also NTH.
computes a cone that bounds all normals of surface Srf. A
list of two objects, the axis vector of the cone and the opening radius,
in radians, is returned.
waits for a keystroke. This is nice to have if a temporary stop in a middle
of an included file (see INCLUDE) is required. If Flush is TRUE, then
the input is first flushed to guarantee that the actual stop will occur.
This results in a formatted printing routine, following the concepts of the C
programming language's printf routine. CtrlStr is a string object
for which the following special '%' commands are supported:
%d, %i, %u
Prints the numeric object as an integer or unsigned integer.
%o, %x, %X
Prints the numeric object as an octal or hexadecimal integer.
%e, %f, %g,
Prints the numeric object in several formats of
%E, %F
floating point numbers.
%s
Prints the string object as a string.
%pe, %pf, %pg
Prints the three coordinates of the point object.
%ve, %vf, %vg
Prints the three coordinates of the vector object.
%Pe, %Pf, %Pg,
Prints the four coordinates of the plane object.
%De, %Df, %Dg,
Prints the given object in IRIT's data file format.
All the '%' commands can include any modifier that is valid in the C
programming language PRINTF routine, including l (long), prefix
character(s), size, etc. The point, vector, plane, and object commands
can also be modified in a similar way, to set the format of the
numeric data printed.
Also supported are the newline and tab using the backslash escape
character:
PRINTF("\tThis is the char "\%"\n", nil());
Backslashes should be escaped themselves as can be seen in the above example.
Here are few more examples:
PRINTF("this is a string "%s" and this is an integer %8d.\n",
list("STRING", 1987));
PRINTF("this is a vector [%8.5lvf]\n", list(vector(1,2,3)));
IritState("DumpLevel", 9);
PRINTF("this is a object %8.6lDf...\n", list(axes));
PRINTF("this is a object %10.8lDg...\n", list(axes));
This implementation of PRINTF is somewhat different than the C programming
language's version, because the backslash always escapes the next
character during the processing stage of IRIT's parser. That is, the string
'\tThis is the char "\%"\n'
is actually parsed by the IRIT's parser into
'tThis is the char "%"n'
because this is the way the IRIT parser processes strings. The latter
string is the one that PRINTF actually sees.
See also PRINTFILE for ways to redirect PRINTF to a file..
Sets the file PRINTF prints to to FileName. Any newer call to
PRINTFILE will close the current file used so far. If FileName is
an empty string, PRINTF will print to stdout.
A procedure is a function that does not return a value, and therefore the
returned variable (see FUNCTION) should not be used. A procedure is
identical to a function in every other way. See FUNCTION for more.
saves the provided Object in the specified file name FileName.
No extension type is needed (ignored if specified), and ".itd" is supplied
by default. The Object can be any object type, including list, in which
the structure is saved recursively. See also LOAD. If a display device is
actively running at the time SAVE is invoked, its transformation matrix
will be saved with the same name but with extension type of ".imd" instead
of ".itd".
This command can also be used to save binary files. ASCII regular data
files usually take longer to load than binary files due to
the required parsing. Binary data files can be loaded directly like ASCII
files in IRIT, but must be inspected through IRIT tools such
as dat2irit. A binary data file must have a ".ibd" (IRIT Binary Data) type in
its name.
This command can also save geometry in one of the following formats:
IGES file, If the file type is either "igs" or "iges".
STL file, if the file type is "stl". If Object has the int
attribute "RegularTriang" as TRUE, the geometry will be regularized
first (no T junctions). If Object has the int attribute
"MultiObjSplit", the data will be saved in one large STL object in
one file if 0, one STL object per IRIT object in one file if 1, or
in one file per IRIT obejct if 2.
VRML file. if the file type is "wrl".
CNC Gcode tool path file, if the file type is either "nc" or
"gcode". For this format, only univariate data sets (polylines and
curves) will be processed and saved as 3-axis G code commands.
The following attributes are supported in this mode, if found in
Object:
"NCCommentChar"
Holds a string of one character to define the
comment character. If exists a header comment is
dumped as well.
"NCDownPlungeFast"
distance, above the plunging destination to move down
in fast g0 motion. Infinity to disable and plunge in
g1 all the way, or zero to plunge fast in g0 all way.
"NCFeedRate"
Feedrate to use. Default is 10 mm per second.
"NCBridgeRelFeedRate"
Relative feedrate to use (relative to NCFeedRate)
when bridging from one polyline/curve to the next.
"NCMaxXYBridgeGap"
The maximal gap in the XY plane to bridge between
adjacent polylines/curves without retraction.
By default, this value is one mm (0.04inch).
"NCMaxZBridgeGap"
The maximal gap in Z to bridge between adjacent
polylines/curves without retraction. By default,
this value is two mm (0.08inch).
"NCRetractZLevel"
Set as the Z retraction level above the (bounding
box) of the model. By default, the retration level
will be one inch 925mm) above the bounding box of
the model.
"NCReverseZ"
If set to a non negative value, the Z coordinates
are assumed reversed. That is the +Z is down.
By default +Z is assumed up.
"NCUpRetractFast"
If TRUE, up retracting will be in fast g0 motion.
Otherwise, if FALSE, g1 will be used.
On some platforms, files will be saved compressed if the given file name
has a postfix of ".Z" or ".gz". The gnu "gzip" utility will be invoked via
a pipe for that purpose.
Example:
SAVE( "Obj1.ibd.Z", Obj1 );
Saves Obj1 in the file Obj1.ibd.Z as compressed binary file.
sets the name of a sub object of index Index in list object
ListObj to a new name NewName. The index of the first element is
zero.
Example:
A = list( 1, 2, 3 );
SETNAME( A, 0, "First" );
sets the name of the first element in object A to "First".
While it is not a good idea to modify names of objects in the top level
global space, one can use this function to do exactly that. To rename
the object "Axes" to "XYZ", do:
returns the time in seconds from the last time TIME was called with
Reset TRUE. This time is CPU time if such support is available
from the system (times function), and otherwise, is real time (time
function).
The time is automatically reset at the beginning of the execution of this
program.
Example:
Dummy = TIME( TRUE );
.
.
.
TIME( FALSE );
prints the time in seconds between the above two time function calls.
displays the (geometric) object(s) as given in Object.
If ClearWindow is non zero (see TRUE/FALSE and ON/OFF), the window is
first cleared (before drawing the objects).
Example:
VIEW( Axes, FALSE );
displays the predefined object Axes in the viewing window on top of
what is drawn already.
In version 4.0, this function is emulated (see iritinit.irt) using the
VIEWOBJ function. In order to use the current viewing matrix, VIEW_MAT
should be provided as an additional parameter. For example,
VIEW( list( view_mat, Obj ), TRUE );
However, since VIEW is a user defined function, the following will not
use VIEW_MAT as one would expect:
VIEW( view_mat, TRUE );
because VIEW_MAT will be renamed inside the VIEW user defined function to
a local (to the user defined function) variable.
In iritinit.irt one can find several other useful VIEW related functions:
VIEWCLEAR
Clears all data displayed on the display device.
VIEWREMOVE
Removes the object specified by name from display.
VIEWDISC
Disconnects from display device (which is still running)
while allowing IRIT to connect to a new device.
VIEWEXIT
Forces the display device to exit.
VIEWSAVE
Requests the display device to save transformation matrix.
BEEP
An emulation of the BEEP command of versions prior to 4.0.
VIEWSTATE
Allows change to the state of the display device.
For the above VIEW related functions, only VIEWREMOVE, VIEWSAVE, and
VIEWSTATE require parameters, which are the file name and view state,
respectively. The view state can be one of several commands. See the
display device section for more.
displays the (geometric) object(s) as given in Object.
Object may be any GeometricType or a list of other
GeometricTypes nested to an arbitrary level.
Unlike IRIT versions prior to 4.0, VIEW_MAT is not explicitly used
as the transformation matrix. In order to display with a VIEW_MAT view,
VIEW_MAT should be listed as an argument (in that exact name) to
VIEWOBJ. The same is true for the perspective matrix PRSP_MAT.
Example:
VIEWOBJ( list( view_mat, Axes ) );
displays the predefined object Axes in the viewing window using the
viewing matrix VIEW_MAT.
sets the current display device to be DispHandle. DispHandle is
returned by the CLNTEXEC command. The use of the reserved constant of
CLIENTS_ALL would broadcast the viewing commands to all objects.
opens two display devices, and displays a unit sphere to the first, and the
axes object, to the second. After a pause, displays both objects on both
display devices, then pauses and exits from both.
See also VIEWOBJ, CLNTEXEC, CLNTCLOSE, CLNTREAD, CLNTWRITE.
System variables are predefined objects in the system. Any time IRIT is
executed, these variable are automatically defined and set to values which
are sometimes machine dependent. These are regular objects in any other
sense, including the ability to be deleted or overwritten. One can modify,
delete, or introduce other objects using the iritinit.irt file.
Predefined Boolean variable (NumericType) that controls whether curves'
control polygons and surfaces' control meshes are drawn (TRUE) or not
(FALSE). Default is FALSE.
Predefined Boolean object (NumericType) that controls the way almost flat
surface patches are converted to polygons: four polygons (TRUE) or only
two polygons (FALSE). Default value is FALSE.
Predefined numeric object (NumericType) holding the machine type as one of
the following constants: MSDOS, SGI, HP, APOLLO, SUN, UNIX, IBMOS2, WINDOWS,
AMIGA, CYGWIN, MACOSX, and LINUX.
A variable controlling the algorithm to tesselate surfaces into polygons.
If FALSE, that is, uniform, in parametric space, sampling is used. If TRUE,
maximal deviation between the polygonal approximation and the surface is
used, with distance as prescribed by POLY_APPROX_TOL.
Predefined numeric object (NumericType) that sets the accuracy of the
polygonal primitive geometric objects and the approximation of curves and
surfaces. It holds the number of divisions into which a circle is divided
(with minimum value of 4). If, for example, RESOLUTION is set to 6, then a
generated CONE will effectively be a six-sided pyramid.
It also controls the fineness of freeform curves and surfaces when they are
approximated as piecewise linear polylines, and the fineness of freeform
surfaces when they are approximated as polygons.
The following constants are used by the various functions of the system to
signal certain conditions. Internally, they are represented numerically,
although, in general, their exact value is unimportant and may be changed
in future versions. In the rare circumstance that you need to know their
values, simply type the constant as an expression.
A constant defining an open end condition with a discontinuous uniformly
spaced knot vector. That is, all interior knots are of multiplicity order -1
and are equally spaced.
The animation tool adds the capability of animating objects using
forward kinematics, exploiting animation curves. Each object has
different attributes, that prescribe its motion, scale, and visibility
as a function of time. Every attribute has a name, which designates
its role. For instance, an attribute animation curve named MOV_X
describes a translation motion along the X axis.
Let OBJ be an object in IRIT which we want to animate.
Animation curves are either scalar (E1/P1) curves or three-dimensional
(E3/P3) curves with one of the following name prefixes:
MOV_X, MOV_Y, MOV_Z
Translation along one axis
MOV_XYZ
Arbitrary translation along all three axes
ROT_X, ROT_Y, ROT_Z
Rotating around a single axis (degrees)
SCL_X, SCL_Y, SCL_Z
Scale along a single axis
SCL
Global scale
VISIBLE
Visibility
The visibility curve is a scalar curve that enables the display of
the object if the visibility curve is positive at time t and disables
the display (hides) the object if the visibility curve is negative at
time t. A positive visibility value between zero and one also hints at
the opacity of the object, if supported; one means fully opaque.
The animation curves are all attached as an attribute named "animation"
to the object OBJ.
The above will animate OBJ between time zero and one (Bezier curves are always
between zero and one), by moving it a unit size in the X direction,
scaling it to %10 of its original size and rotating it at increasing
angular speed from zero to 360 degrees.
OBJ can now be saved into a file or displayed via one of the regular
viewing commands in IRIT (i.e. VIEWOBJ).
Animation is not always between zero and one. To that end, one can
apply the CREPARAM function to modify the parametric domain of the
animation curve. The convention is that if the time is below the
starting value of the parametric domain, the starting value of the
curve is used. Similarly, if the time is beyond the end of the
parameter domain of the animation curve, the end value of the
animation curve is used.
Example:
CREPARAM( mov_x, 3.0, 5.0 );
to set the time of the motion in the x axis to be from t = 3 to
t = 5. For t < 3, use mov_x(3), and for t > 5, use mov_x(5).
The animation curves are regular objects in the IRIT system. Hence,
only one object named mov_x or scl can exist at one time. If you
create a new object named mov_x, the old one is overwritten! To
preserve old animation curves you can detach the old ones by executing
'free(mov_x)' which will remove the object named mov_x from IRIT's object
list but not from its previously used locations within other list
objects, if any. A different way to do this is to call the animation curves
mov_x1, mov_x2 etc. as only the prefix of the name is verified.
Notice the way we have two animation curves translating obj2 in x.
This is somewhat artificial but makes more sense if other
transformations appear in between.
One can evaluate an object with animation curves at a certain time, only
to find the proper expected transformation matrix at that time on the
object as an "animation_mat" attribute. The following example defines
a user defined TransformAnim function that creates a transformed
object out of object that was evaluated with ANIMEVAL. Then, a simple loop
(slowly) animates the scene...
TransformAnim = function( Obj ):
return = 0;
TransformAnim = function( Obj ): m: i:
if ( thisobj( "Obj" ) == list_type,
return = nil():
for ( i = 1, 1, sizeof( Obj ),
snoc( TransformAnim( nth( Obj, i ) ), return ) ),
return = Obj * tx( 0 ) ):
m = getattr( Obj, "animation_mat" ):
if ( thisobj( "m" ) == matrix_type,
return = return * m );
for ( t = 0, 0.1, 1,
ANIMEVAL( t, Object ):
view( TransformAnim( Object ), 1 ) );
In this example, we create four objects, three cubes and one sphere.
Animation curves to translate the three cubes along the three axes for
time period of t = 0 to t = 1.2 are created. Rotation curves to
rotate the three cubes along the three axes are then created for time
period t = 1.2 to t = 2.5. Finally, for time period t = 2.5
to t = 4.0. the cubes are (not only) unifomly scaled. For time
period t = 4 to t = 5, the cubes become invisible and the sphere,
which becomes visible, is rotated along a circle of radius 2.
This example demonstrates the ability to put "animation" attributes
on internal nodes of a hierarchy, thereb, affecting the entire set of objects
in the hierachy. Herein, we present an robotic arm with three edges
and two joints.
In this example, we create four objects, three cubes and one cone,
simulating a robotic hand with three edges an a gripper (the cone).
The animation is defined hierarchically, making it very easy to model
the robot.
The following display device drivers are available,
Device Name
Invocation
Environment
xgldrvs
xgldrvs -s-
SGI 4D GL regular driver.
xogldrvs
xogldrvs -s-
SGI 4D Open GL/Motif driver.
xgladap
xgladap -s-
SGI 4D GL adaptive isocurve
experimental driver.
x11drvs
x11drvs -s-
X11 driver.
xmtdrvs
xmtdrvs -s-
X11 Motif driver.
xglmdrvs
xglmdrvs -s-
SGI 4D GL and X11/Motif driver.
wntdrvs
wntdrvs -s-
IBM PC Windows NT driver.
wntgdrvs
wntgdrvs -s-
IBM PC Windows NT Open GL driver.
wntgaiso
wntgaiso -s-
IBM PC OGL Adap. Iso. driver.
os2drvs
os2drvs -s-
IBM PC OS2 2.x/3.x driver.
amidrvs
amidrvs -s-
AmigaDOS 2.04+ driver.
nuldrvs
nuldrvs -s- [-d] [-D]
A device to print the
object stream to stdout.
All display devices are clients communicating with the (IRIT) server
using IPC (inter process communication). On Unix and Windows NT, sockets are
used. A Windows NT client can talk to a server (IRIT) on a Unix host if
hooked to the same network. On OS2 pipes are used, and both the client and
server must run on the same machine. On AmigaDOS exec messages are used,
and both the client and server must run on the same machine.
While all display devices support object(s) transformations via a
transformation control window, many of the display devices allow one
to click and drag on the viewing window to rotate (Left Button) and
to translate (Right Button). This mode exploits the mouse's two degrees of
freedom to provide intuitive dual axis rotation and
translation. Most display devices supports two levels of fineness.
A rough display is used when in the middle of a transformation operation
(i.e. the mouse button is down/dragged), while a fine object display is
employed when the display is idle (mouse button is up). See also option
'-E'.
The (IRIT) server will automatically start a client display device
if the IRIT_DISPLAY environment variable is set to the name and options of
the display device to run. For example:
setenv IRIT_DISPLAY xgldrvs -s-
The display device must be in a directory that is in the
environment variable path. Most display devices require the '-s-' flags
to run in a non-standalone mode, or a client-server mode. Most drivers can
also be used to display data in a standalone mode (i.e., no server). For
example:
xgldrvs -s solid1.itd irit.imd
Effectively, all the display devices are also data display programs.
Therefore, some functionality is not always as expected. For
example, the Quit button will always force the display device to quit,
even if popped up from IRIT, but will not cause IRIT to
quit as might logically expected. In fact, the next time IRIT will
try to communicate with the display device, it will find the broken
connection and will start up a new display device.
Most display devices recognize attributes found on objects. The following
attributes are usually recognized (depending on the device capability):
Color: Selects the drawn color of the object to be one of the 8/16
predefined colors in the IRIT system: white, red, green, blue,
yellow, cyan, magenta, black.
DWidth: Sets the width in pixels of the drawn object, when drawn as
a wireframe.
Light_source: Mark a points object as a light source. Such a marked
object is not rendered but rather used to set a light source position.
A light source object also honors "index" attribute that sets the
light source number (between 0 and 9), and "type" which can be either
"point_infty" for a light source direction (light source at infinity)
or "point_pos" for a point light source. See also "advanced usage"
in the irender program.
ReflectLns: Allows the display of reflection lines off a freeform
surface. The "ReflectLns" attribute is a list object of two
subobjects, a vector and a list of points. The vector is the
reflection lines' direction (all reflection lines are parallel)
and the list of points is a list of points on the different
reflection lines. For example,
defines five reflection lines to be reflected off surface S,
all in the direction of (0, 0, 1) and on the plane Y = 2.
See also RFLCTLN command.
RGB: Overwrites (if supported) the COLOR attribute (if given) and
sets the color of the object to the exact prescribed RGB set.
StrScale, StrPos, StrSpace: Allows control over string
drawing, controlling the scale of the string, its position, and the spacing
between characters in the string.
All display devices recognize all the command line flags and all the
configuration options in a configuration file, as described below. The display
devices will attempt to honor the requests, to the best of their ability.
For example, only gl and OpenGL devices can render shaded models, and so
only they will honor all DrawStyle configuration options.
-s: Runs the driver in a standalone mode. Otherwise, the driver will
attempt to communicate with the IRIT server.
-u: Forces a unit matrix. That is, input data are not
transformed at all.
-n: Draws normals of vertices.
-N: Draws normals of polygons.
-i: Draws internal edges (created by IRIT) - default is not to
display them; this option will also force their display.
-c: Sets depth cueing on. Drawings that are closer to the viewer will
be drawn in more intense color.
-C: Caches the piecewise linear geometry so curves and surface can
be redisplayed faster. Purging it will free memory, on the other hand.
-m: Provides some more information on the parsed data file(s).
-a: Activate antialiased lines and shaded display.
-g x1,x2,y1,y2: Prescribes the position and location of the
transformation window by prescribing the domain of the window in
screen space pixels.
-G x1,x2,y1,y2: Prescribes the position and location of the
viewing window by prescribing the domain of the window in
screen space pixels.
-I #IsoLines: Specifies the number of isolines per surface, per
direction.
A specification of zero isolines is possible only on the command line
and it denotes the obvious.
-F PolyOpti FineNess: Controls the method used to approximate surfaces
into polygons. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-R: Use optimized polygonal strips instead of lists of polygons, if
possible. This feasibility depends on the support of the underlying
hardware/graphics libraries.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed dveiation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-E RelLowRes: Sets the relative fineness of curves and surface
while the input device is active, such as in a drag operation.
-p: Sets the width of drawn points.
-l LineWidth: Sets the linewidth, in pixels. Default is one pixel wide.
-r: Activate solid Rendering mode. Draws object as shaded solid.
-A Shader: Shader can be one of 0 (None), 1 (Background), 2 (Flat),
3 (Gouraud), or 4 (Phong).
-B: Back face culling of polygons.
-2: Double buffering. Prevents screen flicker at the possible cost of
fewer colors.
-d: Debug objects. Prints to stderr all objects read from the
communication port with the server IRIT.
-D: Debug input. Prints to stderr all characters read from communcation
port with the server IRIT. Lowest level of communication.
-L NormalLen: Sets the length of the drawn normals in thousandths of
a unit.
-4: Forces four polygons per almost flat region in the surface to
polygon conversion. Otherwise two polygons only.
-k SketchType Sil Shd Imp: Sets the strokes type (one of 1
(isoparametric curves), 2 (lines of curvature), 3 (silhoutees)),
and the silhouette and shader powers (between zero and one) and
strokes improtance factor, in interactive line art strokes (See -W).
-K: Captures the image underneath the display device and use that as
a bacKground image.
-b BackGround: Sets the background color as three RGB integers in the
range of 0 to 255.
-S x,y,z,w{,a,d,s} (LgtSrcPosADS): Sets the lighting by setting the
light source position as well as the optional Ambient, Diffuse, and
Specular intensities.
-1: One or two sides for light sources.
-e PickDist: Sets the distance to the near and far Z clipping planes.
-O PickObjType: A binary mask that controls which object can be
picked:
bit 0 - not used, bit 1 - poly, bit 2 - numeric,
bit 3 - point, bit 4 - vector, bit 5 - Plane, bit 6 - matrix,
bit 7 - curve, bit 8 - surface, bit 9 - string, bit 10 - list object,
bit 11 - ctl pt, bit 12 - trimmed srf, bit 13 - trivariate,
bit 14 - instance, bit 15 - triangular srf, bit 16 - model,
bit 17 - multivariate.
-Z ZMin ZMax: Sets the near and far Z clipping planes.
-M: Draw control mesh/polygon of curves and surfaces, as well.
-W WireSetup: Controls the line drawing of the freeforms where
WireSetup is a mask that controls:
bit 0: Draw curves and surfaces using a set of isocurves (see -I and
-f),
bit 1: Draw boundary curves of surfaces,
bit 2: Draw silhouette curves of surfaces,
bit 3: Draw surfaces in sketch style line art (see -k).
bit 4: Draw surfaces' reflection lines (surface also must have a
"ReflectLns" attribute - see attributes above).
-P: Draws curves and surfaces using a set of polygons (see -F).
-o: Reverses the Orientation by flipping all normals (see -n, -N).
-x ExecAnimCmd: Command to execute as a subprocess every iteration of
display of an animation sequence. This command can, for example, save
the display into an image file, saving the animation sequence.
One parameter, which is an running index starting from one, is passed.
-X Min,Max,Dt,R{,flags}: Executes an animation sequence between
Min time to Max time in steps of Dt. R repetitions of the animations
are executed. Flags could be any combination of:
's': Flag to specify the saving of the animation as individual
data files, one per frame, for high quality rendering.
't': Two way animation - bounce back and forth.
'b': Reset the animation back to its starting position.
'x': Flag to force the display device to exit upon completion of the
animation.
The configuration file is read before the command line options are
processed. Therefore, all options in this section can be overridden
by the appropriate command line option, if any.
TransPrefPos: Preferred location (Xmin, YMin, Xmax, Ymax) of the
transformation window.
ViewPrefPos: Preferred location (Xmin, YMin, Xmax, Ymax) of the
viewing window.
BackGround: Background color. Same as '-b'.
Internal: Draws internal edges. Same as '-i'.
LightSrcPos: Sets the location of the (first) light source as a
rational four coefficient location. W of zero sets the light source
at infinity.
ExecAnimCmd: Executes a command at each step of the animation. Same as
'-x'.
ExecAnimation: Executes an animation sequence on startup. Same as '-X'.
DrawVNormal: Draws normals of vertices. Same as '-n'.
DrawPNormal: Draws normals of polygons. Same as '-n'.
MoreVerbose: Provides some more information on the parsed data file(s).
Same as '-m'.
UnitMatrix: Forces a unit matrix. That is, input data are not
transformed at all. Same as '-u'.
DrawStyle: Requests a shaded surface rendering, or isocurve/polyline
surface rendering, or point rendering.
BFaceCull: Requests the removal of back facing polygons, for better
visibility.
DoubleBuffer: Requests drawing using a double buffer, if any.
DebugObjects: Debugs objects. Prints to stderr all objects read
from the communication port with the server IRIT. Same as '-d'.
DebugEchoInput: Debugs input. Prints to stderr all characters read
from the communication port with the server IRIT. Lowest level of
communication.
DepthCue: Sets depth cueing on. Drawings that are closer to the
viewer will be drawn in more intense color. Same as '-c'.
CacheGeom: Normally piecewise linear approximation of freefroms is
cached. By setting this option to FALSE, no such auxiliary data is
saved, reducing the memory overhead. Same as '-C'.
FourPerFlat: Forces four polygons per almost flat region in the
surface to polygon conversion. Otherwise two polygons only. Same as
'-4'.
AntiAlias: Requests the drawing of antialiased lines.
DrawSurfaceMesh: Draws control mesh/polygon of curves and surfaces,
as well. Same as '-M'.
DrawSurfacePoly: Draws curves and surfaces (surfaces are drawn using
a set of isocurves, see -I, or polygons, see -f). Same as '-P'.
StandAlone: Runs the driver in a standalone mode. Otherwise, the
driver will attempt to communicate with the IRIT server. Same
as '-s'.
PolyStrips: Renders using polygonal strips, if possible. Same
as '-R'.
ContMotion: Renders using continuous motions. Objects continue to
move indefinitely, following the last transformation applied. Same
as '-T'.
NumOfIsolines: Specifies number of isolines per surface, per
direction. Same as '-I'.
PllnFineNess: Specifies the samples per (iso)curve or tolerance of
approximation. See '-f'.
LineWidth: Sets the linewidth, in pixels. Default is one pixel
wide. Same as '-l'
AdapIsoDir: Selects the direction of the adaptive isoline
rendering.
PolygonOpti: Controls the method used to subdivide a surface into
polygons that approximate it. See '-F'.
PolylineOpti: Controls the method used to subdivide a curve into
polylines that approximate it. See '-f'.
ShadingModel: One of 1 (Flat), 2 (Gouraud), or 3 (Phong). Same as
'-A'.
TransMode: Selects between object space transformations and screen
space transformation.
ViewMode: Selects between perspective and orthographic views.
NormalLength: Sets the length of the drawn normals in thousandths of
a unit. Same as '-L'.
ZClipMin: Sets the minimal clipping plane in Z. Same as '-Z'.
ZClipMax: Sets the maximal clipping plane in Z. Same as '-Z'.
PlgnFineNess: Controls the fineness of the surface to polygon
subdivision. See '-F'.
Commands that affect the status of the display device can also be sent
via the communication port with the IRIT server. The following commands
are recognized as string objects with object name of "COMMAND_":
ANIMATE TMin TMax Dt
Animates current scene from TMin to TMax in Dt
steps.
BEEP
Makes some sound.
CLEAR
Clears the display area. All objects are deleted.
CLONEOBJ OBJNAME
Clone the object OBJNAME.
DCLEAR
Delays clear. Same as CLEAR but delayed until next
object is sent from the server. Useful for animation.
DISCONNECT
Closes connection with the server, but does not quit.
EDITCRV CRVNAME
Requests immediate editing mode of crv CRVNAME.
EDITOBJ OBJNAME
Requests immediate editing mode of obj OBJNAME.
EDITSRF SRFNAME
Requests immediate editing mode of srf SRFNAME.
EXIT
Closes connection with the server and quits.
GETOBJ NAME
Requests the object named NAME that is returned
in the output channel to the server.
HIGHLIGHT1 NAME
Color the object named NAME with highlight1 color.
HIGHLIGHT2 NAME
Color the object named NAME with highlight2 color.
IMGSAVE NAME
Save the current display in an image file named NAME.
MSAVE NAME
Save the current matrix in a file named NAME.
PICKCRSR
Requests to interactively sample mouse/cursor events
for mouse-up, mouse-down, and mouse-move-while-down.
PICKDONE
Stop interactive pick reports to server. Stops all
PICKCRSR, PICKNAME and PICKOBJ modes.
PICKNAME
Requests to interactively pick an object by name that
is returned in the output channel to the server.
PICKOBJ
Requests to interactively pick an object that is
returned in the output channel to the server.
REMOVE NAME
Requests the removal of object named NAME from
display.
STATE COMMAND
Changes the state of the display device. See below.
UNHIGHLIGHT
Unhighlight all highlighted objects.
The following commands are valid for the STATE COMMAND above,
MouseSense:
Mouse sensitivity control.
ScrnObjct:
Controls screen/object transformation mode.
PerspOrtho:
Controls perspective/orthographic trans. mode.
DepthCue:
Controls depth cueing drawing.
CacheGeom:
Cache the created piecewise linear geometry.
DrawStyle:
Controls isocurve/shaded solid/points rendering.
ShadingMdl:
Controls shading model for solid solid drawing.
BFaceCull:
Cull backfacing polygons.
DblBuffer:
Controls single/double buffer mode.
AntiAlias:
Controls antialiased lines.
DrawIntrnl:
Controls drawing of internal lines.
DrawVNrml:
Controls drawing of normals of vertices.
DrawPNrml:
Controls drawing of normals of polygons.
DrawPlgns:
Controls drawing of polygonal objects as polygons.
DSrfMesh:
Controls drawing of control meshes/polygons.
DSrfWire:
Controls drawing of curves/surfaces as wireframes.
DSrfBndry:
Controls drawing of boundary curves of surfaces.
DSrfSilh:
Controls drawing of silhouette curves of surfaces.
DSrfPoly:
Controls drawing of curves/surfaces as polygons.
DSrfSktch:
Controls drawing of surfaces as sketches.
4PerFlat:
Controls 2/4 polygons per flat surface regions.
NumIsos:
Controls the number of isocurves in a surface.
PolyAprx:
Controls the surface tesselation fineness.
PllnAprx:
Controls the curves to polylines fineness.
LenVecs:
Controls the length of displayed normal vectors.
WidthLines:
Controls the width of the drawn lines.
WidthPts:
Controls the width of the cross of drawn points.
Front:
Selects a front view.
Side:
Selects a side view.
Top:
Selects a top view.
Isometry:
Selects an isometric view.
4Views:
Selects a four views mode.
Clear:
Clears the viewing area.
ResAdapIso:
Controls the resolution of a number of adaptive isocurves.
ResRldSrf:
Controls the resolution of ruled srfs in adaptive isocurves.
RuledSrfApx:
Controls the ruled surface approx. in adaptive isocurves.
AdapIsoDir:
Controls the row/col direction of adaptive isocurves.
LowResRatio:
Controls the low/high resolution ratios.
ClipAtPoles:
Controls the optional clipping of polygons/lines at poles.
Obviously not all state options are valid for all drivers.
The IRIT server defines in iritinit.irt several user-defined
functions that exercise some of the above state commands, such as
VIEWSTATE and VIEWSAVE. VIEWSTATE accepts a second parameter which
can be -1 to toggle the value, 0 to reset the value or 1 to set it.
If the state value is real, 1 doubles its value and 0 halfs it.
In addition to state modification via communication with the IRIT
server, modes can be interactively modified on most of the display devices
using a pop-up menu that is activated using the right button in the
transformation window}.
This pop-up menu is somewhat different in different drivers, but its
entries closely follow the entries of the above state command table.
All driver support three special matrices. The VIEW_MAT can set
the current viewing direction and PRSP_MAT can set the current perspective
view. Finally, CONT_MAT can set the current continuous motion (see also
'-T' option).
All the display drivers are now able to animate objects with animation
curve attributes on them. For more on the way animation curves can be
created, see the Animation Section of this manual.
Once a scene with animation curve attributes is being loaded into
a display device, one can enter "animation" mode using the "Animation"
button available in all display devices. The user is then prompted (either
graphically or in a textual based interface) for the starting time,
termination time and step size of the animation. The parameter space of
the animation curve serves as the time domain. The default starting
and terminating times are set as the minimal and maximal parametric
domain values of all animation curves. An object at time t below the
minimal parametric value will be placed at the starting value of the
animation curve. Similarly, an object at time t above the
maximal parametric value will be placed at the termination value of the
animation curve. The user can also set a bouncing back and forth mode,
the number of repetitions, and if desired, request the saving of all
the different scenes in the animation as separate files so a high quality
animation can be created.
A string object can be viewed as the text of selected PS font (See -N).
The string position is set via a "StrPos" vector attribute (default to the
origin), and "StrScale" real attribute to control the string height in
world unit (default to 0.1). Text will always be in a plane parallel to
the XY plane.
Programmable hardware allows us to change the standard pipeline of
the GPU. This features enables users to create dedicated GPU programs
(called shaders) to implement advanced rendering algorithms.
Under Windows, IRIT’S OpenGL display device is able to use
programmable hardware features. In order to use these advanced
hardware rendering features, the GPU must support the proper shader
model. The display device will ignore advanced hardware features
attributes if the local GPU does not support the proper shader’s
requirements.
The following advanced hardware features are supported by IRIT:
Deformation displacement mapping is a technique that allows us to
tile the geometry of a given object without the limitations of strict
displacement mapping.
Requirements: Shader model 3.0 and above
Shader file: ddm_vshd.cg
Shader Language: CG
Shader’s compilation: run time.
Supported geometries: All surfaces and polygonal models with UV values
In order to use DDM texture in an object, a "DTexture" attribute string
must be defined for the object ([.] are optional):
S SamplingU SamplingV: Number of samples to take on the original
object (default S=T).
H Shader: Shader filename (default: ddm_vshd.cg).
Z Scale: Z Scale factor on tile’s Z axes (default = 1).
OB/OA: Draw the original object before the tiles (OB) or draw the
original object after the tiles (OA). This matters when using tiles
with transparency (Default: don’t draw original object).
RU/CU/CRU, RV/CV/CRV: How the tiles should be handled when overlapping
the object’s UV domain:
RU, RV: Repeat end conditions.
CU, CV: Clamp end conditions.
CRU, CRV: Clamp to tile size - simulates repeat with clamping (handles
the stretch side effect in the background of objects with only 1 side
when using simple repeat. (Default: RU, RV)
M: Use multitiles (see below).
NO/NT: Normal calculation methods offset (NO), or tangent plane mapping
(NT) (Default: NO).
Animation Samples: The number of samples from a continuous animation
sequence that is defined on an object (default: 1).
Examples:
[DTexture "horn.itd, H ddm_vshd.cg, T 4 16, S 32 64, CRU, CV, Z 0.7, NT"]
[DTexture "stone-t1.itd, H ddm_vshd.cg, T 6 1, S 64 64, CU, RV, Z -0.1, M, NO"]
DDM supports usage of more than one tile per object. When using
multitiles, tiles are placed randomly on the object. To use
multitiles, an 'M’ flag should placed in the dtexture attribute.
Furthermore, an additional "DTextureFiles" attributes must be defined
for the object with the following string: "Tilefile1, tilefile2,
tilefile3...". The maximum number of supported tiles is 10.
The tile geometry also supports some attributes such as animation.
The following animations are supported:
MORPH:
Morphing between two compatible tiles (same number of vertices)
according to the curve. The morphing is between the DDM tiles
("DTexture" attribute) and the first tile in the "DTextureFiles" attribute
(hence, using morph requires multitiles).
SCL_Z: Z scale of the tile (in tile space) according to the animation
curve (see also animation in IRIT and the display device).
MOV_U/MOV_V: Change the UV placement of the tile in the parametric
space of the base, textured, surface, according to the animation curve.
RECT_TILE, or HEX_TILE or TRIG_TILE or TRIG_TILE_REV:
DDM supports four types of tiles:
Rectangle:
Creates square tiling.
Hexagon:
Creates honeycomb tiling.
Triangle:
Tiles the surfaces using triangles.
Reversed Triangle:
Tiles the surfaces using reversed triangles.
In order to define the type of tiling, one of the above attributes should
be added to the tile object:
FFD is a technique which deforms objects by deforming the space in
which the object is embedded.
Requirements: Shader model 3.0 and above
Shader file: ddm_vshd.cg
Shader Language: CG
Shader’s compilation: run time.
Supported geometries: All surfaces and polygonal models with UV values
In order to use FFD in an object, an "FFD_texture" attribute must be
added to the object with the following string:
The x11drvs supports the following X Defaults (searched at ~/.Xdefaults):
#ifndef COLOR
irit*MaxColors: 1
irit*Trans*BackGround: Black
irit*Trans*BorderColor: White
irit*Trans*TextColor: White
irit*Trans*SubWin*BackGround: Black
irit*Trans*SubWin*BorderColor: White
irit*Trans*CursorColor: White
irit*View*BackGround: Black
irit*View*BorderColor: White
irit*View*CursorColor: White
#else
irit*MaxColors: 15
irit*Trans*BackGround: NavyBlue
irit*Trans*BorderColor: Red
irit*Trans*TextColor: Yellow
irit*Trans*SubWin*BackGround: DarkGreen
irit*Trans*SubWin*BorderColor: Magenta
irit*Trans*CursorColor: Green
irit*View*BackGround: NavyBlue
irit*View*BorderColor: Red
irit*View*CursorColor: Red
#endif
irit*Trans*BorderWidth: 3
irit*Trans*Geometry: =150x500+510+0
irit*View*BorderWidth: 3
irit*View*Geometry: =500x500+0+0
The Motif-based display drivers contain three types of gadgets which can be
operated in the following manner. Scales: can be dragged or clicked outside
for single (mouse's middle button) or continuous (mouse's left
button) action. Pushbuttons: activated by clicking the mouse's left button.
The control panel: allows rotation, translation of the objects in three
axes, determining of the perspective ratio, viewing an object from top, side,
front or isometrically, determining scale factor and clipping settings, and
operating the matrix stack.
The environment window toggles between screen or object transformation,
depth cue on or off, orthographic or perspective projection, wireframe or
solid display, single or double buffering, showing or hiding normals,
including or excluding the surface's mesh and curve's control polygon,
surface drawing using isolines or polygons, and four or two polygons per
flat patch. Some display devices allow for the inclusion or exclusion of
internal edges, and enable or disable of antialiased lines.
Scales in the X11/Motif based devices set normals length, lines width,
control sensitivity, the number of islolines and samples, etc.
The locations of windows as set via [-g] and [-G] and/or via the
configuration file overwrite in x11drvs the Geometry X11 defaults.
To use the Geometry X11 default, use '-G " "' and '-g " "' or set the
string to empty size in the configuration file.
In os2drvs, only -G is used to specify the dimensions of the parent window
that holds both the viewing and the transformation window.
In os2drvs, the following key strokes are available as shortcuts:
displays the model of solid1.itd using backface culling ('-B'), with
internal edges ('-i'), and line width of 3.
xglmdrvs -r -A flat wiggle.itd
displays the model of wiggle.itd shaded ('-r') using flat shading ('-A').
xglmdrvs -I 40 -u -b 255 255 255 wiggle.itd
displays the model of wiggle.itd using isolines' density of 40 ('-I'), using
unit matrix to begin with ('-u'), and a white background ('-b').
xglmdrvs -X 0,2,0.1,sx -r anim.itd
executes the animation in anim.itd, from time 0 to time 2 in steps of 0.1.
The animation is saved in one frame per file (flag 's' in '-X') and
the display device exists once the animation has terminated (flag 'x'
in '-X')). The animation will be shaded ('-r').
The IRIT Solid Modeler is accompanied by quite a few utilities. They
can be subdivided into two major groups. The first includes auxiliary tools
such as illustrt and poly3d-h. The second includes filters such as irit2ray
and irit2ps.
All these tools operate on input files, and most of the time produce
data files. In all utilities that read files, the dash ('-') can be used
to read stdin.
Example:
poly3d-h solid1.itd | irit2ps - > solid1.ps
All the utilities have command line options. If an option is set by a '-x',
then '-x-' resets the option. The command line options overwrite the settings
in config files, and the reset option is useful for cases where the option
is set by default, in the configuration file.
All utilities can read a sequence of data files. However, the last
transformation matrices found (VIEW_MAT and PRSP_MAT) are actually used.
x11drvs will display the original solid1.itd file with its hidden version,
as computed by poly3d-h, all with the solid1.imd, ignoring all other matrices
in the data stream.
Compressed files with a postfix ".Z" or ".gz" will be automatically
uncompressed on read and write. The following is legal:
poly3d-h is a program to remove hidden lines from a given polygonal model.
Freeform objects are preprocessed into polygons with controlled fineness.
FIGURE:
Some examples of the use of the hidden line removal tool, poly3d-h,
to remove hidden lines.
The program performs 4 passes over the input:
1. Preprocesses and maps all polygons in a scene, and sorts them.
2. Generates edges out of the polygonal model and sorts them (preprocessing
for the scan line algorithm) into buckets.
3. Intersects edges, and splits edges with non-homogeneous visibility (the
scan line algorithm).
4. Applies a visibility test on each edge.
This program can handle CONVEX polygons only. From IRIT one can
ensure that a model consists of convex polygons only, using the CONVEX
command:
CnvxObj = convex( Obj );
just before saving it into a file. Surfaces are always decomposed into
triangles.
poly3d-h output is in the form of polylines. It is a regular IRIT
data file that can be viewed using any of the display devices, for example.
-b: BackFacing - if an object is closed (such as most models created by
IRIT), backfacing polygons can be deleted, thereby speeding up
the process by at least a factor of two.
-m: More - provides some more information on the parsed data file(s).
-i: Internal edges (created by IRIT) - default is not to
display them, and this option will force their display, as well.
-e n: Number of edges to use from each given polygon (default all).
Handy as '-e 1 -4' for freeform data.
-H: Dumps both visible lines and hidden lines as separated objects.
Hidden lines will be dumped using a different (dimmer) color and (a
narrower) line width.
-4: Forces four polygons per almost flat region in the surface to
polygon conversion. Otherwise two polygons only.
-W Width: Selects a default width for visible lines in inches.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-q: Quiet mode. No printing aside from fatal errors. Disables -m.
-o OutName: Name of output file. Default is stdout.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-z: Prints version number and current defaults.
-c: Clips data to screen (default). If disabled ('-c-'), data
outside the view screen ([-1, 1] in x and y) are also processed.
Some of the options may be turned on in poly3d-h.cfg. They can then be
turned off in the command line as '-?-'.
The program can be configured using a configuration file named poly3d-h.cfg.
This is a plain ASCII file you can edit directly and set the parameters
according to the comments there. 'poly3d-h -z' will display the current
configuration as read from the configuration file.
The configuration file is searched in the directory specified by the
IRIT_PATH environment variable. For example,
'setenv IRIT_PATH /u/gershon/irit/bin/'.
If the IRIT_PATH variable is not set, the current directory is searched.
As this program is not interactive, usage is quite simple, and the only
control available is the command line options.
If a certain surface should be polygonized into a finer/coarser
set of polygons than the rest of the scene, one can set a "resolution"
attribute which specifies the relative FineNess resolution of this
specific surface. Further, "u_resolution" and "v_resolution" might be
similarly used to set relative resolution for the u or v direction only.
The "crv_resolution" attribute controls the relative fineness of curves
as polylines. The "num_of_isolines" attribute controls the relative number
of isoparametric curves.
illustrt is a filter that processes IRIT data files and dumps out modified
IRIT data files. illustrt can be used to make simple, nice illustrations of
data. The features of illustrt include depth sorting, hidden line clipping
at intersection points, and vertex enhancements. illustrt is designed to
closely interact with irit2ps, although it is not neceessary to use irit2ps
on illustrt output.
FIGURE:
Some examples of the use of the illustration tool, illustrt.
-I #UIso[:#VIso[:#WIso]]: Specifies the number of isolines per
surface/trivariate, per direction. If #VIso is not specified,
#UIso is used for #VIso as well and so no.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-s: sorts the data in Z depth order that emulates hidden line removal
once the data are drawn.
-M: Dumps the control mesh/polygon as well.
-P: Dumps the curve/surface as isocurves.
-p: Dumps vertices of polygons/lines as points.
-O: Handles polygonal objects as possibly open. This will generate
two identical edges for an edge shared by two adjacent polygons.
This can be useful for open or isolated polygons.
-l MaxLnLen: Breaks long lines into shorter ones with maximal length
of MaxLnLen. This option is necessary to achieve good depth depending
on line width in the '-d' option of irit2ps.
-a: Takes into account the angle between the two (poly)lines that
intersect when computing how much to trim. See also -t.
-t TrimInter: Each time two (poly)line segments intersect in the
projection plane, the (poly)line that is farther away from the
viewer is clipped by the TrimInter amount from both sides. See also -a.
-o OutName: Name of output file. Default is stdout.
-Z InterSameZ: The maximal Z depth difference of intersection curves
to be be considered invalid.
-m: More talkative mode. Prints processing information.
-T AnimTime: If the data contain animation curves, evaluate and
process the scene at time AnimTime.
illustrt is a simple line illustration tool. It processes geometry such
as polylines and surfaces and dumps geometry with attributes that will make
nice line illustrations. illustrt is geared mainly toward its use with
irit2ps to create postscript illustrations. Here is a simple example:
makes sure all segments piped into irit2ps are shorter than 0.1 and sorts them
in order to make sure hidden surface removal is correctly applied. Irit2ps
is invoked with depth cueing activated, and a default width of 0.05.
illustrt dumps out regular IRIT data files, so output can be handled
like any other data set. illustrt does the following processing to the input
data set:
Converts surfaces to isocurves ('-I' flag) and isocurves and curves to
polylines ('-S' flag), and converts polygons to polylines.
Polygonal objects are considered closed and even though each edge is
shared by two polygons, only a single one is generated.
Finds the intersection location in the projection plane of all segments in
the input data set and trims away the far segment at both sides of the
intersection point by an amount controlled by the '-t' and '-a' flags.
Breaks polylines and long lines into short segments, as specified via the
'-l' flag, so that width depth cueing can be applied more accurately
(see irit2ps's '-d' flag) as well as the Z sorting.
Generates vertices of polygons in the input data set as points in output data
controlled via the '-p' flag.
set.
Applies a Z sort to the output data, if '-s', so drawing in order of the data
will produce a properly hidden surface removal drawing.
Here is a more complex example. Make sure tubular is properly set via
"attrib(solid1, "tubular", 0.7);" and invoke:
makes sure all segments piped into irit2ps are shorter than 0.1, generates
points for the vertices, sorts the data in order to make sure hidden surface
removal is correctly applied, and trims the far edge by 0.05 at an
intersection point. Irit2ps is invoked with depth cueing activated and a
default width of 0.05, points are drawn as hollowed circles of default
size 0.05, and lines are drawn tubular.
Objects in the input stream that have an integer attribute by the
name of "IllustrtNoProcess" are passed to the output unmodified. If
this attribute value is <= 0, the object is sent to the output stream
immediately (in the beginning of the output stream. If this
attribute value is > 0, the object is sent to the output stream at
the end (in the end of the output stream.
Objects in the input stream that have a real attribute by the name of
"IllustrtShadeBG" are copied and rendered also in the background
with a gray color as set by this attribute (between zero and one). If
a regular color/rgb attribute is found on the object, this value will
scale that as well.
Objects in the input stream that have an attribute by the name of
"SpeedWave" will have a linear segment added that emulates fast
motion with the following attributes,
Objects in the input stream that have an attribute by the name of
"HeatWave" will have a spiral curves added that emulate a heat wave
in the +Z axis with the following attributes,
Aisoshad is a filter that processes IRIT data files of freeform shapes
and dumps out modified IRIT data files in the form of short
univariate strokes. Aisoshad can be used to make simple yet nice line
art illustrations of geometry that is based solely on isoparametric
curves.
Aisoshad employs a simple shader to determine the density of the
isoparametric strokes as well as the thickness etc. Output of aisoshad
can be piped into the irit2ps postscript postprocessor.
FIGURE:
Examples of the use of the aisoshad illustration tool to
line art illustrative drawing using isoparametric curves. In (left),
silhouettes are emphasized, while in (right) a light source above and to
the right is placed using a cosine shader.
-o OutName: Name of output file. Default is stdout.
-m: More talkative mode. Prints processing information.
-i: Solve symbolic products using interpolations. Faster but the
generated output is not as compact as possible.
-I #IsoLines: Specifies number of isolines per surface, per direction.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. Default is 0 and 20.0 (no optimal sampling with fineness
of 20.0 (real number)).
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-r: Selects the rendering model of the shader as follows:
2. Cosine shader, diffuse only, light source as two lights from
opposite directions.
3. Cosine shader, has specular term, light source regular.
4. Cosine shader, has specular term, light source as two lights.
5. Shader emphasizing the silhouette areas of the model.
6. Shader estimating distance decay from a point light source.
-c CosPower: Controls the cosine shader's power.
-s SdrPower: Controls the shader's relative influence.
-l Lx Ly Lz: Sets the light source position/direction.
-R Random: Controls the levels of randomness that the isoparametric
curves perturb. Low levels of randomness would leave visible
artifacts while too high levels would disturb the shading. Should be
greater than one or negative one to disable.
-d AdapDir: Sets the isoparametric directions of the strokes. Either
0, 1, or 2 for U direction, V direction or both U and V directions,
respectively.
-t SrfZTrans: The amount to translate the created line strokes in Z,
in order to prevent Z fighting with the rendered object itself.
-M MinSubdiv: Sets the minimal number of subdivision to enforce
during the isoparametric strokes' construction. This flag should be
used rarely and typically MinSubdiv should be low and close to one.
-D AdapDist: Sets the distance between adjacent isocurves. The smaller
AdapDist is, the denser the coverage of the strokes will be.
-w AdapIsoWidth: Sets the default width attribute of the generated
strokes.
-S WidthScale: Controls the relative variance of the width of the
strokes in variable width strokes.
-W: If set, enables variable width strokes.
-u: If set, maps the strokes to screen space. Otherwise, strokes
are mapped back to object space.
-Z ZbufSize: Sets the size of the (square) Z buffer to set.
-b: If set, generates a binary IRIT data file that holds the
strokes. Otherwise, IRIT text file will be created.
Aisoshad is a simple line art illustration tool that generates strokes
that follow the isoparametric curves. It processes freeform geometry such
as surfaces and dumps geometry with attributes that makes
nice line illustrations. Aisoshad is geared mainly toward its use with
irit2ps to create postscript illustrations. Here is a simple example:
that creates line art illustrations of a wine glass wglass.itd with
hidden strokes removed via a Z-buffer of size 500 that will be displayed on
screen, polygonal fineness of 50 for the surface of the glass, shader power
of 10 and cosine power of 1, isoparametric curves maximal distance of 0.3,
and shader number 5 that emphasizes silhouettes. The output of the shader
is piped to a irit2ps filter to postscript that sets the width of the strokes
to be a function of depth.
that creates line art illustrations of a wine glass wglass.itd with
hidden strokes removal via a Z-buffer of size 700 that is allocated off-line
in core memory, polygonal fineness of 50 for the surface of the glass,
a light source at (1, 1, 1), isoparametric curves maximal distance of 0.02,
and a cosine shader number 2. The output of the shader is piped to a irit2ps
filter to postscript that sets the width of the strokes to be a function of
depth.
Transparent objects, or objects with the "transp" attribute, would generate
strokes as regular surfaces but would not participate in the hidden strokes
removal. An "AdapIsoDir" attribute that is found on some surface object
would override the global isoparametric direction's setup of strokes as is
set via the 'd' option.
See also the illustrt, izebra, lineshad, and
irit2ps tools.
Izebra is a filter that processes IRIT data files into a 2D striped,
zebra style illustration that gives the user an illusionary depth cue. The
output is also an IRIT data file in the form of freeform curves. Izebra
can be used to make simple yet nice art illustrations of geometry that is
based on a specific style inspired by the artist Victor Vasarely.
Izebra employs a Z buffer to determine the density and warping of the
stripes. Output of izebra can be piped into the irit2ps postscript
postprocessor.
FIGURE:
Examples of the use of the izebra illustration tool toward
line art illustrative drawings. On the left, the Utah teapot is
rendered, while on the right, a chess piece, a pawn, is portrayed.
-o OutName: Name of output file. Default is stdout.
-m: More talkative mode. Prints processing information.
-O ImgOper: By default, the Z buffer is employed directly. However,
once the Z buffer is fully evaluated and before beginning the stripes
processing, one can apply a filter to the Z map of the Z buffer. The
filter can be a first order Roberts derivative if "-O 1", a second
order Laplacian if "-O 2", or an inverted depth if "-O 3".
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. Default is 0 and 20.0 (no optimal sampling with fineness
of 20.0 (real number)).
-u: Forces a unit matrix. That is, input data are not
transformed at all.
-I NumIters: Puts a bound on the number of iterations in the
numerical processing stage.
-Z ZbufSize: ZbufSize sets the size of the (square) Z buffer to set.
-B CbcBspSize: Sets the mesh size of the constructed uniform cubic
B-spline grid, if no data surface is specified by '-D'.
-D DataSrf: If specified, provides the name of the uniform cubic
B-spline to load and warp. Overrides the '-B' option.
-A StripeAngle: Sets the angle of the stripes with respect to the
horizontal line, in degrees.
-b: If set, generates a binary IRIT data file that holds the
stripes. Otherwise, an IRIT text file will be created.
-s Stripes: If set, prescribes the number of strips to extract as iso
parametric curves of the warped B-spline surface. Otherwise, the
warped B-spline surface itself is dumped out.
-S ZScale: A relative factor to control the effect of the depth
on the warping amount. This should be around one.
-d ZInitDepth: By default, the Z buffer is initialized to a depth of
zero which amounts to no warping of the B-spline surface. Here is
a proper way to prescribe a different background depth (which will
cause warping in the surface).
Izebra is a simple stripes art illustration tool that generates stripes
that follow a warped B-spline surface as its isoparametric curves. It
processes the given geometry, such as surfaces, into a Z map of a Z buffer
and warps a B-spline surface that is placed over it, with a warping amount
that is a function of the locally detected depth. IZebra dumps out stripes
geometry that makes nice illusionary illustrations. IZebra is geared
mainly toward its use with irit2ps to create postscript illustrations.
Here is a simple example:
creates striped illustrations of a pawn chess piece, with the aid
of a Z-buffer of size 500 by 500, a uniform cubic B-spline surface with mesh
size of 150 by 150, polygonal fineness of 100 for the surface of the pawn,
rotation of stripes of 140 degrees and Z scale factor of 0.35. Ten iterations
will be conducted during the numerical processing of the data.
The output of izebra is piped by the irit2ps filter to postscript that
extracts 250 isoparametric curves out of the dumped warped surface and sets
the width of the strokes to be 0.004.
creates striped illustrations of the Utah Teapot, with the aid
of a Z-buffer of size 500 by 500, a uniform cubic B-spline surface with mesh
size of 200 by 200, polygonal fineness of 100 for the surface of the teapot,
rotation of stripes of -90 degrees and Z scale factor of 0.4. Ten iterations
will be conducted during the numerical processing of the data.
The output of izebra is piped by the irit2ps filter to postscript that
extracts 150 isoparametric curves out of the dumped warped surface and sets
the width of the strokes to be 0.007.
See also the illustrt, aisoshad, lineshad, and
irit2ps tools.
Lineshad is a filter that processes IRIT data files of freeform shapes
and dumps out modified IRIT data files in the form of short
univariate strokes. Lineshad can be used to make simple yet nice line
art illustrations of geometry that is based on arbitrarily stroked
curves on the surfaces.
Lineshad employs a simple shader to determine the density of the
isoparametric strokes as well as the thickness etc. Output of lineshad
can be piped into the irit2ps postscript postprocessor.
FIGURE:
Examples of the use of the lineshad illustration tool to
line art illustrative drawing using isoparametric curves. On the left,
silhouettes are emphasized, while on the right, a light source above
and to the right is placed using a cosine shader.
-o OutName: Name of output file. Default is stdout.
-m: More talkative mode. Prints processing information.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. Default is 0 and 20.0 (no optimal sampling with fineness
of 20.0 (real number)).
-R RelStepSize: Relative control (default to 1.0) on the step size
taken during the numerical marching on the surfaces in the different
strokes' patterns.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-r: Selects the rendering model of the shader as follows:
3. Cosine shader, diffuse only, light source as two lights from
opposite directions.
4. Cosine shader, has specular term, light source regular.
5. Cosine shader, has specular term, light source as two lights.
6. Shader emphasizing the silhouette areas of the model.
7. Shader estimating distance decay from a point light source.
-c CosPower: Controls the cosine shader's power.
-s SdrPower: Controls the shader's relative influence.
-i Intensity: Controls the global density of the constructed line art.
The larger Intensity is, the denser the drawing becomes.
-l Lx Ly Lz: Sets the light source position/direction.
-v Vx Vy Vz: Sets the viewing direction; typically, the Z axis.
-w Width: Sets the width of the generated strokes.
-d Density: Relative control (default to 1.0) of the density of the
uniform point distribution from which the strokes are developed.
-t SrfZTrans: Amount of created line strokes in Z to translate,
in order to prevent Z from fighting with the rendered object itself.
-S WidthScale: Controls the relative variance of the width of the
strokes in variable width strokes.
-T Textures: Selects the pattern of the strokes. Texture can be one
of:
1. "isoparam[,{0,1,2}w]": Isoparametric curves will be created in
a similar way to the aisoshad tool. Following the "isoparam"
string, one can optionally specify the isoparametric direction
as 0, 1 or 2 for U, V, or both, and a second 'w' character for
optional variable width. This option extracts exact
isoparametric curves from the given surface.
2. "wood[,Dx,Dy,Dz]": A strokes' style following layers of wood
will be used. Optionally, a direction normal to the layers
can be specified, with a default being the Z axis.
3. "vood[,Ry,Rz]": A variation on the wood texture, this time with
a layered orientation set via two rotation angles around Y and
Z.
4. "isomarch[,{0,1,2}]": Similar to "isparam" but numerically
march on the surface in the isoparametric direction. Again,
0, 1, or 2 stands for U, V, or both isoparametric directions.
5. "silhouette[,{t,n,tn}]": Extract strokes emphasizing the
silhoeutte areas from the given viewing direction. Strokes
can be extracted in the direction of the surface normal near
the silhouette area if option ",n" is given, tangent along
the surface if ",t", or both if ",tn".
6. "iTexture": Employ a raster image as a texture image on the
surface with the gradient of the image serving as the strokes
direction. The name of the image itself (must be in urt rle
format) is expected in a "iTexture" attribute on the specific
object.
7. "curvature[,{0,1,2}]": Develop strokes along lines of
curvatures. Strokes are developed along the minimal curvature
if ",0", the maximal curvature if ",1", and both if ",2".
8. "CurveStroke": An XY curve object is expected as a
"CurveStroke" attribute on the same object and serves as a
specification of motion in the parametric space of the surface
for each given point.
-Z ZbufSize: ZbufSize sets the size of the (square) Z buffer to set.
-b: If set, generates a binary IRIT data file that holds the
strokes. Otherwise, an IRIT text file will be created.
lineshad is a simple line art illustration tool that generates strokes
that follow the isoparametric curves. It processes freeform geometry such
as surfaces, and dumps geometry with attributes that makes
nice line illustrations. lineshad is geared mainly toward its use with
irit2ps to create postscript illustrations. Here is a simple example:
creates line art illustrations of a wine glass wglass.itd with
hidden strokes removal via a Z-buffer of size 500 that will be displayed on
screen, polygonal fineness of 50 for the surface of the glass, shader that
employs isoparametric curves, relative density of distribution of 0.5, and
cosine power of 10 of the cosine shader number 2.
creates line art illustrations of a wine glass wglass.itd with
hidden strokes removal via a Z-buffer of size 500 that is allocated off-line
in core memory, polygonal fineness of 50 for the surface of the glass,
a light source at (1, 1, 1) for the wood strokes' style, relative point
distribution of 6, and a cosine power of 10 for the cosine shader number 2.
Transparent objects, or objects with the "transp" attribute, will generate
strokes as regular surfaces but will not participate in the hidden strokes
removal. A string "itexture" attribute is expected if "itexture" strokes'
style is used. A curve object as the "CurveStroke" attribute is expected if
"CurveStroke" is employed. One can override the strokes' style as it is set
via the '-T' command line option by setting an "lTexture" string attribute
with the prefered strokes' style of this object. One can modify the relative
density of some specific object by placing a real number attribute named
"PtsDensity" on the object.
See also the illustrt, izebra, aisoshad, and
irit2ps tools.
ihidden is a program to remove hidden curves from a given surface model.
Only freeform objects are processed in ihidden.
FIGURE:
Some examples of the use of hidden curve removal tool, ihidden, to
remove hidden curves.
The program performs 3 passes over the input:
1. Preprocesses and extracts the different curves in a scene, boundary curves,
silhouette curves, isoparametric curves and discontinuity curves.
2. Solves for all the intersections of the different curves in the parametric
space, and at that point splits the curves into curve segments.
3. Applies a visibility test to each segment of curve.
This program can handle non self interesecting surfaces only. Further,
surfaces that intersect other surfaces and are not properly trimmed into
a model are likely to result in the wrong answer as well.
The output of ihidden is in the form of curves. It is a regular
IRIT data file that can be viewed using any of the display
devices, for example.
-q: Quiet - provides no information on the progress if TRUE.
-H: Dumps both visible lines and hidden curves as separated objects.
Hidden curves will be dumped using a narrower line width.
-M: Force conversion of (active) curves to be monotone.
-I #UIso[:#VIso[:#WIso]]: Specifies the number of isolines per
surface/trivariate, per direction. If #VIso is not specified,
#UIso is used for #VIso as well and so on.
-d: Add to also display C1 discontinuity curves.
-s: Specifies the step at which to stop this process, where step 3, as
described above, will complete the entire hidden curve removal
process and is the default.
-b: If set, generates a binary IRIT data file that holds the
strokes. Otherwise, an IRIT text file will be created.
-o OutName: Name of output file. Default is stdout.
-t Tolerance: Tolerance of computation.
-Z ZBufSz: Size of the Z buffer in the visibility testing process.
-T AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-z: Prints version number and current defaults.
Some of the options may be turned on in ihidden.cfg. They can then be
turned off in the command line as '-?-'.
The program can be configured using a configuration file named ihidden.cfg.
This is a plain ASCII file you can edit directly and set the parameters
according to the comments there. 'ihidden -z' will display the current
configuration as read from the configuration file.
The configuration file is searched in the directory specified by the
IRIT_PATH environment variable. For example,
'setenv IRIT_PATH /u/gershon/irit/bin/'.
If the IRIT_PATH variable is not set, the current directory is searched.
As this program is not interactive, usage is quite simple, and the only
control available is using the command line options.
If a certain surface should contain more or less isoparametric curves,
a relative change could be applied to some specific object via the
"num_of_isolines" attribute. If a "transp" attribute is found on some
object, it will generate all the curves but will not affect the visibility
(i.e. be fully transparent).
irender is a program to render IRIT scenes into images. It is
a software based Z buffer that is able to create images in few formats.
Several of its features includes parametric and volumetric texture mapping,
shadow computations, transparency and antialiasing.
Freeform objects are preprocessed into polygons with controlled fineness.
FIGURE:
Some examples of the use of irender scan convertion tool to render
images of IRIT scenes. Highlights can be seen in the
molecule image while the glass is rendered transparent.
-v: Verbose mode. Prints informative messages as it progresses.
-s XSize YSize: Sets the size of the output image, in pixels.
Default to 512x512.
-Z Znear Zfar: Sets the near and far cliping planes with default
of no clipping.
-a Ambient: Sets the ambient lighting fraction. Between zero (no
ambient lighting) and one. Default to 0.2.
-b R G B: Sets the background color. Each of thre R,G,B colors is
an integer value between zero and 255. Default to black.
-B: Apply back face culling. Somewhat faster, but only correct for
closed objects. Default is no back face culling.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. Default is 0 and 20.0 (no optimal sampling with fineness
of 20.0 (real number)).
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-M Flat/Gouraud/Phong/None: Selects the shader to be used. Default to
Phong if has normals of vertices, Flat if no normals are found.
The None options exactly paints the objects with the given color,
applying no shader.
-p PtRad]: Width of rendered points (as spheres).
-P WMin [WMax]: Width of rendered polyline, in world units. If only
WMin is specified, all polylines are set to have WMin width. Otherwise,
if WMax is prescribed as well, polylines' width is set to be
proportional to their depth with WMax is the width of closest polyline
and WMin the farest polyline. Polylines and curves will be
ignored without the setting of this option.
-S: Enable shadow computation. No shadows will be rendered without -S.
The is no shadow support for this release of irender.
-T: Enable transparency computation. No transparent object will be
processed without -T.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-N ClrQuant SilWidth [SilR SilG SilB]: Requests cartooN style
NPR rendering. Two effects could be activated using this option:
the colors could be quantized into ClrQuant levels or,
alternatively a value of zero for ClrQuant denotes no
quantization. Also, open boundaries and silhouettes could be
rendered if SilWidth > 0.0 at SilWidth polyline
width and optional color SilR SilG SilB.
-A FilterName: Selects an antialiasing filter. FilterName can be one
of 'none', 'box', 'triangle', 'quadratic', 'cubic', 'catrom',
'mitchell', 'gaussian', 'sinc, and 'bessel'. Default is 'none'.
-d: Output will be in the form of Z depth instead of a color image.
Output will be 32 bits depth instead of RGBA.
-V: Output will be in form of visibility map: a map in model's UV
coordinates that represents the visibility of the model from the
specified rendering direction.
-n: Reverses the normals of vertices and planes, globally.
-i rle/ppm{3,6}/png: Selects output image type. Currently
the Utah Raster Toolkit's (URT) rle format is being supported as well
as the PPM and PNG formats. PPM can be either P6 or P3 style.
-o OutName: Name of output file. By default the output goes to
stdout.
-z: Prints version number and current defaults.
Some of the options may be turned on in irender.cfg. They can be then
turned off in the command line as '-?-'.
The program can be configured using a configuration file named irender.cfg.
This is a plain ASCII file you can edit directly and set the parameters
according to the comments there. 'irender -z' will display the current
configuration as read from the configuration file.
The configuration file is searched in the directory specified by the
IRIT_PATH environment variable. For example,
'setenv IRIT_PATH /u/gershon/irit/bin/'.
If the IRIT_PATH variable is not set, the current directory is searched.
One can specify several attributes that affect the way the scene is
rendered. The attributes can be generated within IRIT.
See also the ATTRIB IRIT command.
Surface color is controlled on two levels. If the object has an RGB
attribute, it is used. Otherwise, a color as set via the IRIT
COLOR command. If a vertex of a poly object has an RGB attribute it
will overwrite the object's RGB color for that vertex.
If a certain surface should be finer/coarser than the rest of the
scene, one can set a "resolution" attribute which specifies the
relative FineNess resolution of this specific surface. Further,
"u_resolution" and "v_resolution" might be similarly used to set
relative resolution for the u or v direction only.
The "crv_resolution" attribute controls the relative fineness of curves
as polylines. The "num_of_isolines" attribute controls the relative number
of isoparametric curves.
Points are rendered as small spheres with size (radius) that is controlled
by the "width" attribute found on the object or the radius that is specified
by the '-p' option as default size.
Objects are rendered with no shading if "NoShading" attribute is found on
them.
Example:
attrib( Ball, "rgb", "255,0,0" );
color( Sphere, white );
The cosine exponent of the phong shader can be set for a specific
object via the SRF_COSINE attribute, with 128 as default value.
An object can affect its diffuse and specular components via the
DIFFUSE and SPECULAR real attributes, with 0.4 as default value.
An object can be drawn transparent instead of opaque, if it has a
"transp" attribute. A transparent value of one denotes a completely
transparent object, while a value of zero means a completely opaque
object. Transparent objects will be rendered as such if and only if the '-T'
command line option is set.
Example:
attrib( final, "transp", 0.5 );
An object can have its silhouettes (and boundary curves) rendered if a
real "SilWidth" attribute with width larger than zero is specified.
"SilColor" will then set the color of the rendered outline curves. See
also '-N' which sets this option globally.
Several types of texture mapping are supported. Parametric texture may be
attached to a parametric surface where the prescribed image is mapped onto
the rectangular parametric domain of the surface.
The parametric texture may be applied with the following options:
'D' x y z
Vector that will be rotated to Z along with the
texture coordinates. Applies to 'T' 1, 2 or 3.
Default to the Z axis.
'O' x y z
a point to which that texture Origin will be translated.
Applies to 'T' 1, 2 or 3. Default to origin.
'S' Su Sv {Sw}
Scales the coordinates in u and v. Scale
factors of 1.0 would cover the entire surface
once. Default to scale factors of 1.0. If Sw is
specified for a polygonal object, each polygonal is
locally scaled based on its maximal projection on
one of the main, XY XZ or YZ, planes.
If (Su = Sv = 0) for freeforms, the texture coords
are undergoing no scale at all (assuming image domain
of zero to one in all axes).
'A' a
Angle of rotation in degrees of texture map with
respect to main axis. Applies to 'T' 1, 2 or 3.
Default to no rotations.
'T' TextureType
with 0 denotes regular parametric texture,
1 denotes spherical coordinates,
2 denotes spherical bijective coordinates,
3 denotes cylinderical coordinates,
4 denotes planar coordinates.
Regular parametric texture employs the inherited surface parametrization
of the freeform surface and can only be used on parametric surfaces.
Spherical, cylinderical, and planar coordinate transformations are useable
for all types of geometry from polygons to freeform surfaces and is
fairly straightforward with the origin as set by 'O' being the center
of the mapping while the direction set by 'D' controls the north pole
of the sphere, the axis of the cylinder, and the normal of the plane.
Finally, the angle set by 'A' rotates the texture around this 'D' prescribed
axis.
The spherical bijective mapping is more complex. An object identical
to the textured object should be found as an "PTextureBijectObj" that
contains the identical topology of the original object. The original
object must be genus zero non convex, while the attribute object must be
a genus zero convex object with the origin as set via 'O', inside this
convex object. It is likely that both the original object and its attribute
object will be a polygonal object. Both objects must contain triangles only.
A bijective mapping is then conducted from every point on the original
non convex object to the convex attribute object and from there through
spherical mapping to the texture map.
Example:
attrib( Srf1, "ptexture", "checker.ppm, S 1 1, A 45" );
attrib( Srf2, "ptexture", "checker.ppm, S 1 3, T 1, O 1 1 1, D 0 0 1" );
attrib( Srf3Triangs, "ptexture", "checker.ppm, S 1 2, T 1, O 1 1 1, D 0 0 1" );
attrib( Srf3Triangs, "PTextureBijectObj", Srf3ConvexTriangles );
Srf1 is a parametrically textured map using spherical mapping,
Srf2 is a parametrically textured map using cylinderical
mapping and Srf3Triangs is a parametrically textured map using
spherical bijective mapping and Srf3ConvexTriangles is the convex
topologically equivalent object.
The program will automatically detect the image type according to
the file's type. Note that regular parametric texture may be applied to
parametric surfaces only, whereas the spherical, cylinderical and planar
parametric textures may be used on all types of geometry. Depending upon
the way irender is compiled, texture images could be in ppm format (always),
or gif, png, and rle. If the image has an alpha channel (fully supported
in png and rle and binary supported in gif images via its transparent color)
it is honored if transparency (-T) is activated.
A second type of texture mapping can be applied to all geometric objects.
Herein, a procedural texture mapping is employed. The currently supported
textures are
camouf
Camouflage style
checker
Checker style
chocolate
Chocolate chips style
contour
Parallel plane contouring
curvature
Gaussian/Mean etc. curvature
marble
Marble style
ncontour
Constant normal angle to major axis
orange
Bump mapping orange style
wood
Wood style
punky
Colorful punky style
A second parameter that must be provided for procedural textures is the
scaling factor of the texture, which can be either one parameter of uniform
scaling or a vector of three coefficients for scaling in x, y, and z.
For contour style, the scale denotes the spacing of the contouring
planes in X, Y and Z. For ncontour style, the scale also denotes
the spacing of the adjacent constant normal contours. Related attributes
are "texture_color" and "texture_width" that support the color and the
width of the textured strokes.
which sets Obj1 to have a marble procedural texture with a uniform
scaling factor of 2 and a wood texture for Obj2 with scaling factors
of (1, 0.5, 2.5) in x, y, and z.
In addition, the appearance of each procedural texture can be controlled by
optional parameters which are different for each texture. Each texture
parameter is recognized by a letter; to enter a parameter, add to the
attribute string the paramter letter followed by the value or values. Each
parameter should be separated by a comma.
Example:
attrib( Obj1, "texture", "wood, 2, b 0.3, o 5 5 5" );
sets Obj1 to have a wood procedural texture with a scaling factor
of 2, a Brightness level of 0.3, and the Origin point at (5,5,5).
The optional parameters are:
checker:
'z' x y z
a vector to which the Z axis will be rotated.
'o' x y z
a point to which the Origin will be translated.
'b' x
the brightness of the checker color scaling,
should be between 0 and 1.
'CP' f
To force a 2D checker plane orthogonal to the
vector that is specified via the 'z' option.
'C1' r g b
A second optional color for the checkerboard.
'C2' r g b
A third optional color for the checkerboard,
used in the second layer of the checker volume.
'C3' r g b
A fourth optional color for the checkerboard,
used in the second layer of the checker volume.
chocolate:
'W' w
the 'width' of chocolate piece (zero to half).
'd' x
the 'depth' of the bumps on the bump-mapping.
contour:
'W' w
the 'width' of contour.
'C' r g b
the color of the contour in RGB betweeo zero
and one ("C 1 1 1" fully is white).
curvature:
The curvature texture has no optional parameter, but the first scale
parameter has a special meaning. A scale of
0
Paints convex regions in red, concave in
green, and saddle-like in yellow.
>0
Paints the Gaussian curvature in convex regions
in red to magenta, in concave regions in yellow
to green, and in saddle-like in cyan to blue.
<0
Paints the Mean curvature in positive mean
curvature regions in yellow to green and in
negative Mean curvature in red to magenta.
If this first scale parameter is non zero, its absolute value is used to
modify the blending speeds between the different colors.
marble:
'z' x y z
a vector to which the Z axis will be rotated.
'o' x y z
a point to which the Origin will be translated.
't' f s
the scale of the turbulence noise, and the
factor to multiply that noise.
'f' x
the 'frequency' of the marble layers.
ncontour:
'W' w
the 'width' of contour.
'C' r g b
the color of the contour in RGB betweeo zero
and one ("C 1 1 1" fully is white).
orange:
'd' x
the 'depth' of the bumps on the bump-mapping.
wood:
'z' x y z
a vector to which Z axis will be rotated.
'o' x y z
a point to which the Origin will be translated.
'b' x
the brightness of the wood color scaling,
should be between 0 and 1.
'c' f s
the scale of the noise in the wood center axis
and the factor by which to multiply that noise.
'w' n f
the number of angles to sample noise when creating
distortion in the circle shape of the wood
cylinders, and the factor by which to multiply that noise.
'f' x
the 'frequency' of the wood cylinders.
'r' f s
the scale of the wood-fibers noise, and the
factor by which to multiply that noise.
punky:
'b' x
the brightness/saturation of the punky color.
More Examples:
attrib( Obj1, "texture", "marble, 2, t 3.0 12.0, f 7.0" );
attrib( Obj2, "texture", "contour, 1 0.5 2.5, W 0.004, C 1 1 0" );
sets Obj1 to have a marble procedural texture with a uniform
scaling factor of 2, and new turbulance and frequency factors.
This also sets a contouring texture for Obj2 with scaling
factors of (1, 0.5, 2.5) in x, y, and z, in yellow color and width 0.004.
In addition, a scalar surface spanning the same parameteric domain as an
original surface may be used as a texture mapping function. Herein, the
scalar function texture is evaluated at each UV parameter value and is mapped
through a color scale to yield the output color. This type of texture is
useful for stress maps or analysis maps on top of freeform surfaces.
Several related attributes are supported: "stexture_scale" which prescribes
the color scale image (only its first column is employed), and
"stexture_bound" that sets the domain that will be clipped to the min max
values. Funally, "stexture_func" can hold the functions "sqrt" or "abs"
to be applied to the evaluated surface value.
where scrvtr computes a scalar field to Srf that represents the
sum of the squares of the principle curvatures. The evaluated scalar
texture surface's value is piped through a sqrt function.
The first column of the image of color_scale.ppm is used to set
the coloring scale for curvature bounds values between 0.0 and 100.0.
Both "stexture_scale" and "stexture_bound" are optional. The default
color scale maps the min/max values from blue to red through green. The
default scalar surface texture bound is computed as the extreme values of
the "stexture" surface.
While the program has a default for lighting which is two light sources
at opposite directions at (1, 1, 1) and (-1, -1, -1), one can overwrite
this default. A POINT_TYPE object with LIGHT_SOURCE attribute denotes
a light source. If irender detects one or more light sources in the
input stream, the default light sources are not created. Two types of
light sources may be prescribed, a parallel at infinity or a point at a
finite distance light source, distinguished by a TYPE attribute of
either POINT_POS or POINT_INFTY. A point light source can be colored;
an RGB attribute will set its color. A point light source will cast
shadows, if and only if, it has a SHADOW attribute (one needs to apply the
'-S' command line option as well for rendering shadows). Finally, one can
construct two mirrored light sources at opposite directions if the TWOLIGHT
attribute is added to the light source object.
constructs two lights sources with Light1 with red color positioned
at (0, 0, 10) and casting shadows, while Light2 will create two
mirrored white parallel lights sources in the direction of (1, 1, 1) and
(-1, -1, -1), as its irender's default.
Visibility Maps
if the -V option is selected, the output will be a visibility map.
Visibility maps are created in the model's UV (texture) space and are
composed of 4 colors:
White: if pixel isn't mapped. I.e. the model UV's map does not cover this
pixel
Green: if the pixel is a (UV location of a Eculidean) visible location.
Red: if pixel is (UV location of a Eculidean) invisible location.
Yellow: if large errors are detected while calculating pixel's
visibility. This indeterministic result is due to almost
vertical polygns, typically.
Tips for geting higher quality visibility map:
1. Use the -s option for larger output resolution.
2. Use the -F option for finer polygonal sampling of surfaces.
Controlling the output can also be done by object attributes, as follow:
Use the 'tan_angle' property to change the yellow area of output. A
rendered triangle will be colored in yellow if it's surface is close
to being vertical, or tangent to the view, z, axis. Change the
'tan_angle' property to get maximal value of normalized scalar product
of triangle normal and z axis. Below that value the triangle will be
colored yellow. Default value: 0.1. Example:
attrib( Obj1, "tan_angle", 0.1 );
Use 'critic_ar' to change the unmapped area of output. Poor aspect ratio of
triangles leads to major errors. Aspect ratio is defined as the ratio of
largest edge by the smallest edge of triangle. Any triangle with aspect
ratio larger than 'critic_ar' will not be mapped.
Default value: 20.
3ds2irit converts Autocad's 3DS data files into IRIT data files. The
current version provides only partial support, mainly due to lack of
documentation examples on the dxf format and the convoluted way
freeform surfaces are saved.
-t: Dumps data to stdout as text instead of binary.
-z: Print version number and current defaults.
-c: Optional option that is available only if compressed binary files
are supported. Dumps data to stdout as compressed binary file
with a quanitization level of QuantVal.
The user may sometimes wish to convert .itd data files into a binary form,
for example, for fast loading of files with large geometry. Binary files can
be somewhat larger and are unreadable in editors but are much faster to load.
A binary file must have a '.ibd' file type.
Example:
dat2bin b58polys.itd > b58polys.ibd
dat2bin -t b58polys.ibd | more
The above converts a text file b58polys.itd into a binary file b58polys.ibd
and shows the content of the binary file by converting it back to text. At
this time data through pipes must be in text. That is, the following is
illegal:
dat2bin b58polys.itd | xglmdrvs -
It should be remembered that the binary format is not documented and
it might change in the future. Moreover, it is machine dependent and can
very well may be unreadable between different platforms.
Converts '.itd' and '.ibd' data files to '.irt' IRIT scripts.
Optionally, if compressed binary files are supported, also handle
'.icd' compressed data files.
dxf2irit converts Autocad's DXF data files into IRIT data files.
The current version provides only partial support for the conversion of
freeform surfaces, mainly due to lack of documentation examples on the
dxf format and the convoluted way freeform surfaces are saved.
irit2dxf converts IRIT data files into Autocad's DXF data files. The
current version provides only partial support for the direct conversion of
freeform surfaces, mainly due to lack of documentation examples on the
dxf format and the convoluted way freeform surfaces are saved. Nonetheless,
freeform surfaces can be converted into polygons using the '-f' flag.
-t XTrans YTrans: X and Y translation. of the image. Default is (0, 0).
-I #UIso[:#VIso[:#WIso]]: Specifies the number of isolines per
surface/trivariate, per direction. If #VIso is not specified,
#UIso is used for #VIso as well and so no.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-F PolygonOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4. This enforces the dump of freefrom geometry
as polygons.
-M: Dumps the control mesh/polygon as well.
-G: Dumps the freeform geometry.
-T: Talkative mode. Prints processing information.
-a AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-i: Internal edges (created by IRIT) - default is not to
display them, and this option will force their display.
-o OutName: Name of output file. By default the name of the first data
file from DFiles list is used. See below on the output files.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-P: Polygonize freeform shapes. Default is to leave freeform curves
and surfaces as is.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-T: Talkative mode. Prints processing information.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-c: Output files should be filtered by cpp. When set, the usually
huge geometry file is separated from the main nff file that contains
the surface properties and view parameters. By default all data,
including the geometry, are saved into a single file with type extension
'.nff'. Use of '-c' will pull out all the geometry into a file with
the same name but a '.geom' extension, which will be included using the
'#include' command. The '.nff' file should, in that case, be
preprocessed using cpp before being piped into the nff renderer.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-o OutName: Name of output file. By default the name of the first data
file from the DFiles list is used. See below on the output files.
-T: Talkative mode. Prints processing information.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
Irit2Nff converts freeform surfaces into polygons in a format that can
be used by an NFF renderer. Usually, one file is created with the '.nff' type
extension. Since the number of polygons can be extremely large, a '-c'
option is provided, which separates the geometry from the surface
properties and view specification, but requires preprocessing by cpp.
The geometry is isolated in a file with the extension '.geom' and included
(via '#include') in the main '.nff' file. The latter holds the surface
properties for all the geometry as well as the viewing specification.
This allows for the changing of the shading or viewing properties while
editing small ('.nff') files.
If '-g' is specified, only the '.geom' file is created, preserving the
current '.nff' file. The '-g' flag can be specified only with '-c'.
In practice, it may be useful to create a low resolution approximation
of the model, change viewing/shading parameters in the '.nff' file until
a good view and/or surface quality is found, and then run Irit2Nff once more
to create a high resolution approximation of the geometry using '-g'.
Example:
irit2nff -c -l -F 0 8 b58.itd
creates b58.nff and b58.geom with low resolution (FineNess of 5).
Once done with parameter setting, a fine approximation of the model can
be created with:
irit2nff -c -l -g -F 0 64 b58.itd
which will only recreate b58.geom (because of the -g option).
One can overwrite the viewing matrix by appending a new matrix in the
end of the command line, created by a display device:
One can specify surface qualities for individual surfaces of a model.
Several such attributes are supported by Irit2Nff and can be set within
IRIT. See also the ATTRIB IRIT command.
If a certain surface should be finer/coarser than the rest of the
scene, one can set a "resolution" attribute which specifies the
relative FineNess resolution of this specific surface. Further,
"u_resolution" and "v_resolution" might be similarly used to set
relative resolution for the u or v direction only.
The "crv_resolution" attribute controls the relative fineness of curves
as polylines. The "num_of_isolines" attribute controls the relative number
of isoparametric curves.
Example:
attrib( srf1, "resolution", 2 );
will force srf1 to have twice the default resolution, as set via the '-f'
flag.
Almost flat patches are converted to polygons. The rectangle can be
converted into two polygons (by subdividing along one of its diagonals) or
into four by introducing a new point at the center of the patch. This
behavior is controlled by the '-4' flag, but can be overwritten for
individual surfaces by setting a "twoperflat" or a "fourperflat" attribute.
NFF specific properties are controlled via the following attributes:
"kd", "ks", "shine", "trans", "index". Refer to the NFF manual for detail.
Surface color is controlled on two levels. If the object has an RGB
attribute, it is used. Otherwise, a color, as set via the IRIT COLOR
command, is used if set.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-n: Vertex Normals - Dumps the normals of the vertices with the
coordinates.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-E VrtxEps: Epsilon to consider two vertices same.
-o OutName: Name of output file. By default the output goes to
stdout.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-T: Talkative mode. Prints processing information.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-C: Constructs bicubic Bezier patches whenever possible as POVRAY
supports this type of surface. Polynomial Bezier surfaces of
orders up to and including bicubic (order 4, degree 3) are degree
raised to bicubic. Piecewise polynomials B-spline surfaces are
split into Bezier patches. Higher order surfaces and rational
surfaces are always converted into polygons.
-F PolygonOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4, -C, and -l.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-o OutName: Name of output file. By default the name of the first data
file from the DFiles list is used. See below on the output
files.
-g: Generates the geometry file only. See below.
-p Zmin Zmax: Sets the ratios between the depth cue and the width of
the dumped polylines. See also -P. Closer lines will be drawn
wider.
-P: Forces dumping polygons as polylines with thickness controlled
by -p.
-M: If -P (see -P and -p), then convert the control mesh/polygon
to polylines which are represented as a sequence of truncated
cones.
-T: Talkative mode. Prints processing information.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-I #UIso[:#VIso[:#WIso]]: Specifies the number of isolines per
surface/trivariate, per direction. If #VIso or #WIso is not
specified, #UIso is used for #VIso etc.
-s ObjSeq#: Sets object sequence number if there is no object name.
Default 1.
-i Includes: Expands the comma's separated list of POVRAY include
file names into POVRAY include commands at the beginning of the
created POVRAY output file.
Irit2pov converts freeform surfaces into polygons in a format that can
be used by the POVRAY ray tracing program.
Two files are created, one with a '.geom' extension and
one with a '.pov' extension. Since the number of polygons can be extremely
large, the geometry is isolated in the '.geom' file and is included
(via '#include') in the main '.pov' file. The latter holds the surface
properties for all the geometry as well as viewing and POVRAY specific
commands. This allows for the changing of the shading or the viewing
properties while editing small ('.pov') files.
If '-g' is specified, only the '.geom' file is created, preserving the
current, possibly manually modified, '.pov' file.
In practice, it may be useful to create a low resolution approximation
of the model, change the viewing/shading parameters in the '.pov' file until
a good view and/or surface quality is found, and then run Irit2pov once more
to create a high resolution approximation of the geometry using '-g'.
Example:
irit2pov -l -F 0 5 b58.itd
creates b58.pov and b58.geom with low resolution (FineNess of 5).
At such low resolution it may very well happen that triangles will have
normals "over the edge" since a single polygon may approximate a highly
curved surface.
One can ray trace this scene using a command similar to:
POVRAY -Q0 +Ib58
Once done with a parameter setting for POVRAY, a fine approximation of the
model can be created with:
irit2pov -l -g -F 0 64 b58.itd
which will only recreate b58.geom (because of the -g option).
Interesting effects can be created using the depth cue support and polyline
conversion of irit2pov. For example,
irit2pov -P -p -0.0 0.5 solid1.itd
will dump solid1 as a set of polylines (represented as truncated cones in
POVRAY) with varying thickness according to the z depth. Another example
is
irit2pov -P -p -0.1 1.0 saddle.itd
which dumps the isolines extracted from the saddle surface with varying
thickness.
Each time a data file is saved in IRIT, it can be saved with the
viewing matrix of the last INTERACT by saving the VIEW_MAT object as well.
I.e.:
save( "b58", b58 );
However, one can overwrite the viewing matrix by appending a new matrix
in the end of the command line, created by the display devices:
where irit.imd is the viewing matrix created by xglmdrvs. The output name,
by default, is the last input file name, so you might want to provide an
explicit name with the -o flag.
One can specify surface qualities for individual surfaces of a model.
Several such attributes are supported by Irit2pov and can be set within
IRIT. See also the ATTRIB IRIT command.
If a certain surface should be finer/coarser than the rest of the
scene, one can set a "resolution" attribute which specifies the
relative FineNess resolution of this specific surface. Further,
"u_resolution" and "v_resolution" might be similarly used to set
relative resolution for the u or v direction only.
The "crv_resolution" attribute controls the relative fineness of curves
as polylines. The "num_of_isolines" attribute controls the relative number
of isoparametric curves.
Example:
attrib( srf1, "resolution", 2 );
will force srf1 to have twice the default resolution as set via the '-f'
flag.
Almost flat patches are converted to polygons. The rectangle can be
converted into two polygons (by subdividing along one of its diagonals) or
into four by introducing a new point at the patch center. This behavior is
controlled by the '-4' flag, but can be overwritten for individual surfaces
by setting "twoperflat" or "fourperflat".
POVRAY also supports bicubic Bezier patches and the '-C' option of
irit2pov supports that. In such a case, the resolution that is requested
from POVRAY to polygonize these patches approximately follows the resolution
as selected via the '-F' flag of irit2pov. Nevertheless, one can
override the requested resolution via the "steps", "u_steps", and "v_steps"
attributes to irit2pov data files that are transferred directly to
POVRAY's bicubic Bezier patches. The "steps" attributes sets both
"u_steps" and "v_steps".
While the program has a default for lighting which is a point light
source at (1, 2, 10), one can overwrite this default. A POINT_TYPE
object with LIGHT_SOURCE attribute in the data stream denotes a
light source. If irit2pov detects one or more light sources in the
input stream, the default light sources are not created. A point
light source can be colored, when an RGB attribute will set its
color.
POVRAY specific properties are controlled via the following attributes:
"ambient", "diffuse", "brilliance", "phong", "phong_size", "specular",
"roughness", "metallic", "reflection", "crand", "conserve_energy",
"irid", "ior", "caustics", "dispersion", "dispersion_samples",
"fade_distance", "fade_power", "fade_color".
One can prescribe a whole property block of POV attributes via the
"texture", "pigment", "finish", "halo", and "normal". The values of this
attributes must be strings as they are copied verbatim. Refer to POVRAY's
manual for their exact meaning.
Surface color is controlled on two levels. If the object has an RGB
attribute, it is used. Otherwise a color as set via the IRIT COLOR
command is used, if set.
Example:
attrib( tankBody, "rgb", "244,164,96" );
Transparency is controlled via the "transp" attribute, with values
between zero and one.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-s Size: Controls the size of the postscript output in inches.
Default is to fill the entire screen.
-I #UIso[:#VIso[:#WIso]]: Specifies the number of isolines per
surface/trivariate, per direction. If #VIso or #WIso is not
specified, #UIso is used for #VIso etc.
-F PolygonOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-M: Dumps the control mesh/polygon as well.
-G: Dumps the curve/surface (as freeform geometry). Default. See -I,
-C, -f for control on polyline approximation.
-P: Dumps the curve/surface (as polygons). See -F, -l, -4 for control
on polygonal approximation.
-W #LineWidth: Sets the line drawing width in inches. Default is
as thin as possible. This option will overwrite only those objects
that do not have a "width" attribute. See also -d. If LineWidth
is negative, its absolute value is used to scale the current width
of the object if it has one, or the default width otherwise.
-w WidenLen WidenWidth: Widens the end points of polylines if they
should be made wider, and if so, to what width.
-b R G B: Sets a colored background. RGB are three integers prescribing
the Red, Green, and Blue coefficients. If there is no -c (i.e. a gray
level drawing), this color is converted to a gray level using RGB to
T.V. Y(IQ) channel conversion.
-B X1 Y1 X2 Y2: Clips the drawing area outsize the bounding box
from (X1, Y1) to (X2, Y2).
-c: Creates a color postscript file.
-C: Curve mode. Dumps freeform curves and surfaces as cubic
Bezier curves. Higher order curves and surfaces and/or rationals are
approximated by cubic Bezier curves. This option generates data
files that are roughly a third of piecewise linear postscript files
(by disabling this feature, -C-), but it takes a longer time to compute.
-T: Talkative mode. Prints processing information.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-N FontName: Sets the font to use when dumping text out of string
objects.
-i: Internal edges (created by IRIT) - the default is not to
display them, and this option will force displaying them as well.
-o OutName: Name of output file. Default is stdout.
-d [Zmin Zmax]: Sets the ratios between the depth cue and the width of
the dumped data. See also -W, -p. Closer lines/points will be drawn
wider/larger. Zmin and Zmax are optional. The object's bounding
box is otherwise computed and used.
-D [Zmin Zmax]: Same as -d, but depth cue the color or gray scale
instead of width. You might need to consider the sorting option
of the illustrt tool (-s of illustrt) for proper drawings.
Only one of -d and -D can be used.
-p PtType PtSize: Specifies the way points are drawn.
PtType can be one of H, F, C for Hollow circle, Full Circle, or
Cross. PtSize specifies the size of the point to be drawn, in inches.
Vectors will also be drawn as points, but with an additional thin
line to the origin. See also -d.
-u: Forces a unit matrix transformation, i.e. no transformation.
One can specify several attributes that affect the way the postscript
file is generated. The attributes can be generated within IRIT.
See also the ATTRIB IRIT command.
If a certain object should be thinner or thicker than the rest of the scene,
one can set a "width" attribute which specifies the line width in inches of
this specific object.
Example:
attrib( srf1, "width", 0.02 );
will force srf1 to have this width, instead of the default as set via the
'-W' flag.
If a (closed) object, a polygon, for example, needs to be filled, a "fill"
attribute should be set.
Example:
attrib( poly, "fill", true );
will fill poly.
If an object, a polygon, for example, needs to be painted/filled in a gray
level instead of black, a "gray" attribute should be set, with a value equal
to the gray level desired.
Example:
attrib( poly, "gray", 0.5 );
will draw/fill poly with %50 gray.
Dotted or dashed line effects can be created using a "dash" attribute which
is a direct postScript dash string. A simple form of this string is "[a b]"
in which a is the drawing portion (black) in inches, followed by b inches
of white space. See the postScript manual for more about the format of this
string. Here is an example for a dotted-dash line.
Surface color is controlled (for color postscript only - see -c) on two
levels. If the object has an RGB attribute, it is used. Otherwise, a color as
set via the IRIT COLOR command is used.
Example:
attrib( Ball, "rgb", "255,0,0" );
An object can be drawn as "tubes" instead of full lines. The ratio
between the inner and the outer radii of the tube is provided as the
TUBULAR attribute:
attrib( final, "tubular", 0.7 );
The depth cueing option of irit2ps could be disabled for individual
objects by placing an integer attribute "DepthCue" with the FALSE value:
attrib( final, "DepthCue", FALSE );
The "resolution" attribute controls the relative fineness of polygonal
approximation of surfaces, and "u_resolution" and "v_resolution" similarly
control this relative fineness along one parametric direction only.
The "crv_resolution" attribute controls the relative fineness of curves
as polylines. The "num_of_isolines" attribute controls the relative number
of isoparametric curves.
A string object can be dumped as text of a selected PS font (See -N). The
string position is set via a "StrPos" vector attribute (default to the
origin), and "StrScale" real attribute to control the string height in
world unit (default to 0.1). Text will always be dumped horizontally.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-G GridSize: Usually objects are grouped as lists of polygons.
This flag will coerce the usage of the RAYSHADE grid structure,
with GridSize being used as the grid size along the object
bounding box's largest dimension.
-F PolygonOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-o OutName: Name of output file. By default, the name of the first data
file from the DFiles list is used. See below on the output
files.
-g: Generates the geometry file only. See below.
-p Zmin Zmax: Sets the ratios between the depth cue and the width of
the dumped polylines. See also -P. Closer lines will be drawn
wider.
-P: Forces dumping polygons as polylines with thickness controlled
by -p.
-M: If -P (see -P and -p), will then convert the control mesh/polygon
to polylines which are represented as a sequence of truncated
cones.
-T: Talkative mode. Prints processing information.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-I #UIso[:#VIso[:#WIso]]: Specifies the number of isolines per
surface/trivariate, per direction. If #VIso or #WIso is not
specified, #UIso is used for #VIso etc.
-s ObjSeq#: Sets object sequence number if no object name. Default 1.
Irit2Ray converts freeform surfaces into polygons in a format that can
be used by the RAYSHADE ray tracing program.
Two files are created, one with a '.geom' extension and
one with a '.ray' extension. Since the number of polygons can be extremely
large, the geometry is isolated in the '.geom' file and is included
(via '#include') in the main '.ray' file. The latter holds the surface
properties for all the geometry as well as viewing and RAYSHADE specific
commands. This allows for the changing of the shading or viewing
properties while editing small ('.ray') files.
If '-g' is specified, only the '.geom' file is created, preserving the
current '.ray' file.
In practice, it may be useful to create a low resolution approximation
of the model, change the viewing/shading parameters in the '.ray' file until
a good view and/or surface quality is found, and then run Irit2Ray once more
to create a high resolution approximation of the geometry using '-g'.
Example:
irit2ray -l -F 0 5 b58.itd
creates b58.ray and b58.geom with low resolution (FineNess of 5).
At such low resolution it may very well happen that triangles will have
normals "over the edge" since a single polygon may approximate a highly
curved surface. That will cause RAYSHADE to issue an
"Inconsistent triangle normals" warning. This problem will not arise if
high fineness is used.
One can ray trace this scene using a command similar to:
RAYSHADE -p -W 256 256 b58.ray > b58.rle
Once done with the parameter setting for RAYSHADE, a fine approximation of the
model can be created with:
irit2ray -l -g -F 0 64 b58.itd
which will only recreate b58.geom (because of the -g option).
Interesting effects can be created using the depth cue support and polyline
conversion of irit2ray. For example,
irit2ray -G 5 -P -p -0.0 0.5 solid1.itd
will dump solid1 as a set of polylines (represented as truncated cones in
RAYSHADE) with varying thickness according to the z depth. Another example
is
irit2ray -G 5 -P -p -0.1 1.0 saddle.itd
which dumps the isolines extracted from the saddle surface with varying
thickness.
Each time a data file is saved in IRIT, it can be saved with the
viewing matrix of the last INTERACT by saving the VIEW_MAT object as well.
I.e.:
save( "b58", b58 );
However, one can overwrite the viewing matrix by appending a new matrix
in the end of the command line, created by the display devices:
where irit.imd is the viewing matrix created by os2drvs. The output name,
by default, is the last input file name, so you might want to provide an
explicit name with the -o flag.
One can specify surface qualities for individual surfaces of a model.
Several such attributes are supported by Irit2Ray and can be set within
IRIT. See also the ATTRIB IRIT command.
If a certain surface should be finer/coarser than the rest of the
scene, one can set a "resolution" attribute which specifies the
relative FineNess resolution of this specific surface. Further,
"u_resolution" and "v_resolution" might be similarly used to set
relative resolution for the u or v direction only.
The "crv_resolution" attribute controls the relative fineness of curves
as polylines. The "num_of_isolines" attribute controls the relative number
of isoparametric curves.
Example:
attrib( srf1, "resolution", 2 );
will force srf1 to have twice the default resolution, as set via the '-f'
flag.
Almost flat patches are converted to polygons. The rectangle can be
converted into two polygons (by subdividing along one of its diagonals) or
into four by introducing a new point at the patch center. This behavior is
controlled by the '-4' flag, but can be overwritten for individual surfaces
bu setting "twoperflat" or "fourperflat".
RAYSHADE specific properties are controlled via the following attributes:
"specpow", "reflect", "transp", "body", "index", and "texture". The value of
these attributes must be strings as it is copied verbatim. Refer to
RAYSHADE's manual for their meaning.
An optional scale can be prescribed to textures. In the above example
wooden legs' (that are also transparent...) texture is selected with
a texture scaling factor of 2.
Surface color is controlled on two levels. If the object has an RGB
attribute, it is used. Otherwise a color as set via the IRIT COLOR
command is used, if set.
-l: Linear - forces linear (degree two) surfaces to be approximated
as a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-o OutName: Name of output file. By default the name of the first data
file from DFiles list is used. See below on the output files.
-g: Generates the geometry file only. See below.
-T: Talkative mode. Prints processing information.
-t AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
Irit2Scn converts freeform surfaces and polygons into polygons in a format
that can be used by RTrace. Two files are created, one with a '.geom'
extension and one with a '.scn' extension. Since the number of polygons can
be extremely large, the geometry is isolated in the '.geom' file and is
included (via '#include') in the main '.scn' file. The latter holds the
surface properties for all the geometry as well as viewing and RTrace specific
commands. This allows for the changing of the shading or viewing
properties while editing small ('.scn') files.
If '-g' is specified, only the '.geom' file is created, preserving the
current '.scn' file.
In practice, it may be useful to create a low resolution approximation
of the model, adjust the viewing/shading parameters in the '.scn' file
until a good view and/or surface quality is found, and then run Irit2Scn once
more to create a high resolution approximation of the geometry using '-g'.
Example:
irit2scn -l -F 0 8 b58.itd
creates b58.scn and b58.geom with low resolution (FineNess of 5).
One can ray trace this scene after converting the scn file to a sff file,
using scn2sff provided with the RTrace package.
Once done with the parameter setting of RTrace, a fine approximation of the
model can be created with:
irit2scn -l -g -F 0 64 b58.itd
which will only recreate b58.geom (because of the -g option).
One can overwrite the viewing matrix by appending a new matrix
at the end of the command line, created by the display devices:
where irit.imd is the viewing matrix created by wntdrvs. The output name,
by default, is the last input file name, so you might want to provide an
explicit name with the -o flag.
One can specify surface qualities for individual surfaces of a model.
Several such attributes are supported by Irit2Scn and can be set within
IRIT. See also the ATTRIB IRIT command.
If a certain surface should be finer/coarser than the rest of the
scene, one can set a "resolution" attribute which specifies the
relative FineNess resolution of this specific surface. Further,
"u_resolution" and "v_resolution" might be similarly used to set
relative resolution for the u or v direction only.
The "crv_resolution" attribute controls the relative fineness of curves
as polylines. The "num_of_isolines" attribute controls the relative number
of isoparametric curves.
Example:
attrib( srf1, "resolution", 2 );
will force srf1 to have twice the default resolution, as set via the '-f'
flag.
Almost flat patches are converted to polygons. The patch can be converted
into two polygons (by subdividing along one of its diagonals) or into four
by introducing a new point at the patch center. This behavior is controlled
by the '-4' flag, but can be overwritten for individual surfaces by setting
"twoperflat" or "fourperflat".
RTrace specific properties are controlled via the following attributes:
"SCNrefraction", "SCNtexture", "SCNsurface. Refer to the RTrace manual for
their meaning.
Example:
attrib( srf1, "SCNrefraction", 0.3 );
Surface color is controlled on two levels. If the object has an RGB
attribute, it is used. Otherwise a color as set via IRIT COLOR command
is used, if set.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-r: Regularize and triangulate the input data if not regularized
and with triangles only to begin with.
-F PolygonOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-E VrtxEps: Tolerance of two adjacent verices to be considered the
same. Vertices that are considered the same are collapsed to an
identical location.
-s: Dumps each object as a separated "solid" - "endsolid" brackets.
-S: Dumps each object as a separated "solid" - "endsolid" brackets in
a separated stl file, with file name appended with numeric index.
-o OutName: Name of output file. By default the output goes to
stdout.
-m: More information flag.
-u: Forces a unit matrix. That is, input data are not
transformed at all.
Irit2Stl converts freeform surfaces and polygons into the STL
(Stereolithography) file format. The STL data should be a closed solid in
general but no such validity check is conducted by irit2stl.
-l: Linear - forces linear (degree two) surfaces to be approximated
by a single polygon along their linear direction.
Although most of the time linear direction can be represented exactly
using a single polygon, even a bilinear surface can have a freeform
shape (saddle-like) that is not representable using a single polygon.
Note that although this option will better emulate the surface shape,
it will create unnecessary polygons in cases where one is enough.
-4: Four - Generates four polygons per flat patch. Default is 2.
-u: Forces a unit matrix. That is, input data are not
transformed at all.
-F PolyOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-o OutName: Name of output file. By default the output goes to
stdout.
-s Size: Size in inches of the page. Default is 7 inches.
-t XTrans YTrans: X and Y translation. of the image. Default is (0, 0).
-I #UIso[:#VIso]: Specifies the number of isolines per surface, per
direction. If #VIso is not specified, #UIso is used for #VIso as
well.
-f PolyOpti SampTol: Controls the method used to approximate curves
into polylines. If PolyOpti == 0, equally spaced intervals are
used. For PolyOpti == 1, SampTol (real number) specifies the
maximal allowed deviation tolerance of the piecewise linear
approximation from the original curve.
Default is 0 64 (uniform sampling with 64 samples).
-F PolygonOpti FineNess: Optimality of polygonal approximation of
surfaces. See the variable POLY_APPROX_OPT for the meaning of
FineNess. See also -4. This enforces the dump of freefrom geometry
as polygons.
-M: Dumps the control mesh/polygon as well.
-G: Dumps the freeform geometry.
-T: Talkative mode. Prints processing information.
-a AnimTime: If the data contains animation curves, evaluate and
process the scene at time AnimTime.
-i: Internal edges (created by IRIT) - default is not to
display them, and this option will force their display.
-o OutName: Name of output file. By default, the name of the first data
file from DFiles list is used. See output files below.
obj2irit converts Wavefront's OBJ data files into IRIT data files.
The current version provides only partial support for the direct conversion
of freeform surfaces, mainly due to luck of examples of freeform surfaces
in obj format.
-b: The stl file is a binary stl.
-w: Perform an endian swap on all read data. Little vs. Big
Endian is supported for binary STL files only.
-n: Flip orientation of all polygons by flipping their normals.
-o OutName: Name of output file. By default, the output goes to
stdout.
-z: Print version number and current defaults.
This section describes the data file format used to exchange data between
IRIT and its accompanying tools.
[OBJECT {ATTRS} OBJNAME
[NUMBER n]
| [POINT x y z]
| [VECTOR x y z]
| [CTLPT POINT_TYPE {w} x y {z}]
| [STRING "a string"]
| [MATRIX m00 ... m03
m10 ... m13
m20 ... m23
m30 ... m33]
;A polyline should be drawn from first point to last. Nothing is drawn
;from last to first (in a closed polyline, last point is equal to first).
| [POLYLINE {ATTRS} #PTS ;#PTS = number of points.
[{ATTRS} x y z]
[{ATTRS} x y z]
.
.
.
[{ATTRS} x y z]
]
;Defines a closed planar region. Last point is NOT equal to first,
;and a line from last point to first should be drawn when the boundary
;of the polygon is drawn.
| [POLYGON {ATTRS} #PTS
[{ATTRS} x y z]
[{ATTRS} x y z]
.
.
.
[{ATTRS} x y z]
]
;Defines a "cloud" of points.
| [POINTLIST {ATTRS} #PTS
[{ATTRS} x y z]
[{ATTRS} x y z]
.
.
.
[{ATTRS} x y z]
]
;Defines a polygon triangle strip. At least 3 vertices are expected.
;Last point is NOT equal to first, and a line from last point to first
;should be drawn when the boundary of the polygon is drawn.
| [POLYSTRIP {ATTRS} #PTS
[{ATTRS} x y z]
[{ATTRS} x y z]
.
.
.
[{ATTRS} x y z]
]
;Defines an instance - a geometric reference (by name, SRF13 below)
;and a transformation matrix to apply to this geoemtry
| [INSTANCE SRF13
m00 ... m03
m10 ... m13
m20 ... m23
m30 ... m33]
;Defines a Bezier curve with #PTS control points. If the curve is
;rational, the rational component is introduced first.
| [CURVE BEZIER {ATTRS} #PTS POINT_TYPE
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a Bezier surface with #UPTS * #VPTS control points. If the
;surface is rational, the rational component is introduced first.
;Points are printed row after row (#UPTS per row), #VPTS rows.
| [SURFACE BEZIER {ATTRS} #UPTS #VPTS POINT_TYPE
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a Bezier triangular surface with (#PTS + 1) * #PTS / 2 control
;points, of order ORDER. If the surface is rational, the rational
;component is introduced first. Note #PTS holds number of points along
;an edge and is exactly equal to ORDER. Points are printed sequentially.
| [TRISRF BEZIER {ATTRS} #PTS POINT_TYPE
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a Bezier trivariate with #UPTS * #VPTS * #WPTS control
;points. If the trivariate is rational, the rational component is
;introduced first. Points are printed row after row (#UPTS per row),
;#VPTS rows, #WPTS layers (depth).
| [TRIVAR BEZIER {ATTRS} #UPTS #VPTS #WPTS POINT_TYPE
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a Bezier multivariate of #Dim dimensions (#Dim = 1 for a
;curve, #Dim = 2 for a surface, #Dim = 3 for a trivariate, etc.)
;with (Dim1#PTS * ... * Dim1#PTS) control points. If the multivariate
;is rational, the rational component is introduced first.
| [MULTIVAR BEZIER {ATTRS} #Dim Dim1#PTS ... DimN#PTS POINT_TYPE
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a B-spline curve of order ORDER with #PTS control points. If the
;curve is rational, the rational component is introduced first.
;Note that the length of knot vector is equal to #PTS + ORDER.
;If the curve is periodic, KVP prefix the knot vector that has length of
;'Length + Order + Order - 1'.
| [CURVE BSPLINE {ATTRS} #PTS ORDER POINT_TYPE
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;Knot vector
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a B-spline surface with #UPTS * #VPTS control points, of order
;UORDER by VORDER. If the surface is rational, the rational component
;is introduced first.
;Points are printed row after row (#UPTS per row), #VPTS rows.
;If the surface is periodic in some direction, KVP prefix the knot vector
;that has length of 'Length + Order + Order - 1'.
| [SURFACE BSPLINE {ATTRS} #UPTS #VPTS UORDER VORDER POINT_TYPE
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;U Knot vector
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;V Knot vector
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a B-spline triangular surface with (#PTS + 1) * #PTS / 2 control
;points, of order ORDER. If the surface is rational, the rational
;component is introduced first.
;Points are printed sequentially.
| [TRISRF BSPLINE {ATTRS} #PTS ORDER POINT_TYPE
[KV {ATTRS} kv0 kv1 kv2 ...] ;Knot vector
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a B-spline trivariate with #UPTS * #VPTS * #WPTS control
;points. If the trivariate is rational, the rational component is
;introduced first. Points are printed row after row (#UPTS per row),
;#VPTS rows, #WPTS layers (depth).
;If trivariate is periodic in some direction, KVP prefix the knot vector
;that has length of 'Length + Order + Order - 1'.
| [TRIVAR BSPLINE {ATTRS} #UPTS #VPTS #WPTS UORDER VORDER WORDER POINT_TYPE
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;U Knot vector
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;V Knot vector
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;W Knot vector
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a B-spline multivariate of #Dim dimensions (#Dim = 1 for a
;curve, #Dim = 2 for a surface, #Dim = 3 for a trivariate, etc.)
;with (Dim1#PTS * ... * Dim1#PTS) control points. If the multivariate
;is rational, the rational component is introduced first.
| [MULTIVAR BSPLINE {ATTRS} #Dim Dim1#PTS ... DimN#PTS POINT_TYPE
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;Dim1 Knot vector
.
.
.
[KV{P} {ATTRS} kv0 kv1 kv2 ...] ;DimN Knot vector
[{ATTRS} {w} x y z ...]
[{ATTRS} {w} x y z ...]
.
.
.
[{ATTRS} {w} x y z ...]
]
;Defines a trimmed surface. Encapsulates a surface (can be either a
;B-spline or a Bezier surface) and prescribes its trimming curves.
;There can be an arbitrary number of trimming curves (either Bezier
; or B-spline). Each trimming curve contains an arbitrary number of
;trimming curve segments, while each trimming curve segment contains
;a parameteric representation optionally followed by a Euclidean
;representation of the trimming curve segment.
| [TRIMSRF
[SURFACE ...
]
[TRIMCRV
[TRIMCRVSEG
[CURVE ...
]
]
.
.
.
[TRIMCRVSEG
[CURVE ...
]
]
]
.
.
.
[TRIMCRV
[TRIMCRVSEG
[CURVE ...
]
]
.
.
.
[TRIMCRVSEG
[CURVE ...
]
]
]
]
;Defines a model. A model contains a set of (trimmed) surfaces along
;with a set of trimming curves that are shared by (at most) two
;surfaces each.
;The trimming curves must form closed loops in each surface.
| [MODEL #TrimSrfs #TrimSegs
;A surface in the model holds a regular surface and a set of
;closed loops that defines the trimming loops of the surface.
[MDLTSRF #Loops ;Number of trimming loops
[SURFACE ...
]
;Each trimming loop is a list of trimming curve segments.
;If the index is negative, it denotes the traversal of the
;curve in reverse order.
[MDLLOOP trim seg's indices] ;Negative index - reversed
.
.
.
[MDLLOOP trim seg's indices] ;Negative index - reversed
]
.
.
.
[MDLTSRF #Loops ;Number of trimming loops
[SURFACE ...
]
[MDLLOOP trim seg's indices] ;Negative index - reversed
.
.
.
[MDLLOOP trim seg's indices] ;Negative index - reversed
]
;The trimming curve segments can hold a parameteric curve of the
;in first surface, a parametric curve in the second surface, and a
;a Euclidean representation, in this order. A 3 bits mask 'CurveMask'
;says what is available, as one bit per curve type.
;'#1stSrf' and '#2ndSrf' specify the two surfaces that share
;this boundary trimming curve, with 0 denoting no surface.
[MDLTSEG CurveMask #1stSrf #2ndSrf ;CurveMask = 5
[CURVE ...
]
[CURVE ...
]
]
.
.
.
[MDLTSEG CurveMask #1stSrf #2ndSrf ;CurveMask = 7
[CURVE ...
]
[CURVE ...
]
[CURVE ...
]
]
]
]
POINT_TYPE -> E1 | E2 | E3 | E4 | E5 | E6 | E7 | E8 | E9 |
P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9
ATTRS -> [ATTRNAME ATTRVALUE]
| [ATTRNAME]
| [ATTRNAME ATTRVALUE] ATTRS
Some notes:
* This definition for the text file is designed to minimize the
reading time and space. All information can be read without backward
or forward referencing.
* An OBJECT must never hold different geometry types or other entities.
I.e. CURVEs, SURFACEs, and POLYGONs must all be in different OBJECTs.
* Attributes should be ignored if not needed. The attribute list may have
any length and is always terminated by a token that is NOT '['. This
simplifies and disambiguates the parsing.
* Comments may appear between '[OBJECT ...]' blocks, or
immediately after OBJECT OBJNAME, and only there.
A comment body can be anything not containing the '[' or the
']' tokens (signals start/end of block). Some of the comments in
the above definition are illegal and appear there only for the sake
of clarity.
* It is preferable that geometric attributes such as NORMALs be saved on
the geometric structure level (POLYGON, CURVE or vertices) while graphical
and other attribures such as COLORs will be saved on the OBJECT level.
* Objects may be contained in other objects to an arbitrary level.
Here is an example that exercises most of the data format:
As with any program of more than one line, this is far from perfect.
Some limitations, as well as simplifications, are laid out below.
* If the intersection curve of two objects falls exactly on polygon
boundaries, for all polygons, the system will scream that the two objects
do not intersect at all. Try to move one by EPSILON into the other.
I probably should fix this one - it is supposed to be relatively easy.
* Avoid degenerate intersections that result in a point or a line.
They will probably cause wrong propagation of the inner and outer parts of
one object relative to another. Always extend your object beyond the
other object.
* If two objects have no intersection in their boundary, IRIT assumes
they are disjoint: a union simply combines them, and the other Boolean
operators return a NULL object. One should find a FAST way (3D Jordan
theorem) to find the relation between the two (A in B, B in A, A
disjoint B) and according to that, make a decision.
* Since the Boolean sum implementation constructs ruled surfaces with
uniform speed, it might return a somewhat incorrect answer, given
non-uniform input curves.
* The parser is out of hand and difficult to maintain. There are several
memory leaks there that one should fix.
* Rayshade complains a lot about degenerate polygons on irit2ray output.
To alleviate the problem, change the 'equal' macro in common.h in libcommon
of rayshade from EPSILON (1e-5) to 1e-7 or even lower.
* On the motif-based drivers (xmtdrvs etc.) clicking the mouse left and
right of the scale's button produces stepped transformations. This
step size is constant, and is not proportional to the distance between
the mouse's position and the position of the button. The reason for the
flaw is incorrect callback information returned from the scale in
repetitive mode.
* Binary data files are not documented, nor will they be. They might
change in the future and are in fact machine dependent. Hence, one
platform might fail to read another's binary data file.