001: /*
002: * $RCSfile: BottleNeck.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.4 $
041: * $Date: 2007/02/09 17:20:17 $
042: * $State: Exp $
043: */
044:
045: // ----------------------------------------------------------------------
046: //
047: // The reference to Fast Industrial Strength Triangulation (FIST) code
048: // in this release by Sun Microsystems is related to Sun's rewrite of
049: // an early version of FIST. FIST was originally created by Martin
050: // Held and Joseph Mitchell at Stony Brook University and is
051: // incorporated by Sun under an agreement with The Research Foundation
052: // of SUNY (RFSUNY). The current version of FIST is available for
053: // commercial use under a license agreement with RFSUNY on behalf of
054: // the authors and Stony Brook University. Please contact the Office
055: // of Technology Licensing at Stony Brook, phone 631-632-9009, for
056: // licensing information.
057: //
058: // ----------------------------------------------------------------------
059: package com.sun.j3d.utils.geometry;
060:
061: import java.io.*;
062: import java.util.*;
063: import javax.vecmath.*;
064:
065: class BottleNeck {
066:
067: static boolean checkArea(Triangulator triRef, int ind4, int ind5) {
068: int ind1, ind2;
069: int i0, i1, i2;
070: double area = 0.0, area1 = 0, area2 = 0.0;
071:
072: i0 = triRef.fetchData(ind4);
073: ind1 = triRef.fetchNextData(ind4);
074: i1 = triRef.fetchData(ind1);
075:
076: while (ind1 != ind5) {
077: ind2 = triRef.fetchNextData(ind1);
078: i2 = triRef.fetchData(ind2);
079: area = Numerics.stableDet2D(triRef, i0, i1, i2);
080: area1 += area;
081: ind1 = ind2;
082: i1 = i2;
083: }
084:
085: if (Numerics.le(area1, triRef.ZERO))
086: return false;
087:
088: ind1 = triRef.fetchNextData(ind5);
089: i1 = triRef.fetchData(ind1);
090: while (ind1 != ind4) {
091: ind2 = triRef.fetchNextData(ind1);
092: i2 = triRef.fetchData(ind2);
093: area = Numerics.stableDet2D(triRef, i0, i1, i2);
094: area2 += area;
095: ind1 = ind2;
096: i1 = i2;
097: }
098:
099: if (Numerics.le(area2, triRef.ZERO))
100: return false;
101: else
102: return true;
103: }
104:
105: // Yet another check needed in order to handle degenerate cases!
106: static boolean checkBottleNeck(Triangulator triRef, int i1, int i2,
107: int i3, int ind4) {
108: int ind5;
109: int i4, i5;
110: boolean flag;
111:
112: i4 = i1;
113:
114: ind5 = triRef.fetchPrevData(ind4);
115: i5 = triRef.fetchData(ind5);
116: if ((i5 != i2) && (i5 != i3)) {
117: flag = Numerics.pntInTriangle(triRef, i1, i2, i3, i5);
118: if (flag)
119: return true;
120: }
121:
122: if (i2 <= i3) {
123: if (i4 <= i5)
124: flag = Numerics
125: .segIntersect(triRef, i2, i3, i4, i5, -1);
126: else
127: flag = Numerics
128: .segIntersect(triRef, i2, i3, i5, i4, -1);
129: } else {
130: if (i4 <= i5)
131: flag = Numerics
132: .segIntersect(triRef, i3, i2, i4, i5, -1);
133: else
134: flag = Numerics
135: .segIntersect(triRef, i3, i2, i5, i4, -1);
136: }
137: if (flag)
138: return true;
139:
140: ind5 = triRef.fetchNextData(ind4);
141: i5 = triRef.fetchData(ind5);
142:
143: if ((i5 != i2) && (i5 != i3)) {
144: flag = Numerics.pntInTriangle(triRef, i1, i2, i3, i5);
145: if (flag)
146: return true;
147: }
148:
149: if (i2 <= i3) {
150: if (i4 <= i5)
151: flag = Numerics
152: .segIntersect(triRef, i2, i3, i4, i5, -1);
153: else
154: flag = Numerics
155: .segIntersect(triRef, i2, i3, i5, i4, -1);
156: } else {
157: if (i4 <= i5)
158: flag = Numerics
159: .segIntersect(triRef, i3, i2, i4, i5, -1);
160: else
161: flag = Numerics
162: .segIntersect(triRef, i3, i2, i5, i4, -1);
163: }
164:
165: if (flag)
166: return true;
167:
168: ind5 = triRef.fetchNextData(ind4);
169: i5 = triRef.fetchData(ind5);
170: while (ind5 != ind4) {
171: if (i4 == i5) {
172: if (checkArea(triRef, ind4, ind5))
173: return true;
174: }
175: ind5 = triRef.fetchNextData(ind5);
176: i5 = triRef.fetchData(ind5);
177: }
178:
179: return false;
180: }
181: }
|