关于几何关系的代码说明

 关于几何关系的代码说明

很多朋友需要这方面的资料,尤其是代码。我在陆续挖掘和整理的过程中,推翻了自己的开源的设想,形成了一个库——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 */

 

/* =============================================================================
    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 */

 

 

 

 

 

你可能感兴趣的:(struct,vector,object,buffer,patch,distance)