Files
Extern/fist/Include/header.h
T
SaraP 05ca0d3376 Extern :
- aggiunto FIST 6.8 ( già modificato per integrazione nelle nostre librerie).
2025-03-04 16:37:58 +01:00

744 lines
18 KiB
C

/*****************************************************************************/
/* */
/* F I S T : Fast, Industrial-Strength Triangulation */
/* */
/*****************************************************************************/
/* */
/* (C) Martin Held */
/* (C) Universitaet Salzburg, Salzburg, Austria */
/* */
/* This code is not in the public domain. All rights reserved! Please make */
/* sure to read the full copyright statement contained in api_functions.cpp. */
/* */
/*****************************************************************************/
/* compute.cpp: */
#ifdef __cplusplus
extern "C" {
#endif
void Compute(global_struct *all);
#ifdef __cplusplus
}
#endif
void StatisticsFIST(global_struct *all);
#ifdef __cplusplus
extern "C" {
#endif
void ResetAll(global_struct *all);
#ifdef __cplusplus
}
#endif
/* memory.cpp: */
void *ReallocateArray(debug_memdef *mem, void *old_ptr, int number, size_t size,
const char var_name[]);
void FreeMemory(debug_memdef *mem, void **ptr, const char var_name[]);
void InitDebugMemDefaults(debug_memdef *mem);
unsigned machine_long ReportMaxNumberBytes(debug_memdef *mem);
unsigned machine_long ReportCurrNumberBytes(debug_memdef *mem);
boolean AllMemoryFreed(debug_memdef *mem);
void FreeMemory(debug_memdef *mem, void **ptr, const char var_name[]);
#ifdef DEBUG_MEMORY
boolean IndexOutOfBounds(debug_memdef *mem, void *array_ptr,
char var_name[], size_t size, int index);
#endif
/* data.cpp: */
void InitGlobalStruct(global_struct *all, rt_options *rt_opt,
boolean stand_alone);
void InitDataDefaults(datadef *data);
void ScaleData(global_struct *all);
#ifdef EXT_APPL_SITES
int StorePnt(datadef *data, double x, double y, eas_type ext_appl);
#else
int StorePnt(datadef *data, double x, double y);
#endif
void InitPnts(datadef *data, int number);
void FreePnts(datadef *data);
void DecrementPoints(datadef *data);
void SetBoundingBox(datadef *data, point *bb_min, point *bb_max);
void ComputeBoundingBox(datadef *data, listdef *list, list_ind ind, point *bb_min, point *bb_max);
boolean InPointsList(datadef *data, int index);
void InitStoragePnts(datadef *data, int number);
/* redraw.cpp: */
#ifdef GRAPHICS
void FreeGraphics(void);
void InitRedrawDefaults(redrawdef *redraw);
void ResetBufferData(redrawdef *redraw);
void Redraw(global_struct *all);
void AddPntToBuffer(redrawdef *redraw, int index, int color);
void AddEdgeToBuffer(redrawdef *redraw, int index1, int index2, int color);
void AddTriToBuffer(redrawdef *redraw, int index1, int index2, int index3,
int color1, int color2);
void DecrementPntBuffer(redrawdef *redraw);
void DecrementEdgeBuffer(redrawdef *redraw);
void FreeDrawingBuffer(redrawdef *redraw);
void ResetTriBuffer(redrawdef *redraw);
void UpdatePntEdgeBuffers(global_struct *all);
#ifdef PARTITION_FIST
void UpdateTriBuffer(global_struct *all);
#endif
#endif
/* graphics.cpp: */
#ifdef GRAPHICS
void UpdateScaleData(void);
void InitializeGraphics(int argc, char *argv[], global_struct *all);
void ProcessGraphicsEvents(void);
void DrawTri(point pnt1, point pnt2, point pnt3, int color1, int color);
void DrawSeg(point pnt1, point pnt2, int color);
void DrawPnt(point pnt, int color);
void ResetGraphicsData(void);
void DrawText(point pnt, int color, char* text);
#endif
/* io_parse.cpp: */
boolean ReadOptionalNumber(FILE *input, int *data);
boolean ReadOptionalCoord(FILE *input, double *xy);
boolean ReadNumber(FILE *input, int *data);
boolean ReadVectorData(FILE *input, double *xc, double *yc);
#ifdef EXT_APPL_SITES
boolean ReadPntData(FILE *input, double *xc, double *yc, eas_type *eas_data);
#else
boolean ReadPntData(FILE *input, double *xc, double *yc);
#endif
#ifdef EXT_APPL_SITES
void WritePntData(FILE *output, machine_double xc, machine_double yc,
eas_type *eas_data);
#else
void WritePntData(FILE *output, machine_double xc, machine_double yc);
#endif
void WriteNumber(FILE *output, int number);
void WriteVectorData(FILE *output, machine_double xc, machine_double yc);
/* io_basic.cpp: */
void InitIOListDefaults(iolistdef* iolist);
void ResetIOListData(iolistdef* iolist);
void Read2DInputData(global_struct *all);
void StartPoly(global_struct *all);
#ifdef EXT_APPL_SITES
void AddPolyVertex(global_struct *all, double xc1, double yc1, eas_type eas_data);
#else
void AddPolyVertex(global_struct *all, double xc1, double yc1);
#endif
void CloseCurrentPoly(global_struct *all);
void DXFStartPoly(global_struct *all);
void DXFAddPolyVertex(global_struct *all, double xc1, double yc1, double bulge);
void DXFCloseCurrentPoly(global_struct *all, double bulge);
void EnsureClosedPolygon(global_struct *all);
#ifdef EXT_APPL_SITES
int HandlePnt(global_struct *all,
double xc1, double yc1, eas_type ext_appl);
void HandleSeg(global_struct *all,
double xc1, double yc1, double xc2, double yc2,
eas_type ext_appl);
void HandleArc(global_struct *all,
double xc1, double yc1, double xc2, double yc2,
double xc3, double yc3, int attr, eas_type ext_appl);
#else
int HandlePnt(global_struct *all, double xc1, double yc1);
void HandleSeg(global_struct *all, double xc1, double yc1, double xc2, double yc2);
void HandleArc(global_struct *all,
double xc1, double yc1, double xc2, double yc2,
double xc3, double yc3, int attr);
#endif
/* io_dxf.cpp: */
void ReadDXFFile(global_struct *all);
void WriteDXFLWPoly_Vertex(global_struct *all, machine_double xc1, machine_double yc1,
machine_double bulge);
void WriteDXFLWPoly_Start(global_struct *all, boolean closed, int color);
void WriteDXFPoly_Vertex(global_struct *all, machine_double xc1, machine_double yc1,
machine_double bulge);
void WriteDXFPoly_Start(global_struct *all, boolean closed, int color);
void WriteDXFArc(global_struct *all,
machine_double xc1, machine_double yc1,
machine_double xc2, machine_double yc2,
machine_double xc3, machine_double yc3,
boolean ccw_flag, int color);
void WriteDXFCircle(global_struct *all,
machine_double xc1, machine_double yc1,
machine_double radius, int color);
void WriteDXFPoint(global_struct *all,
machine_double xc1, machine_double yc1, int color);
void WriteDXFLine(global_struct *all,
machine_double xc1, machine_double yc1,
machine_double xc2, machine_double yc2, int color);
void StartDXFFile(global_struct *all, char *file_name);
void FinishDXFFile(global_struct *all);
void WriteDXFPoly_End(global_struct *all);
/* io_misc.cpp: */
void CopyOutputData(vertexdef *vert, int *num_tri, int (*output_tri)[3]);
void CopyInputData2D(global_struct *all, int num_contours, int *num_vtx, double (*input_vtx)[2]);
void CopyInputData3D(global_struct *all, int num_contours, int *num_vtx, double (*input_vtx)[3]);
#ifdef __cplusplus
extern "C" {
#endif
void Help(void);
#ifdef __cplusplus
}
#endif
FILE *OpenFile(const char *file_name, const char *access);
void FIST_Warning(const char string[]);
void Copyright(void);
/* io_2D.cpp: */
void ReadPolygon(global_struct *all);
void ReadPoly(global_struct *all);
void ReadPolyLines(global_struct *all);
void WritePolygon(global_struct *all, char output_file[]);
void WriteFacesDXF(global_struct *all, char output_file[]);
void WritePolyFormat(global_struct *all);
/* io_3D.cpp: */
void Init3dDefaults(io_3ddef *io3d);
void WriteGeomOutput(global_struct *all);
void WriteFaces(global_struct *all, char output_file[]);
void ReadPolyhedron(global_struct *all, char input_file[]);
/* arg_eval.cpp: */
void InitDefaults(rt_options *rt_opt);
boolean ArgEval(int argc, char *argv[], rt_options *rt_opt);
#ifdef __cplusplus
extern "C" {
#endif
void EvalError(void);
#ifdef __cplusplus
}
#endif
/* list.cpp: */
void InitListDefaults(listdef* list);
void RemoveZeroEdges(listdef* list, list_ind *ind);
boolean GetBridgeNode(listdef* list, list_ind ind);
void SetBridgeNodePair(listdef* list, list_ind ind1, list_ind ind2);
int GetNumList(listdef* list);
void InitStorageList(listdef* list, int number);
void InitStorageLoops(listdef* list, int number);
void StoreChain(listdef* list, list_ind ind);
list_ind GetNextChain(listdef* list, boolean *done);
void ResetListData(listdef* list);
void RotateLinks(listdef* list, list_ind ind1, list_ind ind2);
void SplitSplice(listdef* list, list_ind ind1, list_ind ind2, list_ind ind3, list_ind ind4);
int GetOriginal(listdef* list, list_ind ind);
#ifdef NORMALS
void SetTexNormData(listdef* list, list_ind ind, int index1, int index2);
int GetNormalIndex(listdef* list, list_ind ind);
int GetTextureIndex(listdef* list, list_ind ind);
#endif
void SetOriginal(listdef* list, list_ind ind, int original);
void DeleteLinks(listdef* list, list_ind ind);
void InsertAfter(listdef* list, list_ind ind1, list_ind ind2);
list_ind MakeNode(listdef* list, int index);
#ifdef __cplusplus
extern "C" {
#endif
int MakeLoopHeader(listdef* list);
#ifdef __cplusplus
}
#endif
list_ind MakeHook(listdef* list);
void FreeList(listdef* list);
void DeleteHook(listdef* list, int curr_loop);
int CountListElements(listdef* list, list_ind ind1);
void DecrementLoops(listdef* list);
void UpdateIndex(listdef* list, list_ind ind, int index);
void SwapLinks(listdef* list, list_ind ind1);
boolean InPolyList(listdef* list, list_ind ind);
boolean InLoopList(listdef* list, int loop);
void ResetPolyList(listdef* list, list_ind ind);
list_ind GetNode(listdef* list);
void InitFace(listdef* list, int number);
void DecrementFaces(listdef* list);
#ifdef PARTITION_FIST
boolean isCorner(global_struct *all, int current_partition, list_ind ind);
#endif
/* clean_data.cpp: */
void InitCleanDefaults(cleandef *clean);
void CleanPolygon(global_struct *all, int *removed);
void CleanPolyhedralFace(global_struct *all, int loop_min, int loop_max, int *removed);
void FreeUnsorted(cleandef *clean);
/* numerics.cpp: */
#if defined(WITH_MPFRBACKEND) || defined(WITH_EXPR_WRAPPER)
void set_mpfrbackend_prec(mpfr_prec_t mpfr_prec, boolean verbose);
#endif
#ifdef JRC_PREDICATE
void exactinit();
#endif
boolean PntInTri(datadef *data, int i1, int i2, int i3, int i4, double *area);
boolean PntInTriClass(datadef *data, int i1, int i2, int i3, int i4, double *area,
int *pnt_on_edge);
double Angle(point p, point p1, point p2);
boolean InCone(int i, int j, int k, int l, boolean convex);
boolean SegIntersect(global_struct *all, int i1, int i2, int i3, int i4, int i5);
boolean SegIntersection(global_struct *all, int i1, int i2, int i3, int i4, int i5);
machine_double GetRatio(datadef *data, int i, int j, int k);
machine_double GetDoubleRatio(datadef *data, int i, int j, int k, int m);
double det2D(int i, int j, int k);
int orientation(int i, int j, int k);
void InitConstants(global_struct *all);
int SpikeAngle(listdef *list, datadef *data, int i, int j, int k, list_ind ind);
boolean PointInTriangle(int i1, int i2, int i3, int i4);
/* orientation.cpp: */
void AdjustOrientation(global_struct *all, int i1, int i2);
void DetermineOrientation(global_struct *all, list_ind ind);
double PolygonArea(global_struct *all, list_ind ind);
void FreeOrientation(global_struct *all);
/* ear_clip.cpp: */
void InitEarDefaults(eardef *ear);
boolean IsEar(global_struct *all, heapdef *hp, list_ind ind2, list_ind *ind1,
list_ind *ind3, machine_double *ratio);
void ClassifyEars(global_struct *all, list_ind ind);
void ClassifyAngles(global_struct *all, list_ind ind, int *num_reflex);
boolean ClipEar(global_struct *all, heapdef *hp, boolean *done);
void SetConvexityStatus(eardef *ear, boolean status);
void SetTangentNumber(int number);
void ResetEarStatus(eardef *ear);
/* heap.cpp: */
void InitHeapDefaults(heapdef *hp);
void FreeHeap(heapdef *hp);
void DumpOnHeap(heapdef *hp, machine_double ratio, list_ind ind, list_ind prev,
list_ind next);
void InsertIntoHeap(heapdef *hp, machine_double ratio, list_ind ind, list_ind prev,
list_ind next);
boolean DeleteFromHeap(heapdef *hp, list_ind *ind, list_ind *prev, list_ind *next);
void InitHeap(heapdef *hp, datadef *data);
#ifdef PARTITION_FIST
void InitPartitionedHeap(global_struct *all);
#endif
void MakeHeap(heapdef *hp);
/* vertex.cpp: */
void InitVertexDef(vertexdef* vert);
boolean InVertexList(vertexdef *vertex, int index);
void FreeVertices(vertexdef *verte);
void InitVertices(vertexdef *vert, int number);
#ifdef EXT_APPL_SITES
int StoreVertex(vertexdef *vert, double x, double y, double z, eas_type eas_data);
#else
int StoreVertex(vertexdef *vert, double x, double y, double z);
#endif
void FreeTriangles(vertexdef *vertex);
void StoreTriangle(global_struct *all, int i, int j, int k, int color);
int GetNumTriangles(vertexdef* vert);
void InitTriangles(vertexdef *vertex, int number);
void StoreQuad(vertexdef *vertex, int i, int j, int k, int l);
void FreeQuads(vertexdef *vertex);
void InitQuads(vertexdef *vertex, int number);
void FreeGroups(vertexdef *vertex);
boolean InGroupList(vertexdef *vertex, int index);
void InitGroupTriangles(vertexdef *vertex);
void StoreGroupNumber(listdef *list, vertexdef *vertex);
void StoreGroupData(vertexdef *vertex);
void StoreConvexLoop(global_struct *all, list_ind ind);
void FreeConvexLoops(vertexdef *vertex);
#ifdef NORMALS
int StoreV_Normal(vertexdef *vert, double x, double y, double z);
void InitV_Normals(vertexdef *vert, int number);
void FreeV_Normals(vertexdef *vertex);
boolean InV_NormalList(vertexdef *vertex, int index);
int StoreT_Vertex(vertexdef *vert, double x, double y, double z);
void InitT_Vertices(vertexdef *vert, int number);
void FreeT_Vertices(vertexdef *vertex);
boolean InT_VertexList(vertexdef *vertex, int index);
void FreeI_Triangles(vertexdef *vertex);
#endif
/* misc.cpp: */
void Fake3D(global_struct *all);
/* desperate.cpp: */
boolean Desperate(global_struct *all, heapdef *hp, list_ind ind, int i, boolean *splitted);
boolean LetsHope(global_struct *all, heapdef *hp, list_ind ind);
void FreeDistances(bridgedef *bridge);
int WindingNumber(global_struct *all, list_ind ind, point p);
/* bridge.cpp: */
void InitBridgeDefaults(bridgedef* bridge);
void FindLeftMostVertex(listdef* list, list_ind ind, list_ind *left_ind, int *left_i);
void ConstructBridges(global_struct* all, int i1, int i2);
boolean FindBridge(global_struct *all, list_ind ind, int i, int start, list_ind *ind1, int *i1);
void InsertBridge(global_struct *all, list_ind ind1, int i1, list_ind ind3, int i3);
int d_comp();
void FreeBridges(bridgedef* bridge);
/* project.cpp: */
void ProjectFace(global_struct *all, int loop_min, int loop_max);
/* triangulate.cpp: */
void Triangulate(global_struct *all);
/* write_ipe.cpp: */
void WriteIpePolygon(global_struct *all);
void WriteIpeOutput(global_struct *all);
/* simple.cpp: */
boolean SimpleFace(global_struct *all, list_ind ind1, boolean ears_fancy);
boolean TrivialPolygon(global_struct *all, list_ind ind1);
/* elapsed.cpp: */
machine_double elapsed(global_struct *all);
/* grid.cpp: */
void InitGridDefaults(griddef *grid);
#ifdef GRAZING
void ScanBridgeBuckets(global_struct *all,
int i0, int grid_offset, distance *distances,
int *num_dist, boolean *grid_exhausted,
double x_start);
#else
void ScanBridgeBuckets(global_struct *all,
int i0, int grid_offset, distance *distances,
int *num_dist, boolean *grid_exhausted);
#endif
void ResetGrid(griddef *grid);
void InitBuckets(global_struct *all);
void InsertPntIntoBridgeBuckets(global_struct *all, list_ind ind1);
void BuildBridgeBuckets(global_struct *all, list_ind ind0, boolean init_grid);
boolean GridIntersectionExists(global_struct *all, bounding_box bb,
int i1, int i2,list_ind ind5, int i5);
void InsertSegmentIntoGrid(datadef *data, griddef *grid,
bounding_box bb);
void BuildGrid(global_struct *all, int loop_min, int loop_max);
void FreeGrid(griddef *grid);
machine_double TopQualityGrid(global_struct *all, int i1, int i2);
void BuildPntsGrid(global_struct *all, int loop_ind);
void BuildBuckets(global_struct *all, list_ind ind);
boolean BucketIntersectionExists(global_struct *all,
int i1, list_ind ind1, int i2, int i3,
bounding_box bb, int *i_close,
boolean check_close);
void SetReflexNumber(global_struct *all,int number);
void DeleteReflexVertex(global_struct *all, list_ind ind);
/* bottleneck.cpp: */
boolean CheckBottleNeck(global_struct *all, int i1, int i2, int i3, list_ind ind4);
/* quads.cpp: */
void InitQuadsDefaults(quaddef *quad);
void DetermineQuads(global_struct *all);
/* degenerate.cpp: */
boolean HandleDegeneracies(global_struct *all, int i1, list_ind ind1, int i2,
int i3, int i4,list_ind ind4);
/* thin.cpp: */
void Thin(char output_file[], boolean save_polygon, boolean new_input,
int keep_pnts, boolean time, double *cpu_time);