gCAD3D 2.35
cirMoeb.c File Reference

curves (bsplines, conic sections, etc.) More...

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "../ut/ut_geo.h"
#include "../ut/ut_ox_base.h"
#include "../ut/func_types.h"
#include "../ut/ut_math.h"
#include "../ut/ut_TX.h"
#include "../ut/utemp.h"

Functions

int UCV_Touch3MCirsCase4 (ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT, Point2 *xp, Memspc *workSeg)
 
int UCV_Touch3MCirsCase3 (ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT, Point2 *tp, Memspc *workSeg)
 
int UCV_Touch3MCirsCase2 (int *nrt, ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT, Memspc *workSeg)
 
int UCV_Touch3MCirsCase1 (int *nrt, ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT, Point2 *tp, Memspc *workSeg)
 
int UCV_TouchCi2Lns (ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT)
 
int UCV_Touch3Lns (ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT)
 
int UCV_Touch2ConcCiMoebCir (int *nrt, ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT)
 
int UCV_LnTouchLnMoebCir (int *nrt, ObjGX *oxtT, Memspc *memSeg, ObjGX *ox1, ObjGX *ox2)
 
int UCV_TouchLnLnMoebCir (int *nrt, ObjGX *oxtT, Memspc *memSeg, ObjGX *oxT)
 
int UCV_Touch3MoebCirs (int *nrt, ObjGX *oxtT, Memspc *memSeg, ObjGX *oxiT, Memspc *workSeg)
 
int UCV_CiInvertMoebCir (ObjGX *oxi, Memspc *memSeg, ObjGX *ox, Point2 *ci, double ri)
 
int UCV_IntSectMoebCirs (Point2 *xp1, Point2 *xp2, ObjGX *ox1, ObjGX *ox2)
 
int UCV_CasesApollConfig (ObjGX *oxoT, Point2 *xp, ObjGX *oxiT)
 

Variables

const Point2 UT2D_PT_INFTY
 

Detailed Description

curves (bsplines, conic sections, etc.)

=====================================================
List_functions_start:
UCV_CasesApollConfig Cases <-- Apollonian configuration
UCV_FilterTouch3MCirs Filter <-- touching Moebius circles
UCV_IntSectMoebCirs Intersection <-- two Moebius circles
UCV_CiInvertMoebCir Invert at circle <-- Moebius circle
UCV_LnTouchLnMoebCir Touching lines <-- 1 line, 1 M-cir
UCV_OffSurCrv Offset surface curve <-- curve
UCV_TouchCi2Lns Touching circles <-- 1 circle & 2 unparallel lines
UCV_TouchLnLnMoebCir Touching M-cirs <-- 2 parallel lines, 1 M-cir
UCV_Touch2ConcCiMoebCir Touching M-cirs <-- 2 concentric M-cirs, 1 M-cir
UCV_Touch3Lns Touching circles <-- 3 pairwise unparallel lines
UCV_Touch3MCirsCase1 Touching Moebius circles <-- 3 M-circles - case 1
UCV_Touch3MCirsCase2 Touching Moebius circles <-- 3 M-circles - case 2
UCV_Touch3MCirsCase3 Touching Moebius circles <-- 3 M-circles - case 3
UCV_Touch3MCirsCase4 Touching Moebius circles <-- 3 M-circles - case 4
UCV_Touch3MoebCirs Touching Moebius circles <-- three Moebius circles
List_functions_end:
=====================================================

Function Documentation

