关于几何关系的代码说明
很多朋友需要这方面的资料,尤其是代码。我在陆续挖掘和整理的过程中,推翻了自己的开源的设想,形成了一个库——cgal32.dll(win32版,标准C库)。
一、这是基于几个原因:
1、库中个别地方代码采用了非商业开源的代码。我没有权利去公开它们。
2、只有不开源,我写的库大家才能免费使用。免除大家在道德和法律上面临的风险。
3、我做了大量工作,使自己本身免除道德和法律上的风险。
4、我声明我个人拥有这些库(编译后)的版权。今后任何个人和公司可以免费使用库,但不能声明拥有版权(或其他权利,包括出售库本身的权利)。我拥有库的源代码90%以上的版权。
二、关于cgal32.dll:
1、cgal32.dll与CGAL开源项目(www.cgal.org)没有任何关系,我也没看过和下载过它们的代码。
2、我使用ANSI C构建cgal32.dll库,以使其适应跨平台的需要。虽然目前只有WIN32版本,但以后会出LINUX等版本。
3、cgal32.dll主要完成空间几何的定义和运算。空间几何包括:点(点集)、线(多线)、面、体和面片。运算包括:Union、Difference、XOR、Intersection。
4、我的目标是把cgal32发展成为具有巨大潜力的解决人们在空间几何领域的诸多问题。
5、目前功能简单,还不提供下载,请谅解。
三、附部分头文件:
/*=============================================================================
cgal.h
cheungmine - All rights reserved
Sep. 8, 2010
==============================================================================*/
#ifndef _CGAL_H_INCLUDED
#define _CGAL_H_INCLUDED
#include < stdio.h >
#include < float .h >
#include < assert.h >
#include < memory.h >
#ifdef __cplusplus
extern " C " ... {
#endif
#ifdef CGAL_DLLEXPORT
# define CGAL_CALL __declspec(dllexport)
# define CGAL_CALL1(x) __declspec(dllexport) x
#endif
#ifndef CGAL_CALL
# define CGAL_CALL
#endif
#ifndef CGAL_CALL1
# define CGAL_CALL1(x) x CGAL_CALL /**//* For example: CGAL_CALL1(char*) foo();*/
#endif
#include "cgalerr.h"
#include "cgaldef.h"
/**//*==============================================================================
Library Functions - cgal.c
==============================================================================*/
void CGAL_CALL CGAL_init ( double epsilon ); /**//* must call this first of all in process-wide */
void CGAL_CALL CGAL_fini ( int reserved );
BOOL CGAL_CALL CGAL_blob_alloc ( cg_blob_t* blob );
void CGAL_CALL CGAL_blob_free ( cg_blob_t* blob );
double CGAL_CALL CGAL_get_epsilon(); /**//* Smallest such that x+epsilon != x */
int CGAL_CALL CGAL_get_precision(); /**//* decimal digits of precision */
CGAL_CALL1(const char*) CGAL_get_result_msg (int rcode);
RESULT CGAL_CALL CGAL_gzip_deflate ( cg_blob_t* in_plain, cg_blob_t* out_compressed ); /**//* compress */
RESULT CGAL_CALL CGAL_gzip_inflate ( cg_blob_t* in_compressed, cg_blob_t* out_decompressed ); /**//* uncompress */
/**//*==============================================================================
Polygon Functions - polygon.c
==============================================================================*/
BOOL CGAL_CALL CG_polygon_create ( cg_polygon *polygon );
void CGAL_CALL CG_polygon_destroy ( cg_polygon polygon );
void CGAL_CALL CG_polygon_clear ( cg_polygon polygon );
void CGAL_CALL CG_polygon_read ( FILE *infile, cg_polygon polygon );
void CGAL_CALL CG_polygon_write ( FILE *outfile, const cg_polygon polygon );
void CGAL_CALL CG_polygon_add_part ( cg_polygon polygon, const cg_vertexlist_t *part, int is_hole );
BOOL CGAL_CALL CG_polygon_is_null ( const cg_polygon polygon );
int CGAL_CALL CG_polygon_get_parts ( const cg_polygon polygon, int* part_holes /**//*callee alloc memory, NULL for retrieving parts count.*/);
int CGAL_CALL CG_polygon_get_vertices ( const cg_polygon polygon, int part_index, cg_vertex_t* vertices /**//*callee alloc memory, NULL for retrieving vertices count of part by index*/);
BOOL CGAL_CALL CG_polygon_part_is_hole ( const cg_polygon polygon, int part_index);
double CGAL_CALL CG_polygon_get_area ( const cg_polygon polygon );
double CGAL_CALL CG_polygon_get_length ( const cg_polygon polygon );
void CGAL_CALL CG_polygon_get_extent ( const cg_polygon polygon, cg_rect_t* extent );
BOOL CGAL_CALL CG_polygon_get_relation ( CG_RELATION rel, cg_polygon primary, cg_polygon secondary );
void CGAL_CALL CG_polygon_clip ( CG_OPCLIP opclip, cg_polygon subject, cg_polygon clip, cg_polygon result );
void CGAL_CALL CG_polygon_makeup ( cg_polygon polygon );
void CGAL_CALL CG_polygon_copy ( const cg_polygon inpl, cg_polygon outpl );
BOOL CGAL_CALL CG_polygon_pt_inside ( const cg_polygon polygon, const cg_vertex_t* pt );
void CGAL_CALL CG_polygon_to_tristrip ( cg_polygon polygon, cg_tristrip tristrip );
void CGAL_CALL CG_rect_to_polygon ( const cg_rect_t* rc, cg_polygon outpl );
void CGAL_CALL CG_circle_to_polygon (double center_xp, double center_yp, double radius, int max_circle_points, cg_polygon outpl);
void CGAL_CALL CG_line_make_buffer ( const cg_vertex_t* start, const cg_vertex_t* end, double distance, int mcp, cg_polygon out_pl );
void CGAL_CALL CG_vertices_make_buffer ( const cg_vertex_t* vertices, int num_vertices, double distance, int mcp, cg_polygon outpl );
void CGAL_CALL CG_polyline_make_buffer ( const cg_vertexlist_t* vl, double distance, int mcp, int closed, cg_polygon out_pl );
void CGAL_CALL CG_polygon_make_buffer ( cg_polygon inpl, double distance, int mcp, cg_polygon outpl );
/**//*==============================================================================
Trilist/Trinet/Trifan/Tristrip Functions - tri.c
==============================================================================*/
BOOL CGAL_CALL CG_tristrip_create ( cg_tristrip *tristrip );
void CGAL_CALL CG_tristrip_free ( cg_tristrip tristrip );
int CGAL_CALL CG_tristrip_get_strips ( const cg_tristrip tristrip );
int CGAL_CALL CG_tristrip_get_vertices ( const cg_tristrip tristrip, int strip_index, cg_vertex_t* vertices );
void CGAL_CALL CG_tristrip_clip ( CG_OPCLIP opclip, cg_polygon subject, cg_polygon clip, cg_tristrip result );
/**//*==============================================================================
Vertex and Line Functions - cgal.c
==============================================================================*/
double CGAL_CALL CG_vertex_get_dist ( const cg_vertex_t* p, const cg_vertex_t* q );
double CGAL_CALL CG_vertex_get_dist_sq ( const cg_vertex_t* p, const cg_vertex_t* q );
double CGAL_CALL CG_vertex_get_area ( const cg_vertex_t* vl, int num_vertices );
double CGAL_CALL CG_vertex_get_length ( const cg_vertex_t* vl, int num_vertices, int closed );
void CGAL_CALL CG_vertex_get_extent ( const cg_vertex_t* vl, int num_vertices, cg_rect_t* rc );
BOOL CGAL_CALL CG_vertex_is_equal ( const cg_vertex_t* p, const cg_vertex_t* q );
void CGAL_CALL CG_vertex_offset ( cg_vertex_t* vertices, int num_vertices, double dx, double dy );
BOOL CGAL_CALL CG_line_offset ( cg_vertex_t* start, cg_vertex_t* end, double d); /**//* d >0 to the left, d<0 to the right */
BOOL CGAL_CALL CG_vertices_pt_inside ( const cg_vertex_t* vertices, int num_vertices, const cg_vertex_t* pt );
/**//*==============================================================================
Rect Functions - cgal.c
==============================================================================*/
BOOL CGAL_CALL CG_rect_pt_inside ( const cg_rect_t *rect, const cg_vertex_t* pt );
BOOL CGAL_CALL CG_rect_is_overlapped ( const cg_rect_t* rc1, const cg_rect_t* rc2 );
BOOL CGAL_CALL CG_rect_clip_line ( const cg_rect_t* rect, cg_vertex_t* p, cg_vertex_t* q );
/**//*==============================================================================
Shape Functions - shape.c
==============================================================================*/
BOOL CGAL_CALL CG_shape_create ( cg_shape* shape );
void CGAL_CALL CG_shape_destroy ( cg_shape shape );
void CGAL_CALL CG_shape_clear ( cg_shape shape );
void CGAL_CALL CG_shape_read ( FILE *infile, cg_shape shape );
void CGAL_CALL CG_shape_write ( FILE *outfile, const cg_shape shape );
size_t CGAL_CALL CG_shape_get_byte_size ( const cg_shape shape );
RESULT CGAL_CALL CG_shape_read_blob ( const cg_blob_t* blob, cg_shape shape );
size_t CGAL_CALL CG_shape_write_blob ( cg_blob_t* blob, const cg_shape shape );
void CGAL_CALL CG_shape_copy ( const cg_shape in_shape, cg_shape out_shape );
BOOL CGAL_CALL CG_shape_is_null ( const cg_shape shape );
int CGAL_CALL CG_shape_get_type ( const cg_shape shape );
int CGAL_CALL CG_shape_get_parts ( const cg_shape shape, int* part_offsets );
int CGAL_CALL CG_shape_get_subparts ( const cg_shape shape, int part_index, int* subpart_offsets );
int CGAL_CALL CG_shape_get_vertices ( const cg_shape shape, int part_index, int subpart_index, cg_vertex_t* vertices );
int CGAL_CALL CG_shape_get_all_subparts ( const cg_shape shape, int* subpart_offsets );
int CGAL_CALL CG_shape_get_all_vertices ( const cg_shape shape, cg_vertex_t* vertices );
void CGAL_CALL CG_polygon_to_shape (cg_polygon pl, cg_shape sp);
void CGAL_CALL CG_shapeto_polygon (const cg_shape sp, cg_polygon pl);
/**//*==============================================================================
Object Functions - object.c
==============================================================================*/
/**//*==============================================================================
Gemoetry Functions - geometry.c
==============================================================================*/
BOOL CGAL_CALL CG_geometry_create (cg_geometry* g);
void CGAL_CALL CG_geometry_destroy (cg_geometry g);
void CGAL_CALL CG_geometry_clear (cg_geometry g);
BOOL CGAL_CALL CG_geometry_is_null (const cg_geometry g);
size_t CGAL_CALL CG_geometry_get_byte_size (const cg_geometry g);
size_t CGAL_CALL CG_geometry_write_blob (cg_blob_t* blob, const cg_geometry g);
RESULT CGAL_CALL CG_geometry_read_blob (const cg_blob_t* blob, const cg_geometry g);
RESULT CGAL_CALL CG_shape_to_geometry (const cg_shape sp, cg_geometry g);
/**//*=============================================================================*/
#ifdef __cplusplus
}
#endif
#endif /* ndef _CGAL_H_INCLUDED */
cgal.h
cheungmine - All rights reserved
Sep. 8, 2010
==============================================================================*/
#ifndef _CGAL_H_INCLUDED
#define _CGAL_H_INCLUDED
#include < stdio.h >
#include < float .h >
#include < assert.h >
#include < memory.h >
#ifdef __cplusplus
extern " C " ... {
#endif
#ifdef CGAL_DLLEXPORT
# define CGAL_CALL __declspec(dllexport)
# define CGAL_CALL1(x) __declspec(dllexport) x
#endif
#ifndef CGAL_CALL
# define CGAL_CALL
#endif
#ifndef CGAL_CALL1
# define CGAL_CALL1(x) x CGAL_CALL /**//* For example: CGAL_CALL1(char*) foo();*/
#endif
#include "cgalerr.h"
#include "cgaldef.h"
/**//*==============================================================================
Library Functions - cgal.c
==============================================================================*/
void CGAL_CALL CGAL_init ( double epsilon ); /**//* must call this first of all in process-wide */
void CGAL_CALL CGAL_fini ( int reserved );
BOOL CGAL_CALL CGAL_blob_alloc ( cg_blob_t* blob );
void CGAL_CALL CGAL_blob_free ( cg_blob_t* blob );
double CGAL_CALL CGAL_get_epsilon(); /**//* Smallest such that x+epsilon != x */
int CGAL_CALL CGAL_get_precision(); /**//* decimal digits of precision */
CGAL_CALL1(const char*) CGAL_get_result_msg (int rcode);
RESULT CGAL_CALL CGAL_gzip_deflate ( cg_blob_t* in_plain, cg_blob_t* out_compressed ); /**//* compress */
RESULT CGAL_CALL CGAL_gzip_inflate ( cg_blob_t* in_compressed, cg_blob_t* out_decompressed ); /**//* uncompress */
/**//*==============================================================================
Polygon Functions - polygon.c
==============================================================================*/
BOOL CGAL_CALL CG_polygon_create ( cg_polygon *polygon );
void CGAL_CALL CG_polygon_destroy ( cg_polygon polygon );
void CGAL_CALL CG_polygon_clear ( cg_polygon polygon );
void CGAL_CALL CG_polygon_read ( FILE *infile, cg_polygon polygon );
void CGAL_CALL CG_polygon_write ( FILE *outfile, const cg_polygon polygon );
void CGAL_CALL CG_polygon_add_part ( cg_polygon polygon, const cg_vertexlist_t *part, int is_hole );
BOOL CGAL_CALL CG_polygon_is_null ( const cg_polygon polygon );
int CGAL_CALL CG_polygon_get_parts ( const cg_polygon polygon, int* part_holes /**//*callee alloc memory, NULL for retrieving parts count.*/);
int CGAL_CALL CG_polygon_get_vertices ( const cg_polygon polygon, int part_index, cg_vertex_t* vertices /**//*callee alloc memory, NULL for retrieving vertices count of part by index*/);
BOOL CGAL_CALL CG_polygon_part_is_hole ( const cg_polygon polygon, int part_index);
double CGAL_CALL CG_polygon_get_area ( const cg_polygon polygon );
double CGAL_CALL CG_polygon_get_length ( const cg_polygon polygon );
void CGAL_CALL CG_polygon_get_extent ( const cg_polygon polygon, cg_rect_t* extent );
BOOL CGAL_CALL CG_polygon_get_relation ( CG_RELATION rel, cg_polygon primary, cg_polygon secondary );
void CGAL_CALL CG_polygon_clip ( CG_OPCLIP opclip, cg_polygon subject, cg_polygon clip, cg_polygon result );
void CGAL_CALL CG_polygon_makeup ( cg_polygon polygon );
void CGAL_CALL CG_polygon_copy ( const cg_polygon inpl, cg_polygon outpl );
BOOL CGAL_CALL CG_polygon_pt_inside ( const cg_polygon polygon, const cg_vertex_t* pt );
void CGAL_CALL CG_polygon_to_tristrip ( cg_polygon polygon, cg_tristrip tristrip );
void CGAL_CALL CG_rect_to_polygon ( const cg_rect_t* rc, cg_polygon outpl );
void CGAL_CALL CG_circle_to_polygon (double center_xp, double center_yp, double radius, int max_circle_points, cg_polygon outpl);
void CGAL_CALL CG_line_make_buffer ( const cg_vertex_t* start, const cg_vertex_t* end, double distance, int mcp, cg_polygon out_pl );
void CGAL_CALL CG_vertices_make_buffer ( const cg_vertex_t* vertices, int num_vertices, double distance, int mcp, cg_polygon outpl );
void CGAL_CALL CG_polyline_make_buffer ( const cg_vertexlist_t* vl, double distance, int mcp, int closed, cg_polygon out_pl );
void CGAL_CALL CG_polygon_make_buffer ( cg_polygon inpl, double distance, int mcp, cg_polygon outpl );
/**//*==============================================================================
Trilist/Trinet/Trifan/Tristrip Functions - tri.c
==============================================================================*/
BOOL CGAL_CALL CG_tristrip_create ( cg_tristrip *tristrip );
void CGAL_CALL CG_tristrip_free ( cg_tristrip tristrip );
int CGAL_CALL CG_tristrip_get_strips ( const cg_tristrip tristrip );
int CGAL_CALL CG_tristrip_get_vertices ( const cg_tristrip tristrip, int strip_index, cg_vertex_t* vertices );
void CGAL_CALL CG_tristrip_clip ( CG_OPCLIP opclip, cg_polygon subject, cg_polygon clip, cg_tristrip result );
/**//*==============================================================================
Vertex and Line Functions - cgal.c
==============================================================================*/
double CGAL_CALL CG_vertex_get_dist ( const cg_vertex_t* p, const cg_vertex_t* q );
double CGAL_CALL CG_vertex_get_dist_sq ( const cg_vertex_t* p, const cg_vertex_t* q );
double CGAL_CALL CG_vertex_get_area ( const cg_vertex_t* vl, int num_vertices );
double CGAL_CALL CG_vertex_get_length ( const cg_vertex_t* vl, int num_vertices, int closed );
void CGAL_CALL CG_vertex_get_extent ( const cg_vertex_t* vl, int num_vertices, cg_rect_t* rc );
BOOL CGAL_CALL CG_vertex_is_equal ( const cg_vertex_t* p, const cg_vertex_t* q );
void CGAL_CALL CG_vertex_offset ( cg_vertex_t* vertices, int num_vertices, double dx, double dy );
BOOL CGAL_CALL CG_line_offset ( cg_vertex_t* start, cg_vertex_t* end, double d); /**//* d >0 to the left, d<0 to the right */
BOOL CGAL_CALL CG_vertices_pt_inside ( const cg_vertex_t* vertices, int num_vertices, const cg_vertex_t* pt );
/**//*==============================================================================
Rect Functions - cgal.c
==============================================================================*/
BOOL CGAL_CALL CG_rect_pt_inside ( const cg_rect_t *rect, const cg_vertex_t* pt );
BOOL CGAL_CALL CG_rect_is_overlapped ( const cg_rect_t* rc1, const cg_rect_t* rc2 );
BOOL CGAL_CALL CG_rect_clip_line ( const cg_rect_t* rect, cg_vertex_t* p, cg_vertex_t* q );
/**//*==============================================================================
Shape Functions - shape.c
==============================================================================*/
BOOL CGAL_CALL CG_shape_create ( cg_shape* shape );
void CGAL_CALL CG_shape_destroy ( cg_shape shape );
void CGAL_CALL CG_shape_clear ( cg_shape shape );
void CGAL_CALL CG_shape_read ( FILE *infile, cg_shape shape );
void CGAL_CALL CG_shape_write ( FILE *outfile, const cg_shape shape );
size_t CGAL_CALL CG_shape_get_byte_size ( const cg_shape shape );
RESULT CGAL_CALL CG_shape_read_blob ( const cg_blob_t* blob, cg_shape shape );
size_t CGAL_CALL CG_shape_write_blob ( cg_blob_t* blob, const cg_shape shape );
void CGAL_CALL CG_shape_copy ( const cg_shape in_shape, cg_shape out_shape );
BOOL CGAL_CALL CG_shape_is_null ( const cg_shape shape );
int CGAL_CALL CG_shape_get_type ( const cg_shape shape );
int CGAL_CALL CG_shape_get_parts ( const cg_shape shape, int* part_offsets );
int CGAL_CALL CG_shape_get_subparts ( const cg_shape shape, int part_index, int* subpart_offsets );
int CGAL_CALL CG_shape_get_vertices ( const cg_shape shape, int part_index, int subpart_index, cg_vertex_t* vertices );
int CGAL_CALL CG_shape_get_all_subparts ( const cg_shape shape, int* subpart_offsets );
int CGAL_CALL CG_shape_get_all_vertices ( const cg_shape shape, cg_vertex_t* vertices );
void CGAL_CALL CG_polygon_to_shape (cg_polygon pl, cg_shape sp);
void CGAL_CALL CG_shapeto_polygon (const cg_shape sp, cg_polygon pl);
/**//*==============================================================================
Object Functions - object.c
==============================================================================*/
/**//*==============================================================================
Gemoetry Functions - geometry.c
==============================================================================*/
BOOL CGAL_CALL CG_geometry_create (cg_geometry* g);
void CGAL_CALL CG_geometry_destroy (cg_geometry g);
void CGAL_CALL CG_geometry_clear (cg_geometry g);
BOOL CGAL_CALL CG_geometry_is_null (const cg_geometry g);
size_t CGAL_CALL CG_geometry_get_byte_size (const cg_geometry g);
size_t CGAL_CALL CG_geometry_write_blob (cg_blob_t* blob, const cg_geometry g);
RESULT CGAL_CALL CG_geometry_read_blob (const cg_blob_t* blob, const cg_geometry g);
RESULT CGAL_CALL CG_shape_to_geometry (const cg_shape sp, cg_geometry g);
/**//*=============================================================================*/
#ifdef __cplusplus
}
#endif
#endif /* ndef _CGAL_H_INCLUDED */
/*
=============================================================================
cgaldef.h
cgaldef.h
cheungmine - All rights reserved
Sep. 8, 2007
============================================================================= */
#ifndef _CGALDEF_H_INCLUDED
#define _CGALDEF_H_INCLUDED
#ifndef CG_PI
#define CG_PI 3.1415926535897932384626433832795
#endif
#ifndef CG_HFPI
#define CG_HFPI 1.5707963267948966192313216916398
#endif
#ifndef CG_BIPI
#define CG_BIPI 6.283185307179586476925286766559
#endif
#ifndef TRUE
#define FALSE 0
#define TRUE 1
#endif
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned int size_t;
/* =============================================================================
Opaque Struct Handles
============================================================================= */
typedef struct _cg_polygon_t * cg_polygon;
typedef struct _cg_trilist_t * cg_trilist;
typedef struct _cg_trinet_t * cg_trinet;
typedef struct _cg_trifan_t * cg_trifan;
typedef struct _cg_tristrip_t * cg_tristrip;
typedef struct _cg_trilistZ_t * cg_trilistZ;
typedef struct _cg_trinetZ_t * cg_trinetZ;
typedef struct _cg_trifanZ_t * cg_trifanZ;
typedef struct _cg_tristripZ_t * cg_tristripZ;
typedef struct _cg_shape_t * cg_shape;
typedef struct _cg_arclist_t * cg_arclist;
typedef struct _cg_arclistZ_t * cg_arclistZ;
typedef struct _cg_object_t * cg_object;
typedef struct _cg_patch_t * cg_patch;
typedef struct _cg_patchZ_t * cg_patchZ;
typedef struct _cg_geometry_t * cg_geometry;
/* =============================================================================
Public Types
============================================================================= */
/* shape type */
typedef enum
{
SHP_NULL = 0 , /* Null type */
SHP_POINT = 1 , /* Point type */
SHP_LINE = 2 , /* Line type */
SHP_POLYGON = 3 /* Polygon type */
} CG_SHAPETYPE;
/* arc type */
typedef enum
{
ARC_LINE = 1 ,
ARC_CIRCLE_P = 2 ,
ARC_CIRCLE_C = 3 ,
ARC_ELLIPSE = 4 ,
ARC_SPLINE = 10 ,
ARC_BEZIER = 20
} CG_ARCTYPE;
/* 3D Object Types - standard object primitives */
typedef enum
{
OBJ_BOX = 1 ,
OBJ_CONE = 2 ,
OBJ_SPERE = 3 ,
OBJ_HEMISPHERE = 4 ,
OBJ_GEOSPHERE = 5 ,
OBJ_CYLINDER = 6 ,
OBJ_TUBE = 7 ,
OBJ_TORUS = 8 ,
OBJ_PYRMID = 9 ,
OBJ_PLANE = 10
} CG_OBJECTTYPE;
/* extended object primitives */
typedef enum
{
OBJEX_ELLIPSOID = 16 ,
OBJEX_OVAL = 17 ,
OBJEX_HEDRA = 18 ,
OBJEX_CHAMFERBOX = 19 ,
OBJEX_CHAMFERCYL = 20 ,
OBJEX_SPINDLE = 21 ,
OBJEX_GENGON = 22 ,
OBJEX_PRISM = 23 ,
OBJEX_HOSE = 24 ,
OBJEX_L_EXT = 25 ,
OBJEX_C_EXT = 26 ,
OBJEX_CAPSULE = 27 ,
OBJEX_TORUSKNOT = 28 ,
OBJEX_OILTANK = 29 ,
OBJEX_RINGWAVE = 30 ,
OBJ_TEAPOT = 31
} CG_OBJECTTYPE_EX;
/* Patch type */
typedef enum
{
PAT_TRILIST = 1 ,
PAT_TRINET = 2 ,
PAT_TRIFAN = 3 ,
PAT_TRISTRIP = 4
} CG_PATCHTYPE;
/* 3D Patch type */
typedef enum
{
PAT_TRILISTZ = 5 ,
PAT_TRINETZ = 6 ,
PAT_TRIFANZ = 7 ,
PAT_TRISTRIPZ = 8
} CG_PATCHZTYPE;
/* Geometry type */
typedef enum
{
GT_NULL = 0 ,
GT_SHAPE = 1 ,
GT_VERTEX = 2 ,
GT_VERTEXZ = 3 ,
GT_POLYLINE = 4 ,
GT_POLYLINEZ = 5 ,
GT_POLYGON = 6 ,
GT_ARCLIST = 7 , /* Compound arc line */
GT_ARCLISTZ = 8 , /* Compound arc with z */
GT_PATCH = 9 ,
GT_PATCHZ = 10 ,
GT_OBJECT = 11 /* Object */
} CG_GEOMETRYTYPE;
/* =============================================================================
Enum Constants
============================================================================= */
typedef enum /* Set operation type */
{
CG_DIFF, /* Difference */
CG_INT, /* Intersection */
CG_XOR, /* Exclusive or */
CG_UNION /* Union */
} CG_OPCLIP;
typedef enum /* relationships */
{
REL_CONTAIN = 0 , /* TRUE if the primary shape wholly contains the secondary shape */
REL_CROSS = 1 , /* TRUE if the intersection of the interiors is a lower dimension than the maximum dimension of the two shapes */
REL_DISJOINT = 2 , /* TRUE if the intersection of two shapes is empty */
REL_EQUAL = 3 , /* TRUE if the two supplied shapes are identical */
REL_OVERLAP = 4 , /* TRUE if the intersection of two shapes results in an object of the same geometric dimension */
REL_TOUCH = 5 , /* TRUE if the two supplied shapes share a common boundary */
REL_WITHIN = 6 /* TRUE if primary_shape is wholly contained within secondary_shape */
} CG_RELATION;
/* =============================================================================
Public Struct Types
============================================================================= */
/* Vertex structure */
typedef struct
{
union{
struct { double x, y; };
double _v[ 2 ];
};
} cg_vertex_t, cg_point_t;
/* Line structure */
typedef struct
{
union{
struct { double x1, y1, x2, y2; };
struct { cg_point_t start, end; };
cg_point_t _p[ 2 ];
double _v[ 4 ];
};
} cg_edge_t, cg_line_t;
/* Vertex list structure */
typedef struct
{
int num_vertices; /* Number of vertices in list */
cg_vertex_t * vertex; /* Vertex array pointer */
} cg_vertexlist_t, cg_pointlist_t, cg_polyline_t;
/* rectangle type */
typedef struct
{
union{
struct {
union{
struct { double min_x, min_y; };
cg_vertex_t _min;
};
union{
struct { double max_x, max_y; };
cg_vertex_t _max;
};
};
double _v[ 4 ];
};
} cg_rect_t;
/* 3D rect - box type */
typedef struct
{
union{
struct {
union{
struct { double min_x, min_y, max_x, max_y; };
cg_rect_t _rc;
};
double min_z, max_z;
};
double _v[ 6 ];
};
} cg_rectZ_t, cg_box_t;
/* circleCR struct */
typedef struct
{
union{
struct { double xp, yp; };
cg_vertex_t _cp;
};
double r;
} cg_circle_t;
/* Point structure */
typedef struct
{
union{
struct {
union{
struct { double x, y; };
cg_vertex_t _p;
};
double z;
};
double _v[ 3 ];
};
} cg_vector_t, cg_pointZ_t, cg_vertexZ_t;
/* 3D Vertex list structure */
typedef struct
{
int num_vertices; /* Number of vertices */
cg_vector_t * vertex; /* Vertex array */
} cg_vectorlist_t, cg_pointlistZ_t, cg_vertexlistZ_t;
/* Triangle struct */
typedef struct
{
union{
struct { cg_vertex_t v0, v1, v2; };
cg_vertex_t _v[ 3 ];
};
} cg_tri_t;
/* 3D Triangle struct */
typedef struct
{
union{
struct { cg_vector_t v0, v1, v2; };
cg_vector_t _v[ 3 ];
};
cg_vector_t n; /* Normal vector */
} cg_triZ_t;
/* triangle vertex index struct */
typedef struct
{
union{
struct { int i0, i1, i2; };
int _vi[ 3 ];
};
} cg_triindex_t;
/* BLOB struct */
typedef struct
{
BYTE * chunk;
size_t size;
} cg_blob_t;
/* ============================================================================ */
#endif /* ndef _CGALDEF_H_INCLUDED */
Sep. 8, 2007
============================================================================= */
#ifndef _CGALDEF_H_INCLUDED
#define _CGALDEF_H_INCLUDED
#ifndef CG_PI
#define CG_PI 3.1415926535897932384626433832795
#endif
#ifndef CG_HFPI
#define CG_HFPI 1.5707963267948966192313216916398
#endif
#ifndef CG_BIPI
#define CG_BIPI 6.283185307179586476925286766559
#endif
#ifndef TRUE
#define FALSE 0
#define TRUE 1
#endif
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned int size_t;
/* =============================================================================
Opaque Struct Handles
============================================================================= */
typedef struct _cg_polygon_t * cg_polygon;
typedef struct _cg_trilist_t * cg_trilist;
typedef struct _cg_trinet_t * cg_trinet;
typedef struct _cg_trifan_t * cg_trifan;
typedef struct _cg_tristrip_t * cg_tristrip;
typedef struct _cg_trilistZ_t * cg_trilistZ;
typedef struct _cg_trinetZ_t * cg_trinetZ;
typedef struct _cg_trifanZ_t * cg_trifanZ;
typedef struct _cg_tristripZ_t * cg_tristripZ;
typedef struct _cg_shape_t * cg_shape;
typedef struct _cg_arclist_t * cg_arclist;
typedef struct _cg_arclistZ_t * cg_arclistZ;
typedef struct _cg_object_t * cg_object;
typedef struct _cg_patch_t * cg_patch;
typedef struct _cg_patchZ_t * cg_patchZ;
typedef struct _cg_geometry_t * cg_geometry;
/* =============================================================================
Public Types
============================================================================= */
/* shape type */
typedef enum
{
SHP_NULL = 0 , /* Null type */
SHP_POINT = 1 , /* Point type */
SHP_LINE = 2 , /* Line type */
SHP_POLYGON = 3 /* Polygon type */
} CG_SHAPETYPE;
/* arc type */
typedef enum
{
ARC_LINE = 1 ,
ARC_CIRCLE_P = 2 ,
ARC_CIRCLE_C = 3 ,
ARC_ELLIPSE = 4 ,
ARC_SPLINE = 10 ,
ARC_BEZIER = 20
} CG_ARCTYPE;
/* 3D Object Types - standard object primitives */
typedef enum
{
OBJ_BOX = 1 ,
OBJ_CONE = 2 ,
OBJ_SPERE = 3 ,
OBJ_HEMISPHERE = 4 ,
OBJ_GEOSPHERE = 5 ,
OBJ_CYLINDER = 6 ,
OBJ_TUBE = 7 ,
OBJ_TORUS = 8 ,
OBJ_PYRMID = 9 ,
OBJ_PLANE = 10
} CG_OBJECTTYPE;
/* extended object primitives */
typedef enum
{
OBJEX_ELLIPSOID = 16 ,
OBJEX_OVAL = 17 ,
OBJEX_HEDRA = 18 ,
OBJEX_CHAMFERBOX = 19 ,
OBJEX_CHAMFERCYL = 20 ,
OBJEX_SPINDLE = 21 ,
OBJEX_GENGON = 22 ,
OBJEX_PRISM = 23 ,
OBJEX_HOSE = 24 ,
OBJEX_L_EXT = 25 ,
OBJEX_C_EXT = 26 ,
OBJEX_CAPSULE = 27 ,
OBJEX_TORUSKNOT = 28 ,
OBJEX_OILTANK = 29 ,
OBJEX_RINGWAVE = 30 ,
OBJ_TEAPOT = 31
} CG_OBJECTTYPE_EX;
/* Patch type */
typedef enum
{
PAT_TRILIST = 1 ,
PAT_TRINET = 2 ,
PAT_TRIFAN = 3 ,
PAT_TRISTRIP = 4
} CG_PATCHTYPE;
/* 3D Patch type */
typedef enum
{
PAT_TRILISTZ = 5 ,
PAT_TRINETZ = 6 ,
PAT_TRIFANZ = 7 ,
PAT_TRISTRIPZ = 8
} CG_PATCHZTYPE;
/* Geometry type */
typedef enum
{
GT_NULL = 0 ,
GT_SHAPE = 1 ,
GT_VERTEX = 2 ,
GT_VERTEXZ = 3 ,
GT_POLYLINE = 4 ,
GT_POLYLINEZ = 5 ,
GT_POLYGON = 6 ,
GT_ARCLIST = 7 , /* Compound arc line */
GT_ARCLISTZ = 8 , /* Compound arc with z */
GT_PATCH = 9 ,
GT_PATCHZ = 10 ,
GT_OBJECT = 11 /* Object */
} CG_GEOMETRYTYPE;
/* =============================================================================
Enum Constants
============================================================================= */
typedef enum /* Set operation type */
{
CG_DIFF, /* Difference */
CG_INT, /* Intersection */
CG_XOR, /* Exclusive or */
CG_UNION /* Union */
} CG_OPCLIP;
typedef enum /* relationships */
{
REL_CONTAIN = 0 , /* TRUE if the primary shape wholly contains the secondary shape */
REL_CROSS = 1 , /* TRUE if the intersection of the interiors is a lower dimension than the maximum dimension of the two shapes */
REL_DISJOINT = 2 , /* TRUE if the intersection of two shapes is empty */
REL_EQUAL = 3 , /* TRUE if the two supplied shapes are identical */
REL_OVERLAP = 4 , /* TRUE if the intersection of two shapes results in an object of the same geometric dimension */
REL_TOUCH = 5 , /* TRUE if the two supplied shapes share a common boundary */
REL_WITHIN = 6 /* TRUE if primary_shape is wholly contained within secondary_shape */
} CG_RELATION;
/* =============================================================================
Public Struct Types
============================================================================= */
/* Vertex structure */
typedef struct
{
union{
struct { double x, y; };
double _v[ 2 ];
};
} cg_vertex_t, cg_point_t;
/* Line structure */
typedef struct
{
union{
struct { double x1, y1, x2, y2; };
struct { cg_point_t start, end; };
cg_point_t _p[ 2 ];
double _v[ 4 ];
};
} cg_edge_t, cg_line_t;
/* Vertex list structure */
typedef struct
{
int num_vertices; /* Number of vertices in list */
cg_vertex_t * vertex; /* Vertex array pointer */
} cg_vertexlist_t, cg_pointlist_t, cg_polyline_t;
/* rectangle type */
typedef struct
{
union{
struct {
union{
struct { double min_x, min_y; };
cg_vertex_t _min;
};
union{
struct { double max_x, max_y; };
cg_vertex_t _max;
};
};
double _v[ 4 ];
};
} cg_rect_t;
/* 3D rect - box type */
typedef struct
{
union{
struct {
union{
struct { double min_x, min_y, max_x, max_y; };
cg_rect_t _rc;
};
double min_z, max_z;
};
double _v[ 6 ];
};
} cg_rectZ_t, cg_box_t;
/* circleCR struct */
typedef struct
{
union{
struct { double xp, yp; };
cg_vertex_t _cp;
};
double r;
} cg_circle_t;
/* Point structure */
typedef struct
{
union{
struct {
union{
struct { double x, y; };
cg_vertex_t _p;
};
double z;
};
double _v[ 3 ];
};
} cg_vector_t, cg_pointZ_t, cg_vertexZ_t;
/* 3D Vertex list structure */
typedef struct
{
int num_vertices; /* Number of vertices */
cg_vector_t * vertex; /* Vertex array */
} cg_vectorlist_t, cg_pointlistZ_t, cg_vertexlistZ_t;
/* Triangle struct */
typedef struct
{
union{
struct { cg_vertex_t v0, v1, v2; };
cg_vertex_t _v[ 3 ];
};
} cg_tri_t;
/* 3D Triangle struct */
typedef struct
{
union{
struct { cg_vector_t v0, v1, v2; };
cg_vector_t _v[ 3 ];
};
cg_vector_t n; /* Normal vector */
} cg_triZ_t;
/* triangle vertex index struct */
typedef struct
{
union{
struct { int i0, i1, i2; };
int _vi[ 3 ];
};
} cg_triindex_t;
/* BLOB struct */
typedef struct
{
BYTE * chunk;
size_t size;
} cg_blob_t;
/* ============================================================================ */
#endif /* ndef _CGALDEF_H_INCLUDED */