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