forked from geodmms/xdgnjobs

?? ?
2008-05-15 0acf7a49b2da4dd1873d64012ba360eaf51754f4
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