gCAD3D 2.40
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