int UCV_Touch3MCirsCase4 ( ObjGX oxtT,
Memspc memSeg,
ObjGX oxT,
Point2 xp,
Memspc workSeg 
)
UCV_Touch3MCirsCase4 Touching Moebius circles <-- 3 M-circles - case 4
Compute all 8 Moebius circles except points which touch three given
Moebius circles in case 4 - Apollonian configuration:
any two elements are intersecting in two different points &
all three elements have no common point.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
IN:
ObjGX *oxT ... 3 Moebius circles (in case 4 - Apoll config)
([0]...circle if xp == UT2D_PT_INFTY, element
not incident with xp if xp == finite)
Point2 *xp ... one of the intersection points
(=UT2D_PT_INFTY if existing)
Memspc *workSeg ... workspace
OUT:
ObjGX *oxtT ... touching Moebius circles (8)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
and workspace
Returncodes:
0 = OK
-1 = internal error
int UCV_Touch3MCirsCase3 ( ObjGX oxtT,
Memspc memSeg,
ObjGX oxT,
Point2 tp,
Memspc workSeg 
)
UCV_Touch3MCirsCase3 Touching Moebius circles <-- 3 M-circles - case 3
Compute all 4 Moebius circles except points which touch three given
Moebius circles in case 3 - Apollonian configuration:
any two elements are intersecting in two different points &
all three elements have 1 common point.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
IN:
ObjGX *oxT ... 3 Moebius circles (in case 3 - Apoll config)
Point2 *tp ... common point of all 3 elements
Memspc *workSeg ... workspace
OUT:
ObjGX *oxtT ... touching Moebius circles (4)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
and workspace
Returncodes:
0 = OK
-1 = internal error
int UCV_Touch3MCirsCase2 ( int *  nrt,
ObjGX oxtT,
Memspc memSeg,
ObjGX oxT,
Memspc workSeg 
)
UCV_Touch3MCirsCase2 Touching Moebius circles <-- 3 M-circles - case 2
Compute all Moebius circles except points (at most 8) which touch
three given Moebius circles in case 2 - Apollonian configuration:
there is no pair of touching elements &
there are two elements without common point.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
IN:
ObjGX *oxT ... 3 Moebius circles (in case 2 - Apoll config)
([0],[1]...2 elements without common point)
Memspc *workSeg ... workspace
OUT:
int *nrt ... number of touching Moebius circles (<=8)
ObjGX *oxtT ... touching Moebius circles (8)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
and workspace
Returncodes:
0 = OK
-1 = internal error
-2 = input error
-3 = out of space
int UCV_Touch3MCirsCase1 ( int *  nrt,
ObjGX oxtT,
Memspc memSeg,
ObjGX oxT,
Point2 tp,
Memspc workSeg 
)
UCV_Touch3MCirsCase1 Touching Moebius circles <-- 3 M-circles - case 1
Compute all Moebius circles except points (at most 6) which touch
three given Moebius circles in case 1 - Apollonian configuration:
there are two elements touching each other.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
IN:
ObjGX *oxT ... 3 Moebius circles (in case 1 - Apoll config)
Point2 *tp ... touch point of M-cirs [0],[1]
Memspc *workSeg ... workspace
OUT:
int *nrt ... number of touching Moebius circles (<=6)
ObjGX *oxtT ... touching Moebius circles (6)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
and workspace
Returncodes:
0 = OK
-1 = internal error
-2 = out of space
int UCV_TouchCi2Lns ( ObjGX oxtT,
Memspc memSeg,
ObjGX oxT 
)
UCV_TouchCi2Lns Touching circles <-- 1 circle & 2 unparallel lines
Compute all eight circles which touch a circle and two unparallel lines.
It is supposed that any two elements are intersecting in two different
points (meaning for the lines not to be parallel) and that all three
elements have no common point.
IN:
ObjGX *oxT ... circle ([0]) and two lines
OUT:
ObjGX *oxtT ... touching circles (8)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
Returncodes:
0 = OK
-1 = internal error
-2 = input error
-3 = out of space
int UCV_Touch3Lns ( ObjGX oxtT,
Memspc memSeg,
ObjGX oxT 
)
UCV_Touch3Lns Touching circles <-- 3 pairwise unparallel lines
Compute all four circles which touch three pairwise unparallel lines.
IN:
ObjGX *oxT ... 3 pairwise unparallel lines
OUT:
ObjGX *oxtT ... touching circles (4)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
Returncodes:
0 = OK
-1 = internal error
-2 = input error
-3 = out of space
int UCV_Touch2ConcCiMoebCir ( int *  nrt,
ObjGX oxtT,
Memspc memSeg,
ObjGX oxT 
)
UCV_Touch2ConcCiMoebCir Touching M-cirs <-- 2 concentric M-cirs, 1 M-cir
Compute all Moebius circles except points (at most 8) which touch
two concentric and one Moebius circle.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
All three elements are supposed to be different!
One of the two concentric Moebius circles might be a point (=circlecenter).
IN:
ObjGX *oxT ... 2 concentric M-cirs ([0],[1]) and 1 M-cir [2]
OUT:
int *nrt ... number of touching Moebius circles
ObjGX *oxtT ... touching Moebius circles (8)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
Returncodes:
0 = OK
-1 = internal error
-2 = input error
-3 = out of space
int UCV_LnTouchLnMoebCir ( int *  nrt,
ObjGX oxtT,
Memspc memSeg,
ObjGX ox1,
ObjGX ox2 
)
UCV_LnTouchLnMoebCir Touching lines <-- 1 line, 1 M-cir
Compute the lines (at most 2) which touch a line and a Moebius circle.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
IN:
ObjGX *ox1 ... line
ObjGX *ox2 ... Moebius circle
OUT:
int *nrt ... number of touching lines
ObjGX *oxtT ... touching lines (2)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
Returncodes:
0 = OK
-1 = input error
-2 = out of space
int UCV_TouchLnLnMoebCir ( int *  nrt,
ObjGX oxtT,
Memspc memSeg,
ObjGX oxT 
)
UCV_TouchLnLnMoebCir Touching M-cirs <-- 2 parallel lines, 1 M-cir
Compute all Moebius circles except points (at most 6) which touch two
parallel lines and one Moebius circle.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
All three elements are supposed to be different!
IN:
ObjGX *oxT ... 2 lines ([0],[1]) and 1 Moebius circle [2]
OUT:
int *nrt ... number of touching Moebius circles
ObjGX *oxtT ... touching Moebius circles (6)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
Returncodes:
0 = OK
-1 = internal error
-2 = input error
-3 = out of space
int UCV_Touch3MoebCirs ( int *  nrt,
ObjGX oxtT,
Memspc memSeg,
ObjGX oxiT,
Memspc workSeg 
)
UCV_Touch3MoebCirs Touching Moebius circles <-- three Moebius circles
Compute all Moebius circles except points (at most 8) which touch
three different Moebius circles.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
In case of three touching Moebius circles no solution is computed
(infinite number of possibilities).
There might be solutions touching one of the input elements at infinity!
IN:
ObjGX *oxiT ... 3 Moebius circles
Memspc *workSeg ... workspace
OUT:
int *nrt ... number of touching Moebius circles
ObjGX *oxtT ... touching Moebius circles (8)
Memspc *memSeg ... space for oxtT[i].data, i=0,1,...
and workspace
Returncodes:
0 = OK
-1 = internal error
int UCV_CiInvertMoebCir ( ObjGX oxi,
Memspc memSeg,
ObjGX ox,
Point2 ci,
double  ri 
)
UCV_CiInvertMoebCir Invert at circle <-- Moebius circle
Invert (=mirror) a Moebius circle at a circle.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
The function may be called with same parameter for ox and oxi.
IN:
ObjGX *ox ... Moebius circle
Point2 *ci ... center of inversion (!=UT2D_PT_INFTY)
double ri ... radius of inversion
OUT:
ObjGX *oxi ... inverse Moebius circle
Memspc *memSeg ... space for oxi->data
Returncodes:
1 = oxi is NO Moebius circle but INFINITE point
0 = OK
-1 = input error
-2 = out of space
int UCV_IntSectMoebCirs ( Point2 xp1,
Point2 xp2,
ObjGX ox1,
ObjGX ox2 
)
UCV_IntSectMoebCirs Intersection <-- two Moebius circles
Intersection of two different Moebius circles.
A Moebius circle is a circle, line or finite point in
(xy-plane & UT2D_PT_INFTY).
An intersection point may be UT2D_PT_INFTY.
IN:
ObjGX *ox1 ... Moebius circle 1
ObjGX *ox2 ... Moebius circle 2
OUT:
Point2 *xp1 ... intersection point 1
Point2 *xp2 ... intersection point 2
Returncodes:
0 = 0 intersection points
1 = 1 intersection point (*xp1 = *xp2)
2 = 2 intersection points (different!)
-1 = input error
int UCV_CasesApollConfig ( ObjGX oxoT,
Point2 xp,
ObjGX oxiT 
)
UCV_CasesApollConfig Cases <-- Apollonian configuration
IN:
ObjGX *oxiT ... 3 Moebius circles
OUT:
ObjGX *oxoT ... ordered elements of oxiT (3);
case 1: touching elements at indices 0,1;
case 2: elements without common point at indices 0,1;
case 4: at index 0: circle if xp == UT2D_PT_INFTY,
element not incident with xp if xp == finite.
Point2 *xp ... case 1: touching point of elements 0,1;
case 3: common point of all three elements;
case 4: one of the intersection points
(=UT2D_PT_INFTY if existing);
Returncodes:
1 = case 1
2 = case 2
3 = case 3
4 = case 4
5 = case 5
-1 = internal error

Variable Documentation

const Point2 UT2D_PT_INFTY