Skip to content
Snippets Groups Projects
Commit 5dd4daa4 authored by Radek Ošlejšek's avatar Radek Ošlejšek
Browse files

Introduced TriangleFan class

parent c128f6aa
No related branches found
No related tags found
No related merge requests found
package cz.fidentis.analyst.mesh.core;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
/**
* 1-ring neighborhood of a given mesh point. The neighborhood consists of
* a ring of vertices forming triangles around the given central point.
*
* @author Radek Oslejsek
*/
public class TriangleFan {
private final List<Integer> vertices = new LinkedList<>();
private final List<Integer> triangles = new LinkedList<>();
public TriangleFan(MeshFacet facet, int vert) {
if (facet == null) {
throw new IllegalArgumentException("facet");
}
//System.out.println(facet.getVertices());
CornerTable ct = facet.getCornerTable();
int vertRow = getVertexRow(ct, vert);
//System.out.println("DDD " + vert + " " + vertRow + " " + ct.getRow(vertRow).getVertexIndex());
if (vertRow == -1) {
throw new IllegalArgumentException("vert");
}
computeOneRingData(ct, vertRow, vertices, triangles);
}
public boolean isEnclosed() {
return Objects.equals(vertices.get(0), vertices.get(vertices.size()-1));
}
public boolean isBoundery() {
return !isEnclosed();
}
public List<Integer> getVertices() {
return Collections.unmodifiableList(vertices);
}
public List<Integer> getTriangles() {
return Collections.unmodifiableList(triangles);
}
private void computeOneRingData(CornerTable ct, int vertRow, List<Integer> vertices, List<Integer> triangles) {
//System.out.println(ct);
//System.out.println("AAA " + ct.getRow(vertRow).getVertexIndex());
int ringVertRow = ct.getIndexOfNextCornerInFace(vertRow);
while (true) {
//System.out.println("BBB " + ct.getRow(ringVertRow).getVertexIndex());
vertices.add(ct.getRow(ringVertRow).getVertexIndex());
if (vertices.size() > 1 && isEnclosed()) {
return; // the ring is closed; we are done
}
//System.out.println("CCC " + ct.getRow(ct.getIndexOfNextCornerInFace(ringVertRow)).getVertexIndex());
ringVertRow = ct.getIndexOfOppositeCorner(ct.getIndexOfNextCornerInFace(ringVertRow));
if (ringVertRow == -1) {
break; // we reached an open end
}
//System.out.println("DDD " + ct.getRow(ringVertRow).getVertexIndex());
triangles.add(ct.getIndexOfFace(ringVertRow));
}
ringVertRow = ct.getIndexOfPreviousCornerInFace(vertRow);
while (true) {
vertices.add(0, ct.getRow(ringVertRow).getVertexIndex());
if (vertices.size() > 1 && isEnclosed()) {
return; // the ring is closed; we are done
}
ringVertRow = ct.getIndexOfOppositeCorner(ct.getIndexOfPreviousCornerInFace(ringVertRow));
if (ringVertRow == -1) {
break; // we reached an open end
}
triangles.add(ct.getIndexOfFace(ringVertRow));
}
}
private int getVertexRow(CornerTable cornerTable, int vert) {
for (int i = 0; i < cornerTable.getSize(); i++) {
if (cornerTable.getRow(i).getVertexIndex() == vert) {
return i;
}
}
return -1;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment