Conic sections are represented by the following generic structure

typedef struct conic { Ts_id ts_id; /* Tina structure identifier */ unsigned int type; unsigned int label; int filler1; double a, b, c, d, e, f; /* algebraic formula */ double theta, alpha, beta; struct vec2 center; int filler2; double t1, t2; /* conic params of p1 and p2 */ int branch; /* for hyperbola only */ List *props; /* property list */ } Conic;

In **conic** the arc covered by the curve is between angles **t1** and
**t2** in radians). All angles are positive with 0 along the
**x** axis
and *P/2 along the **y** axis. The arc goes from **t1** to **t2** in
strictly ascending order, **t1** will be less than 2 *P but
**t2** may
be larger than 2 *P if the arc passes back through the **x** axis.

In **conic** the implicit algebraic equation that represents its form is
given by
13#13
**theta** is the angle of the major axis, **alpha** and **beta** are
the lengths of the semi-major and semi-minor axis respectively, so the
rotated, translated standard form of the conic equation is
14#14 The conic **type** can b any one
of

ELLIPSE HYPERBOLA DEGENERATE

with obvious meanings. The field **branch** is used to differentiate which
part of the hyperbola the data lies on.

The covariance matrix for conic data is defined by

typedef struct conic_stat /* covariance matrix etc for conic */ { Ts_id ts_id; /* Tina structure identifier */ int filler; double x[5]; double d[5]; double u[5][5]; } Conic_stat;

The location of a conic section in 3D is made explicit using the following structure:

typedef struct conic3 { Ts_id ts_id; /* Tina structure identifier */ int type; struct conic *conic; /* describes the conic in the plane */ struct vec3 origin; /* origin point on plane */ struct vec3 ex, ey, ez; /* define x, y and z axes: ez = normal */ } Conic3;

The coordinate frame in which **conic** lies is at **origin** and has axis
**ex, ey,** and **ez.** Wh re the 2D conic lies in the **xy** plane.

Conic *conic_alloc(unsigned int type) Conic3 *conic3_alloc(unsigned int type) Conic *conic_make(int type, Vec2 center, double theta, double alpha, double beta, double t1, double t2, int branch) Conic3 *conic3_make(Conic * con2, Vec3 o, Vec3 ex, Vec3 ey, Vec3 ez) Conic *conic_copy(Conic * conic) Conic3 *conic3_copy(Conic3 * con3) void conic_free(Conic * conic) void conic3_free(Conic3 *con3) void conic_format(Conic *conic) void conic3_format(Conic3 *conic) void *conic_prop_get(Conic * conic, int type, int prop)

Obvious functions for manipulating conic geometry. Note how the naming
function differs from that of other geometry to reflect the fact that as well
as representing 2D geometry the Conic data structure is also part of the r
presentation of the

Conic3.

The functions **conic_copy, conic3_copy, conic_free** and **conic3_free** copy and free the property list see proplist description for
details). The functions **conic_format** and **conic3_format** produces
a standard formatted output of conic geometry using the standard Tina *format* facility. Usually directed to the top level text display window.

Conic *conic_5pt(Vec2 p1, Vec2 p2, Vec2 p3, Vec2 p4, Vec2 p5) Conic *conic_circ_3pt(Vec2 p1, Vec2 p2, Vec2 p3) Conic *conic_ellipse_5pt(Vec2 p1, Vec2 p2, Vec2 p3, Vec2 p4, Vec2 p5, double min_aratio) Conic *conic_ellipse_3pt(Vec2 p1, Vec2 v1, Vec2 p2, Vec2 v2, Vec2 p3, double min_aratio) Conic *conic_circ_3pt(Vec2 p1, Vec2 p2, Vec2 p3)

Functions for generating conics. Prefixes **conic_, conic_ellipse_** and
**conic_circ_** fit totally general conics, ellipses only and circles only
respectively. The **min_aratio** argument of **conic_ellipse_** fun
tions determines the ellipse aspect ratio below which an ellipse fit

is
replaced with a circle fit as is the case if the fit results in a hyperbola).

**conic_** and **conic_ellipse_** functions can take either 5 points as
arguments or 2 points with tangent unit direction vectors and an additional
point.

void conic_set_ends(Conic * conic, Vec2 p1, Vec2 p2, Vec2 pmid) Vec2 conic_point(Conic * conic, double t) Vec3 conic3_point(Conic3 * con3, double t) double conic_param(Conic * conic, Vec2 p) double conic3_param(Conic3 * con3, Vec3 p3)

Functions for relating position vectors and conic parameter values.

**conic_set_ends** sets conic end point parameter values **t1** and **t2.** respectively. The mid point **pmid** is used to identify the order of
& p1 and **p2** along the conic.

Other functions convert between parameter and point values.

void conic3_negate(Conic3 * con3) Conic3 *conic3_negative(Conic3 * con3) Conic *conic_proj(Conic * conic, Mat3 proj) void conic3_transform(Conic3 * conic, Transform3 trans) Bool conic3_coincident(Conic3 * c1, Conic3 * c2, double doterror, double poserror) Bool conic3_overlap(Conic3 * c1, Conic3 * c2, float *t1, float *t2)

Transformation functions for conic geometry. The negate functions change direction of the normal of a 3D conic the 3D locations of the end points are unchanged.

**conic_proj** performs a projecti e transformation of the geometry in **conic** according to the 3X3 projection matrix **proj_mat** and return a
pointer to the transformed version.

**conic3_transform** applies the rotation and translation **trans**
directly to the **conic** geomet y structure.

**conic3_coincident** checks if **c1** and **c2** are spatially
coincident within the allowed position and rotation errors **poserror** and
**roterror** respectively.