/*---------------- FILE HEADER --------------------------------------- This file is part of Geoide. Copyright (C) 2005-2006 by: IDgis B.V. http://www.idgis.nl This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Herman Assink IDgis bv P.O. Box 15 7450 AA Holten The Netherlands E-Mail: herman.assink@idgis.nl * @version 1.4.0 * @author IDgis team * ------------------------------------------------------------------------*/ import nl.idgis.giclient.geoma.LinearRing; import nl.idgis.giclient.geoma.Point; import nl.idgis.giclient.geoma.Polygon; class nl.idgis.giclient.geoma.Ellipse extends Polygon { private var numPoints:Number = 100; private var centerPoint:Point; function Ellipse(srsName:String, exteriorRing: LinearRing) { super(srsName, exteriorRing); centerPoint = exteriorRing.getCentroid(); resetPolygon(); } function addPoint(point:Point):Void { } function addPointN(point:Point):Void { } function removePoint(point:Point):Void { } function move(dx:Number,dy:Number):Void { super.move(dx, dy); centerPoint.move(dx, dy); } function setRadius1(radius:Number,permanent):Void { var radiusPoint1:Point = getRadiusPoint1(); var dx:Number = radiusPoint1.getX() - centerPoint.getX(); var dy:Number = radiusPoint1.getY() - centerPoint.getY(); var angle:Number = Math.atan2(dy, dx); var x:Number = centerPoint.getX() + Math.cos(angle) * radius; var y:Number = centerPoint.getY() + Math.sin(angle) * radius; setRadiusPoint1XY(x, y); } function getRadius1():Number { var radiusPoint1:Point = getRadiusPoint1(); var dx:Number = radiusPoint1.getX() - centerPoint.getX(); var dy:Number = radiusPoint1.getY() - centerPoint.getY(); var radius:Number = Math.sqrt((dx * dx) + (dy * dy)); return radius; } function setRadius2(radius:Number,permanent):Void { var radiusPoint2:Point = getRadiusPoint2(); var dx:Number = radiusPoint2.getX() - centerPoint.getX(); var dy:Number = radiusPoint2.getY() - centerPoint.getY(); var angle:Number = Math.atan2(dy, dx); // This is the angle for radius2. var x:Number = centerPoint.getX() + Math.cos(angle) * radius; var y:Number = centerPoint.getY() + Math.sin(angle) * radius; setRadiusPoint2XY(x, y); } function getRadius2():Number{ var radiusPoint2:Point = getRadiusPoint2(); var dx:Number = radiusPoint2.getX() - centerPoint.getX(); var dy:Number = radiusPoint2.getY() - centerPoint.getY(); var radius:Number = Math.sqrt((dx * dx) + (dy * dy)); return radius; } function setRadiusPoint1XY(x:Number, y:Number):Void { var radiusPoint1:Point = getRadiusPoint1(); radiusPoint1.setXY(x, y); var dx:Number = x - centerPoint.getX(); var dy:Number = y - centerPoint.getY(); var angle:Number = Math.atan2(dy, dx); // This is the new angle for radius1. angle = angle + (0.5 * Math.PI); // This is the new angle for radius2. var radius:Number = getRadius2(); x = centerPoint.getX() + Math.cos(angle) * radius; y = centerPoint.getY() + Math.sin(angle) * radius; var radiusPoint2:Point = getRadiusPoint2(); radiusPoint2.setXY(x, y); resetPolygon(); } function getRadiusPoint1():Point { return exteriorRing.getPoints()[0]; } function setRadiusPoint2XY(x:Number, y:Number):Void { var radiusPoint2:Point = getRadiusPoint2(); radiusPoint2.setXY(x, y); var dx:Number = x - centerPoint.getX(); var dy:Number = y - centerPoint.getY(); var angle:Number = Math.atan2(dy, dx); // This is the new angle for radius2. angle = angle - (0.5 * Math.PI); // This is the new angle for radius1. var radius:Number = getRadius1(); x = centerPoint.getX() + Math.cos(angle) * radius; y = centerPoint.getY() + Math.sin(angle) * radius; var radiusPoint1:Point = getRadiusPoint1(); radiusPoint1.setXY(x, y); resetPolygon(); } function getRadiusPoint2():Point { var points:Array = exteriorRing.getPoints(); return points[(points.length - 1) / 4]; } function getAngle():Number { var radiusPoint1:Point = getRadiusPoint1(); var dx:Number = radiusPoint1.getX() - centerPoint.getX(); var dy:Number = radiusPoint1.getY() - centerPoint.getY(); var angle:Number = Math.atan2(dy, dx); return angle; } function getCenterPoint():Point { return centerPoint; } private function resetPolygon():Void { var radiusPoint1:Point = getRadiusPoint1(); var radiusPoint2:Point = getRadiusPoint2(); var radius1:Number = getRadius1(); var radius2:Number = getRadius2(); var angle:Number = getAngle(); var points:Array = new Array(radiusPoint1, radiusPoint1); var linearRing:LinearRing = new LinearRing(getSRS(), points); var dx:Number = -1; var dy:Number = -1; var x:Number = -1; var y:Number = -1; for (var i:Number = 1; i < numPoints; i++) { if (i == numPoints / 4) { linearRing.addPoint(radiusPoint2); } else { dx = radius1 * Math.cos((2 * Math.PI) * i * (1 / numPoints)); dy = radius2 * Math.sin((2 * Math.PI) * i * (1 / numPoints)); x = centerPoint.getX() + (Math.cos(angle) * dx) - (Math.sin(angle) * dy); y = centerPoint.getY() + (Math.sin(angle) * dx) + (Math.cos(angle) * dy); linearRing.addPoint(new Point(getSRS(), x, y)); } } linearRing.setSuperGeometry(this); exteriorRing = linearRing; // geometryEventDispatcher.changeGeometry(this, permanent); } function clone():Ellipse { var extRing:LinearRing = getExteriorRing(); var cloneRing:LinearRing = extRing.clone(); return new Ellipse(getSRS(), cloneRing); } }