package com.revolsys.elevation.tin.tin;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.revolsys.elevation.tin.BaseCompactTriangulatedIrregularNetwork;
import com.revolsys.elevation.tin.TriangulatedIrregularNetwork;
import com.revolsys.elevation.tin.TriangulatedIrregularNetworkWriter;
import com.revolsys.geometry.model.Point;
import com.revolsys.properties.BaseObjectWithProperties;
import com.revolsys.spring.resource.Resource;
public class AsciiTinWriter extends BaseObjectWithProperties
implements TriangulatedIrregularNetworkWriter {
private final PrintWriter out;
private int tinIndex = 0;
public AsciiTinWriter(final Resource resource) {
this.out = resource.newPrintWriter();
this.out.println("TIN");
}
@Override
public void close() {
this.out.close();
}
@Override
public void flush() {
this.out.flush();
}
@Override
public void open() {
}
@Override
public void write(final TriangulatedIrregularNetwork tin) {
this.out.println("BEGT");
this.out.print("TNAM tin-");
this.out.println(++this.tinIndex);
this.out.println("TCOL 255 255 255");
final Map<Point, Integer> nodeMap = new HashMap<>();
this.out.print("VERT ");
final int vertexCount = tin.getVertexCount();
this.out.println(vertexCount);
final boolean isCompactTin = nodeMap instanceof BaseCompactTriangulatedIrregularNetwork;
if (isCompactTin) {
tin.forEachVertex((point) -> {
this.out.print(point.getX());
this.out.print(' ');
this.out.print(point.getY());
this.out.print(' ');
this.out.println(point.getZ());
});
} else {
tin.forEachVertex((point) -> {
final int vertexIndex = nodeMap.size();
nodeMap.put(point, vertexIndex);
this.out.print(point.getX());
this.out.print(' ');
this.out.print(point.getY());
this.out.print(' ');
this.out.println(point.getZ());
});
}
this.out.print("TRI ");
final int triangleCount = tin.getTriangleCount();
this.out.println(triangleCount);
if (tin instanceof BaseCompactTriangulatedIrregularNetwork) {
final BaseCompactTriangulatedIrregularNetwork compactTin = (BaseCompactTriangulatedIrregularNetwork)tin;
for (int triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++) {
for (int j = 0; j < 3; j++) {
if (j > 0) {
this.out.print(' ');
}
final int index = compactTin.getTriangleVertexIndex(triangleIndex, j);
this.out.print(index + 1);
}
this.out.println();
}
} else {
tin.forEachTriangle((triangle) -> {
for (int i = 0; i < 3; i++) {
if (i > 0) {
this.out.print(' ');
}
final Point point = triangle.getPoint(i);
final Integer index = nodeMap.get(point);
if (index == null) {
throw new NullPointerException();
}
this.out.print(index + 1);
}
this.out.println();
});
}
this.out.println("ENDT");
}
}