package org.geogebra.common.geogebra3D.kernel3D.geos;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.ConstructionElementCycle;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.kernelND.GeoSegmentND;
import org.geogebra.common.plugin.GeoClass;
/**
* Net for a polyhedron
*
* @author Vincent
*
*/
public class GeoPolyhedronNet extends GeoPolyhedron {
/**
* @param c
* construction
*/
public GeoPolyhedronNet(Construction c) {
super(c);
}
@Override
public String getTypeString() {
return "Net";
}
@Override
public boolean isGeoPolyhedron() {
return false;
}
@Override
final public String toString(StringTemplate tpl) {
sbToString.setLength(0);
sbToString.append(label);
sbToString.append(" = ");
sbToString.append(kernel.format(getArea(), tpl));
return sbToString.toString();
}
@Override
final public String toStringMinimal(StringTemplate tpl) {
sbToString.setLength(0);
sbToString.append(regrFormat(getArea()));
return sbToString.toString();
}
private StringBuilder sbToString = new StringBuilder(50);
@Override
final public String toValueString(StringTemplate tpl) {
return kernel.format(getArea(), tpl);
}
private GeoPolygon3D[] oldFaces;
private int oldFacesIndex;
private GeoSegment3D[] oldSegments;
@Override
public void createFaces() {
// save old faces
if (polygons != null) {
oldFaces = getFaces3D();
oldFacesIndex = 0;
// clear to renew
polygons.clear();
} else {
oldFaces = null;
}
// save old edges
if (segments != null) {
oldSegments = getSegments3D();
// clear to renew
segments.clear();
} else {
oldSegments = null;
}
super.createFaces();
}
/**
* clear indexes (needed before new call to createFaces)
*/
public void clearIndexes() {
polygonsIndex.clear();
polygonsDescriptions.clear();
polygonsIndexMax = 0;
segmentsIndex.clear();
segmentsIndexMax = 0;
}
@Override
public GeoPolygon3D createPolygon(GeoPointND[] points, int index) {
if (oldFaces != null && oldFacesIndex < oldFaces.length) {
GeoPolygon3D polygon = oldFaces[oldFacesIndex];
polygon.modifyInputPoints(points);
polygons.put(index, polygon);
oldFacesIndex++;
return polygon;
}
return super.createPolygon(points, index);
}
@Override
public GeoSegmentND createNewSegment(GeoPointND startPoint,
GeoPointND endPoint, ConstructionElementCycle key) {
if (oldSegments != null && segmentsIndexMax < oldSegments.length) {
GeoSegment3D segment = oldSegments[(int) segmentsIndexMax];
segment.modifyInputPoints(startPoint, endPoint);
storeSegment(segment, key);
return segment;
}
return super.createNewSegment(startPoint, endPoint, key);
}
@Override
public GeoClass getGeoClassType() {
return GeoClass.NET;
}
@Override
public void setEuclidianVisible(boolean visible) {
super.setEuclidianVisible(visible);
for (GeoPoint3D point : pointsCreated) {
point.setEuclidianVisible(visible);
}
}
@Override
public double getDouble() {
return getArea();
}
}