/*****************************************************************************/ /* */ /* 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 #include #include /* */ /* 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; }