Files
fist/bottleneck.cpp
SaraP cbec90699f FIST 6.8 :
- creato il progetto in Visual Studio per compilare come libreria statica
- modifiche al codice originale per integrarlo nelle nostre librerie.
2025-03-04 16:19:35 +01:00

155 lines
4.8 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. */
/* */
/*****************************************************************************/
/* */
/* get standard libraries */
/* */
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
/* */
/* get my header files */
/* */
#include "fpkernel.h"
#include "martin.h"
#include "defs.h"
#include "list.h"
#include "header.h"
#include "basic.h"
#include "numerics.h"
/* */
/* prototypes of functions provided in this file */
/* */
boolean CheckBottleNeck(global_struct *all, int i1, int i2, int i3, list_ind ind4);
boolean CheckArea(listdef* list, datadef *data, list_ind ind4, list_ind ind5)
{
tmp_data_def tmp_data;
list_ind ind1, ind2;
int i0, i1, i2;
double area = C_0_0, area1 = C_0_0, area2 = C_0_0;
i0 = GetIndex(list, ind4);
ind1 = GetNextNode(list, ind4);
i1 = GetIndex(list, ind1);
while (ind1 != ind5) {
ind2 = GetNextNode(list, ind1);
i2 = GetIndex(list, ind2);
StableDet2D(data, tmp_data, i0, i1, i2, area);
area1 += area;
ind1 = ind2;
i1 = i2;
}
if (le(area1, EPS)) return false;
ind1 = GetNextNode(list, ind5);
i1 = GetIndex(list, ind1);
while (ind1 != ind4) {
ind2 = GetNextNode(list, ind1);
i2 = GetIndex(list, ind2);
StableDet2D(data, tmp_data, i0, i1, i2, area);
area2 += area;
ind1 = ind2;
i1 = i2;
}
if (le(area2, EPS)) return false;
else return true;
}
/* */
/* yet another stupid thing needed in order to handle degenerate cases! grr! */
/* */
boolean CheckBottleNeck(global_struct *all, int i1, int i2, int i3, list_ind ind4)
{
listdef *list = &all->c_list;
datadef *data = &all->c_data;
tmp_data_def tmp_data;
list_ind ind5;
int i4, i5;
boolean flag;
i4 = i1;
ind5 = GetPrevNode(list, ind4);
i5 = GetIndex(list, ind5);
if ((i5 != i2) && (i5 != i3)) {
PntInTriangle(data, tmp_data, i1, i2, i3, i5, flag);
if (flag) return true;
}
if (i2 <= i3) {
if (i4 <= i5) flag = SegIntersect(all, i2, i3, i4, i5, -1);
else flag = SegIntersect(all, i2, i3, i5, i4, -1);
}
else {
if (i4 <= i5) flag = SegIntersect(all, i3, i2, i4, i5, -1);
else flag = SegIntersect(all, i3, i2, i5, i4, -1);
}
if (flag) return true;
ind5 = GetNextNode(list, ind4);
i5 = GetIndex(list, ind5);
if ((i5 != i2) && (i5 != i3)) {
PntInTriangle(data, tmp_data, i1, i2, i3, i5, flag);
if (flag) return true;
}
if (i2 <= i3) {
if (i4 <= i5) flag = SegIntersect(all, i2, i3, i4, i5, -1);
else flag = SegIntersect(all, i2, i3, i5, i4, -1);
}
else {
if (i4 <= i5) flag = SegIntersect(all, i3, i2, i4, i5, -1);
else flag = SegIntersect(all, i3, i2, i5, i4, -1);
}
if (flag) return true;
ind5 = GetNextNode(list, ind4);
i5 = GetIndex(list, ind5);
while (ind5 != ind4) {
if (i4 == i5) {
if (CheckArea(list, data, ind4, ind5)) return true;
}
ind5 = GetNextNode(list, ind5);
i5 = GetIndex(list, ind5);
}
return false;
}