package org.geotools.data.dxf.entities;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LinearRing;
import org.geotools.data.dxf.parser.DXFLineNumberReader;
import java.io.EOFException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.geotools.data.GeometryType;
import org.geotools.data.dxf.parser.DXFUnivers;
import org.geotools.data.dxf.header.DXFLayer;
import org.geotools.data.dxf.header.DXFLineType;
import org.geotools.data.dxf.header.DXFTables;
import org.geotools.data.dxf.parser.DXFCodeValuePair;
import org.geotools.data.dxf.parser.DXFGroupCode;
import org.geotools.data.dxf.parser.DXFParseException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DXFEllipse extends DXFEntity {
private static final Log log = LogFactory.getLog(DXFEllipse.class);
public DXFPoint _centre = new DXFPoint();
public DXFPoint _point = new DXFPoint();
public double _ratio = 0;
public double _start = 0;
public double _end = 0;
public DXFEllipse(DXFEllipse newEllipse) {
this(new DXFPoint(newEllipse._centre._point.x, newEllipse._centre._point.y, newEllipse.getColor(), null, 0, (double) newEllipse.getThickness()),
new DXFPoint(newEllipse._point._point.x, newEllipse._point._point.y, newEllipse.getColor(), null, 0, (double) newEllipse.getThickness()),
newEllipse._ratio, newEllipse._start, newEllipse._end, newEllipse.getColor(), newEllipse.getRefLayer(), 0, newEllipse.getLineType());
setType(newEllipse.getType());
setStartingLineNumber(newEllipse.getStartingLineNumber());
setUnivers(newEllipse.getUnivers());
}
public DXFEllipse(DXFPoint centre, DXFPoint p, double r, double s, double e, int c, DXFLayer l, int visibility, DXFLineType typeLine) {
super(c, l, visibility, typeLine, DXFTables.defaultThickness);
_centre = centre;
_point = p;
_ratio = r;
_end = e;
_start = s;
setName("DXFEllipse");
}
public static DXFEllipse read(DXFLineNumberReader br, DXFUnivers univers) throws NumberFormatException, IOException {
int visibility = 0, c = 0;
double x = 0, y = 0, x1 = 0, y1 = 0, r = 0, s = 0, e = 0;
DXFLayer l = null;
DXFLineType lineType = null;
int sln = br.getLineNumber();
log.debug(">>Enter at line: " + sln);
DXFCodeValuePair cvp = null;
DXFGroupCode gc = null;
boolean doLoop = true;
while (doLoop) {
cvp = new DXFCodeValuePair();
try {
gc = cvp.read(br);
} catch (DXFParseException ex) {
throw new IOException("DXF parse error" + ex.getLocalizedMessage());
} catch (EOFException eofe) {
doLoop = false;
break;
}
switch (gc) {
case TYPE:
String type = cvp.getStringValue();
// geldt voor alle waarden van type
br.reset();
doLoop = false;
break;
case LAYER_NAME: //"8"
l = univers.findLayer(cvp.getStringValue());
break;
case LINETYPE_NAME: //"6"
lineType = univers.findLType(cvp.getStringValue());
break;
case VISIBILITY: //"60"
visibility = cvp.getShortValue();
break;
case COLOR: //"62"
c = cvp.getShortValue();
break;
case DOUBLE_1: //"40"
r = cvp.getDoubleValue();
break;
case DOUBLE_2: //"41"
s = cvp.getDoubleValue();
break;
case DOUBLE_3: //"42"
e = cvp.getDoubleValue();
break;
case X_1: //"10"
x = cvp.getDoubleValue();
break;
case Y_1: //"20"
y = cvp.getDoubleValue();
break;
case X_2: //"11"
x1 = cvp.getDoubleValue();
break;
case Y_2: //"21"
y1 = cvp.getDoubleValue();
break;
default:
break;
}
}
DXFEllipse m = new DXFEllipse(
new DXFPoint(x, y, c, l, visibility, 1),
new DXFPoint(x1, y1, c, l, visibility, 1),
r, s, e, c, l, visibility, lineType);
m.setType(GeometryType.POLYGON);
m.setStartingLineNumber(sln);
m.setUnivers(univers);
log.debug(m.toString(visibility, c, r, s, e, x, y, x1, y1));
log.debug(">>Exit at line: " + br.getLineNumber());
return m;
}
public Coordinate[] toCoordinateArray() {
/*
* This functions returns an array containing 36 points to draw an
* ellipse.
*
* @param x {double} X coordinate
* @param y {double} Y coordinate
* @param a {double} Semimajor axis
* @param b {double} Semiminor axis
* @param angle {double} Angle of the ellipse
function calculateEllipse(x, y, a, b, angle, steps)
{
if (steps == null)
steps = 36;
var points = [];
// Angle is given by Degree Value
var beta = -angle * (Math.PI / 180); //(Math.PI/180) converts Degree Value into Radiance
var sinbeta = Math.sin(beta);
var cosbeta = Math.cos(beta);
for (var i = 0; i < 360; i += 360 / steps)
{
var alpha = i * (Math.PI / 180) ;
var sinalpha = Math.sin(alpha);
var cosalpha = Math.cos(alpha);
var X = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
var Y = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);
points.push(new OpenLayers.Geometry.Point(X, Y));
}
return points;
}
*/
if (true) {
addError("coordinate array can not be created.");
return null;
}
List<Coordinate> lc = new ArrayList<Coordinate>();
double startAngle = 0.0;
double endAngle = 2 * Math.PI;
double segAngle = 2 * Math.PI / _ratio;
double angle = startAngle;
for (;;) {
//TODO
double x = _centre._point.getX() + _ratio * Math.cos(angle);
double y = _centre._point.getY() + _ratio * Math.sin(angle);
Coordinate c = new Coordinate(x, y);
lc.add(c);
if (angle >= endAngle) {
break;
}
angle += segAngle;
if (angle > endAngle) {
angle = endAngle;
}
}
return rotateAndPlace(lc.toArray(new Coordinate[]{}));
}
@Override
public Geometry getGeometry() {
if (geometry == null) {
updateGeometry();
}
return super.getGeometry();
}
public void updateGeometry() {
Coordinate[] ca = toCoordinateArray();
if (ca != null && ca.length > 1) {
LinearRing lr = getUnivers().getGeometryFactory().createLinearRing(ca);
geometry = getUnivers().getGeometryFactory().createPolygon(lr, null);
} else {
addError("coordinate array faulty, size: " + (ca == null ? 0 : ca.length));
}
}
public String toString(int visibility, int c, double r, double t, double e, double x, double y, double x1, double y1) {
StringBuffer s = new StringBuffer();
s.append("DXFEllipse [");
s.append("visibility: ");
s.append(visibility + ", ");
s.append("color: ");
s.append(c + ", ");
s.append("r: ");
s.append(r + ", ");
s.append("s: ");
s.append(t + ", ");
s.append("e: ");
s.append(e + ", ");
s.append("x: ");
s.append(x + ", ");
s.append("y: ");
s.append(y + ", ");
s.append("x1: ");
s.append(x1 + ", ");
s.append("y1: ");
s.append(y1);
s.append("]");
return s.toString();
}
@Override
public DXFEntity translate(double x, double y) {
_point._point.x += x;
_point._point.y += y;
// Is Translation of centre necessary?
_centre._point.x += x;
_centre._point.y += y;
return this;
}
@Override
public DXFEntity clone() {
return new DXFEllipse(this);
}
}