[OpenLayers-Commits] r3602 - in trunk/openlayers: examples lib/OpenLayers/Geometry tests/Geometry
commits at openlayers.org
commits at openlayers.org
Thu Jul 5 18:03:27 EDT 2007
Author: tschaub
Date: 2007-07-05 18:03:27 -0400 (Thu, 05 Jul 2007)
New Revision: 3602
Added:
trunk/openlayers/examples/rotate-features.html
Modified:
trunk/openlayers/lib/OpenLayers/Geometry/Collection.js
trunk/openlayers/lib/OpenLayers/Geometry/Point.js
trunk/openlayers/tests/Geometry/test_LineString.html
trunk/openlayers/tests/Geometry/test_Point.html
trunk/openlayers/tests/Geometry/test_Polygon.html
Log:
#805 - all geometries now know how to rotate - see the examples/rotate-features.html for geometry.rotate in action
Added: trunk/openlayers/examples/rotate-features.html
===================================================================
--- trunk/openlayers/examples/rotate-features.html (rev 0)
+++ trunk/openlayers/examples/rotate-features.html 2007-07-05 22:03:27 UTC (rev 3602)
@@ -0,0 +1,96 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <style type="text/css">
+ #map {
+ width: 500px;
+ height: 350px;
+ border: 1px solid #ccc;
+ }
+ p {
+ width: 500px;
+ }
+ </style>
+ <script src="../lib/OpenLayers.js"></script>
+ <script type="text/javascript">
+ <!--
+ var map, pointFeature, lineFeature, polygonFeature;
+
+ function init(){
+ map = new OpenLayers.Map('map');
+ var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+ "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
+ map.addLayer(layer);
+
+ var style_blue = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
+ style_blue.strokeColor = "blue";
+ style_blue.fillColor = "blue";
+ var style_green = {
+ strokeColor: "#339933",
+ strokeOpacity: 1,
+ strokeWidth: 3,
+ pointRadius: 6,
+ pointerEvents: "visiblePainted"
+ };
+
+ var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry");
+
+ // create a point feature
+ var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
+ pointFeature = new OpenLayers.Feature.Vector(point, null, style_blue);
+
+ // create a line feature from a list of points
+ var pointList = [];
+ var newPoint = point;
+ for(var p=0; p<5; ++p) {
+ newPoint = new OpenLayers.Geometry.Point(newPoint.x + Math.random(1),
+ newPoint.y + Math.random(1));
+ pointList.push(newPoint);
+ }
+ lineFeature = new OpenLayers.Feature.Vector(
+ new OpenLayers.Geometry.LineString(pointList),null,style_green);
+
+ // create a polygon feature from a linear ring of points
+ var pointList = [];
+ for(var p=0; p<6; ++p) {
+ var a = p * (2 * Math.PI) / 7;
+ var r = Math.random(1) + 1;
+ var newPoint = new OpenLayers.Geometry.Point(point.x + (r * Math.cos(a)),
+ point.y + (r * Math.sin(a)));
+ pointList.push(newPoint);
+ }
+ pointList.push(pointList[0]);
+
+ var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
+ polygonFeature = new OpenLayers.Feature.Vector(
+ new OpenLayers.Geometry.Polygon([linearRing]));
+
+
+ map.addLayer(vectorLayer);
+ map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5);
+ vectorLayer.addFeatures([pointFeature, lineFeature, polygonFeature]);
+
+ // start rotating
+ var origin = new OpenLayers.Geometry.Point(-110, 45);
+ window.setInterval(rotateFeature, 100,
+ pointFeature, Math.PI / 10, origin);
+ window.setInterval(rotateFeature, 100,
+ lineFeature, Math.PI / 20, origin);
+ window.setInterval(rotateFeature, 100,
+ polygonFeature, -1 * Math.PI / 10, origin);
+ }
+
+ function rotateFeature(feature, angle, origin) {
+ feature.geometry.rotate(angle, origin);
+ feature.layer.drawFeature(feature);
+ }
+
+ // -->
+ </script>
+ </head>
+ <body onload="init()">
+ <div id="map"></div>
+ <p>This example shows a few features rotating. There is not yet a control
+ built that provides a tool for rotating, but the geometry.rotate method
+ can be accessed to rotate programmatically.</p>
+ </body>
+</html>
Modified: trunk/openlayers/lib/OpenLayers/Geometry/Collection.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Geometry/Collection.js 2007-07-05 20:50:31 UTC (rev 3601)
+++ trunk/openlayers/lib/OpenLayers/Geometry/Collection.js 2007-07-05 22:03:27 UTC (rev 3602)
@@ -246,6 +246,21 @@
},
/**
+ * APIMethod: rotate
+ * Rotate a geometry around some origin
+ *
+ * Parameters:
+ * angle - {Float} Rotation angle in radians (measured counterclockwise
+ * from the positive x-axis)
+ * origin - {OpenLayers.Geometry.Point} Center point for the rotation
+ */
+ rotate: function(angle, origin) {
+ for(var i=0; i<this.components.length; ++i) {
+ this.components[i].rotate(angle, origin);
+ }
+ },
+
+ /**
* APIMethod: equals
* Tests for equivalent geometries
*
Modified: trunk/openlayers/lib/OpenLayers/Geometry/Point.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Geometry/Point.js 2007-07-05 20:50:31 UTC (rev 3601)
+++ trunk/openlayers/lib/OpenLayers/Geometry/Point.js 2007-07-05 22:03:27 UTC (rev 3602)
@@ -132,6 +132,22 @@
this.y = this.y + y;
},
+ /**
+ * APIMethod: rotate
+ * Rotate a point around another
+ *
+ * Parameters:
+ * angle - {Float} Rotation angle in radians (measured counterclockwise
+ * from the positive x-axis)
+ * origin - {OpenLayers.Geometry.Point} Center point for the rotation
+ */
+ rotate: function(angle, origin) {
+ var radius = this.distanceTo(origin);
+ var theta = angle + Math.atan2(this.y - origin.y, this.x - origin.x);
+ this.x = origin.x + (radius * Math.cos(theta));
+ this.y = origin.y + (radius * Math.sin(theta));
+ },
+
/** @final @type String */
CLASS_NAME: "OpenLayers.Geometry.Point"
});
Modified: trunk/openlayers/tests/Geometry/test_LineString.html
===================================================================
--- trunk/openlayers/tests/Geometry/test_LineString.html 2007-07-05 20:50:31 UTC (rev 3601)
+++ trunk/openlayers/tests/Geometry/test_LineString.html 2007-07-05 22:03:27 UTC (rev 3602)
@@ -77,6 +77,35 @@
t.eq(line.components[1].y, y1 + dy, "move() correctly modifies second y");
}
+ function test_LineString_rotate(t) {
+ t.plan(6);
+
+ var components = [new OpenLayers.Geometry.Point(10,15),
+ new OpenLayers.Geometry.Point(0,0)];
+ var geometry = new OpenLayers.Geometry.LineString(components);
+
+ var originals = [];
+ var comp;
+ var angle = 2 * Math.PI * Math.random();
+ var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
+ 10 * Math.random());
+ for(var i=0; i<geometry.components.length; ++i) {
+ comp = geometry.components[i];
+ originals[i] = comp.rotate;
+ comp.rotate = function(a, o) {
+ t.ok(true, "rotate called for component " + i);
+ t.ok(a == angle, "rotate called with correct angle");
+ t.ok(o == origin, "rotate called with correct origin");
+ }
+ }
+ geometry.rotate(angle, origin);
+
+ // restore the original rotate defs
+ for(var i=0; i<geometry.components.length; ++i) {
+ comp.rotate = originals[i];
+ }
+ }
+
function test_LineString_equals(t) {
t.plan(3);
Modified: trunk/openlayers/tests/Geometry/test_Point.html
===================================================================
--- trunk/openlayers/tests/Geometry/test_Point.html 2007-07-05 20:50:31 UTC (rev 3601)
+++ trunk/openlayers/tests/Geometry/test_Point.html 2007-07-05 22:03:27 UTC (rev 3602)
@@ -79,6 +79,30 @@
t.eq(point.y, y + dy, "move() correctly modifies y");
}
+ function test_Point_rotate(t) {
+ t.plan(4);
+
+ var tolerance = 1e-10;
+ var x = 10;
+ var y = 20;
+ var point = new OpenLayers.Geometry.Point(x, y);
+ var origin = new OpenLayers.Geometry.Point(5, 10);
+
+ // rotate a full revolution
+ point.rotate(2 * Math.PI, origin);
+ t.ok(((point.x - x) / x) < tolerance,
+ "rotate by 2 * Math.PI returns to the same y");
+ t.ok(((point.y - y) / y) < tolerance,
+ "rotate by 2 * Math.PI returns to the same y")
+
+ // rotate an 1/8 turn
+ point.rotate(Math.PI / 4, origin);
+ t.ok(((point.x - 1.4644660940672636) / 1.4644660940672636) < tolerance,
+ "rotate 1/8 turn correctly");
+ t.ok(((point.y - 20.606601717798213) / 20.606601717798213) < tolerance,
+ "rotate 1/8 turn correctly")
+ }
+
function test_Point_equals(t) {
t.plan(3);
Modified: trunk/openlayers/tests/Geometry/test_Polygon.html
===================================================================
--- trunk/openlayers/tests/Geometry/test_Polygon.html 2007-07-05 20:50:31 UTC (rev 3601)
+++ trunk/openlayers/tests/Geometry/test_Polygon.html 2007-07-05 22:03:27 UTC (rev 3602)
@@ -106,6 +106,33 @@
t.eq(polygon.components[1].components[0].y, y2 + dy, "move() correctly modifies second y");
}
+ function test_Polygon_rotate(t) {
+ t.plan(6);
+
+ var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
+
+ var originals = [];
+ var comp;
+ var angle = 2 * Math.PI * Math.random();
+ var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
+ 10 * Math.random());
+ for(var i=0; i<geometry.components.length; ++i) {
+ comp = geometry.components[i];
+ originals[i] = comp.rotate;
+ comp.rotate = function(a, o) {
+ t.ok(true, "rotate called for component " + i);
+ t.ok(a == angle, "rotate called with correct angle");
+ t.ok(o == origin, "rotate called with correct origin");
+ }
+ }
+ geometry.rotate(angle, origin);
+
+ // restore the original rotate defs
+ for(var i=0; i<geometry.components.length; ++i) {
+ comp.rotate = originals[i];
+ }
+ }
+
function test_Polygon_equals(t) {
t.plan(3);
More information about the Commits
mailing list