private Triangle GetTriangleAt(TriangleIndex tri) { var result = new Triangle { a = Points[tri.a], b = Points[tri.b], c = Points[tri.c] }; return(result); }
private TriangleIndex GetTriangleIndex(int middleVertex) { var previous = middleVertex == 0 ? validCount - 1 : middleVertex - 1; var next = middleVertex == validCount - 1 ? 0 : middleVertex + 1; var result = new TriangleIndex { a = previous, b = middleVertex, c = next }; return(result); }
private TriangleIndex LowestTri() { if (lowest != null) { return(lowest); } var lowestIndex = LowestVertex(); lowest = GetTriangleIndex(lowestIndex); return(lowest); }
private bool IsConvex(TriangleIndex tri) { //if (OrientCCW(middleVertex) * OrientCCW(LowestVertex()) > 0) //not xor is same as above with lower cpu & mem footprint if (!(OrientCCW(tri) ^ LowestCCWOrient())) { return(true); } return(false); }
private bool IsEmpty(TriangleIndex tri) { var previous = tri.a; var middleVertex = tri.b; var next = tri.c; var tsv = SignCCW(previous, middleVertex, next); for (int i = 0; i < validCount; i++) { if (i == previous || i == middleVertex || i == next) { continue; } if (tsv * SignCCW(middleVertex, previous, i) >= 0 && tsv * SignCCW(previous, next, i) >= 0 && tsv * SignCCW(next, middleVertex, i) >= 0) { return(false);//vertex i is inside triangle with middle vertex at middleVertex } } return(true); }
private bool OrientCCW(TriangleIndex tri) { return(ccw(tri.a, tri.b, tri.c) > 0); }