cbec90699f
- creato il progetto in Visual Studio per compilare come libreria statica - modifiche al codice originale per integrarlo nelle nostre librerie.
155 lines
4.8 KiB
C++
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;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|