From 0acf7a49b2da4dd1873d64012ba360eaf51754f4 Mon Sep 17 00:00:00 2001 From: ?? ? <ulysseskao@ximple.com.tw> Date: Thu, 15 May 2008 10:42:55 +0800 Subject: [PATCH] update for EOFM-83 --- xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java | 95 +++++++++++++++++++++++++++++++---------------- 1 files changed, 63 insertions(+), 32 deletions(-) diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java index 57a4d89..044d57a 100644 --- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java +++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java @@ -1,13 +1,20 @@ package com.ximple.io.dgn7; import java.nio.ByteOrder; +import java.util.ArrayList; + +import org.apache.log4j.Logger; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; +import com.ximple.util.DgnUtility; + public class EllipseElement extends Element implements GeometryConverter { + private static final Logger logger = Logger.getLogger(EllipseElement.class); + public EllipseElement(byte[] raw) { super(raw); @@ -39,13 +46,13 @@ byte[] primary = new byte[8]; rawBuffer.get(primary); rawBuffer.order(bo); - return Utility.convertDGNToIEEEDouble(primary) / 1000.0; + return DgnUtility.convertDGNToIEEEDouble(primary) / 1000.0; } public void setPrimary(double value) { double temp = value * 1000.0; - short[] primary = Utility.convertIEEEDoubleToDGN(temp); + short[] primary = DgnUtility.convertIEEEDoubleToDGN(temp); System.arraycopy(primary, 0, raw, 18, 4); } @@ -58,13 +65,13 @@ byte[] secondary = new byte[8]; rawBuffer.get(secondary); rawBuffer.order(bo); - return Utility.convertDGNToIEEEDouble(secondary) / 1000.0; + return DgnUtility.convertDGNToIEEEDouble(secondary) / 1000.0; } public void setSecondary(double value) { double temp = value * 1000.0; - short[] secondary = Utility.convertIEEEDoubleToDGN(temp); + short[] secondary = DgnUtility.convertIEEEDoubleToDGN(temp); System.arraycopy(secondary, 0, raw, 22, 4); } @@ -74,12 +81,12 @@ int rotation = (raw[26] << 16 & 0xffff0000); rotation |= raw[27] & 0x0000ffff; - return Utility.converIntToRotation(rotation); + return DgnUtility.converIntToRotation(rotation); } public void setRotationAngle(double value) { - int angle = Utility.converRotatioToInt(value); + int angle = DgnUtility.converRotatioToInt(value); raw[26] = (short) (angle >> 16 & 0x0000ffff); raw[27] = (short) (angle & 0x0000ffff); @@ -93,10 +100,10 @@ byte[] rawValue = new byte[8]; rawBuffer.get(rawValue); // x - double dx = Utility.converUnitToCoord(Utility.convertDGNToIEEEDouble(rawValue)); + double dx = DgnUtility.converUnitToCoord(DgnUtility.convertDGNToIEEEDouble(rawValue)); rawBuffer.get(rawValue); // y - double dy = Utility.converUnitToCoord(Utility.convertDGNToIEEEDouble(rawValue)); + double dy = DgnUtility.converUnitToCoord(DgnUtility.convertDGNToIEEEDouble(rawValue)); rawBuffer.order(bo); @@ -105,13 +112,13 @@ public void setOrigin(Coordinate value) { - double temp = Utility.converCoordToUnit(value.x); - short[] x = Utility.convertIEEEDoubleToDGN(temp); + double temp = DgnUtility.converCoordToUnit(value.x); + short[] x = DgnUtility.convertIEEEDoubleToDGN(temp); System.arraycopy(x, 0, raw, 28, 4); - temp = Utility.converCoordToUnit(value.y); + temp = DgnUtility.converCoordToUnit(value.y); - short[] y = Utility.convertIEEEDoubleToDGN(temp); + short[] y = DgnUtility.convertIEEEDoubleToDGN(temp); System.arraycopy(y, 0, raw, 32, 4); } @@ -126,31 +133,55 @@ private Coordinate[] convertToLineString(int pts) { - Coordinate[] result = new Coordinate[pts]; - double beta = -getRotationAngle() / 180 * Math.PI; - double sinbeta = Math.sin(beta); - double cosbeta = Math.cos(beta); + ArrayList<Coordinate> result = new ArrayList<Coordinate>(); + double beta = DgnUtility.converRotationToRadian(-getRotationAngle()); double startAngle = getStartAngle(); - double endAngle = getSweepAngle(); - double steps = Math.abs(startAngle - endAngle) / pts; - int i = 0; - for (double current = startAngle; current < endAngle; current += steps) + double sweepAngle = getSweepAngle(); + double endAngle = startAngle + sweepAngle; + double steps = sweepAngle / pts; + double current; + if (sweepAngle < 0) { - if (i < pts) + for (current = startAngle; current > endAngle; current += steps) { - Coordinate pt = new Coordinate(); - double alpha = current / 180 * Math.PI; - double sinalpha = Math.sin(alpha); - double cosalpha = Math.cos(alpha); - pt.x = getOrigin().x + (getPrimary() * cosalpha * cosbeta - - getSecondary() * sinalpha * sinbeta); - pt.y = getOrigin().y + (getPrimary() * cosalpha * sinbeta + - getSecondary() * sinalpha * cosbeta); - result[i] = pt; - i++; + Coordinate pt = computePointOnArcByAngle(beta, current); + result.add(pt); + } + + } else + { + for (current = startAngle; current < endAngle; current += steps) + { + Coordinate pt = computePointOnArcByAngle(beta, current); + result.add(pt); } } - return result; + + Coordinate pt = computePointOnArcByAngle(beta, endAngle); + result.add(pt); + + if (!result.get(0).equals(result.get(result.size() - 1))) + { + result.add(result.get(0)); + } + + return result.toArray(new Coordinate[result.size()]); + } + + + private Coordinate computePointOnArcByAngle(double beta, double current) + { + double sinbeta = Math.sin(beta); + double cosbeta = Math.cos(beta); + Coordinate pt = new Coordinate(); + double alpha = DgnUtility.converRotationToRadian(current); + double sinalpha = Math.sin(alpha); + double cosalpha = Math.cos(alpha); + pt.x = getOrigin().x + (getPrimary() * cosalpha * cosbeta - + getSecondary() * sinalpha * sinbeta); + pt.y = getOrigin().y + (getPrimary() * cosalpha * sinbeta + + getSecondary() * sinalpha * cosbeta); + return pt; } public static class ElementHandler extends Element.ElementHandler -- Gitblit v0.0.0-SNAPSHOT