首页 > 其他分享 >关于几何关系的代码说明

关于几何关系的代码说明

时间:2023-01-27 14:08:29浏览次数:67  
标签:polygon CGAL 代码 cg 说明 shape CALL 几何 CG


 关于几何关系的代码说明

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


 

 

 

 

 

标签:polygon,CGAL,代码,cg,说明,shape,CALL,几何,CG
From: https://blog.51cto.com/mapaware/6024047

相关文章