Cleanup the way we use x/y coordinates : longitude is x and latitude is y. There was a mix of different conventions in the code. Now we only use cartesian coordinate system : x goes right, y goes up. Fixes #84

This commit is contained in:
mossroy 2014-04-11 13:58:21 +02:00
parent 1a9a2aaac8
commit 9c602d0ead
5 changed files with 62 additions and 64 deletions

View File

@ -219,7 +219,7 @@ define(function(require) {
var point4 = new geometry.point(7,9);
var point5 = new geometry.point(4,6);
ok(!rect1.containsPoint(point1), "rect1 does not contain point1");
ok(!rect1.containsPoint(point2), "rect1 does not contain point2");
ok(rect1.containsPoint(point2), "rect1 contains point2");
ok(rect1.containsPoint(point3), "rect1 contains point3");
ok(!rect1.containsPoint(point4), "rect1 does not contain point4");
ok(rect1.containsPoint(point5), "rect1 contains point5");
@ -257,10 +257,10 @@ define(function(require) {
&& normalizedRect5.width===4
&& normalizedRect5.height===1, "rect5 successfully normalized by switching bottom right and top left corners");
});
test("check rectangle constructor from top-left and bottom-right points", function() {
var topLeft = new geometry.point(2,5);
var bottomRight = new geometry.point(5,3);
var rect = new geometry.rect(topLeft, bottomRight);
test("check rectangle constructor from bottom-left and top-right points", function() {
var bottomLeft = new geometry.point(2,3);
var topRight = new geometry.point(5,5);
var rect = new geometry.rect(bottomLeft, topRight);
equal(rect.x, 2 , "rect.x should be 2");
equal(rect.y, 3 , "rect.y should be 3");
equal(rect.width, 3 , "rect.width should be 3");
@ -285,12 +285,12 @@ define(function(require) {
});
test("check bearing algorithm", function() {
var point1 = new geometry.point(0,0);
var point2 = new geometry.point(2,0);
var point2 = new geometry.point(0,2);
var line1 = new geometry.line(point1, point2);
equal(line1.bearing(), "N", "Bearing of line1 should be N");
var pointLondon = new geometry.point(51.50777816772461, -0.12805555760860443);
var pointParis = new geometry.point(48.856614, 2.3522219000000177);
var pointAmsterdam = new geometry.point(52.326947, 4.741287);
var pointLondon = new geometry.point(-0.12805555760860443, 51.50777816772461);
var pointParis = new geometry.point(2.3522219000000177, 48.856614);
var pointAmsterdam = new geometry.point(4.741287, 52.326947);
var lineLondonParis = new geometry.line(pointLondon, pointParis);
var lineParisLondon = new geometry.line(pointParis, pointLondon);
var lineLondonAmsterdam = new geometry.line(pointLondon, pointAmsterdam);
@ -339,7 +339,7 @@ define(function(require) {
start();
};
var rectFranceGermany = new geometry.rect(40,0,10,10);
var rectFranceGermany = new geometry.rect(0,40,10,10);
localArchive.getTitlesInCoords(rectFranceGermany, 10, callbackTitlesNearbyFound);
});
@ -351,7 +351,7 @@ define(function(require) {
start();
};
var rectFranceGermany = new geometry.rect(40,0,10,10);
var rectFranceGermany = new geometry.rect(0,40,10,10);
localArchive.getTitlesInCoords(rectFranceGermany, 2, callbackTitlesNearbyMaximumFound);
});
@ -372,12 +372,12 @@ define(function(require) {
// Check coordinates of London
var x = titleLondon._geolocation.x;
var y = titleLondon._geolocation.y;
equal(x, 51.50777816772461, "London should be at latitude 51.50777816772461");
equal(y, -0.12805555760860443, "London should be at longitude -0.12805555760860443");
equal(y, 51.50777816772461, "London should be at latitude 51.50777816772461");
equal(x, -0.12805555760860443, "London should be at longitude -0.12805555760860443");
start();
};
var pointLondon = new geometry.point(51, 0);
var pointLondon = new geometry.point(0, 51);
var maxDistance = 1;
var rectLondon = new geometry.rect(
pointLondon.x - maxDistance,
@ -403,7 +403,7 @@ define(function(require) {
start();
};
var pointAmsterdam = new geometry.point(55, 5);
var pointAmsterdam = new geometry.point(5, 55);
var maxDistance = 5;
var rectAmsterdam = new geometry.rect(
pointAmsterdam.x - maxDistance,

View File

@ -177,7 +177,7 @@
<li><a href="http://qunitjs.com/" target="_blank">QUnit</a> 2, released under the <a href="http://jquery.org/license" target="_blank">MIT license</a></li>
<li>Icons, algorithms and inspiration from <a href="https://github.com/evopedia/evopedia_qt/" target="_blank">Evopedia (Qt version)</a>, released under the <a href="https://www.gnu.org/licenses/" target="_blank">GPL v3 license</a></li>
<li>Mediawiki CSS from <a href="http://wikidev.net/" target="_blank">Wikidev</a>, released under the <a href="http://www.gnu.org/copyleft/gpl.html" target="_blank">GPL license</a></li>
<li>Geometry library from <a href="https://github.com/DavidDurman/joint/blob/master/src/geometry.js">JointJS</a>, released under the <a href="https://github.com/DavidDurman/joint/blob/master/LICENSE">Mozilla Public License v2</a> (small additions have been made to this javascript file)</li>
<li>Geometry library from <a href="https://github.com/DavidDurman/joint/blob/master/src/geometry.js">JointJS</a>, released under the <a href="https://github.com/DavidDurman/joint/blob/master/LICENSE">Mozilla Public License v2</a> (some changes have been made to this javascript file : see its header)</li>
<li><a href="https://cordova.apache.org/" target="_blank">Apache Cordova</a>, released under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache license 2.0</a></li>
</ul>
<h3>Other platforms/versions</h3>

View File

@ -50,6 +50,8 @@ define(function(require) {
// This max distance has a default value, but the user can make it change
var maxDistanceArticlesNearbySearch = DEFAULT_MAX_DISTANCE_ARTICLES_NEARBY;
var currentCoordinates = null;
// Define behavior of HTML elements
$('#searchTitles').on('click', function(e) {
searchTitlesFromPrefix($('#prefix').val());
@ -641,8 +643,6 @@ define(function(require) {
});
}
var currentCoordinates = null;
/**
* Looks for titles located around where the device is geolocated
*/
@ -670,7 +670,7 @@ define(function(require) {
$('#geolocationProgress').html("Found your location : lat:" + crd.latitude.toFixed(7) + ", long:" + crd.longitude.toFixed(7)
+ "<br/>Now looking for articles around this location...");
currentCoordinates = new geometry.point(crd.latitude, crd.longitude);
currentCoordinates = new geometry.point(crd.longitude, crd.latitude);
var rectangle = new geometry.rect(
currentCoordinates.x - maxDistanceArticlesNearbySearch,

View File

@ -44,7 +44,7 @@ define(function(require) {
// Size of chunks read in the dump files : 128 KB
var CHUNK_SIZE = 131072;
// A rectangle representing all the earth globe
var GLOBE_RECTANGLE = new geometry.rect(-91, -181, 182, 362);
var GLOBE_RECTANGLE = new geometry.rect(-181, -91, 362, 182);
/**
* LocalArchive class : defines a wikipedia dump on the filesystem
@ -740,7 +740,7 @@ define(function(require) {
readCoordinates = function(byteArray, startIndex) {
var lat = util.readFloatFrom4Bytes(byteArray, startIndex, true);
var long = util.readFloatFrom4Bytes(byteArray, startIndex + 4, true);
var point = new geometry.point(lat, long);
var point = new geometry.point(long, lat);
return point;
};
@ -799,13 +799,13 @@ define(function(require) {
callbackCounterForTitlesInCoordsSearch++;
LocalArchive.getTitlesInCoordsInt(localArchive, coordinateFileIndex, pos0, targetRect, rectSW, maxTitles, titlePositionsFound, callbackFunction, callbackGetTitlesInCoordsInt);
}
if (targetRect.intersect(rectNW)) {
callbackCounterForTitlesInCoordsSearch++;
LocalArchive.getTitlesInCoordsInt(localArchive, coordinateFileIndex, pos1, targetRect, rectNW, maxTitles, titlePositionsFound, callbackFunction, callbackGetTitlesInCoordsInt);
}
if (targetRect.intersect(rectSE)) {
callbackCounterForTitlesInCoordsSearch++;
LocalArchive.getTitlesInCoordsInt(localArchive, coordinateFileIndex, pos2, targetRect, rectSE, maxTitles, titlePositionsFound, callbackFunction, callbackGetTitlesInCoordsInt);
LocalArchive.getTitlesInCoordsInt(localArchive, coordinateFileIndex, pos1, targetRect, rectSE, maxTitles, titlePositionsFound, callbackFunction, callbackGetTitlesInCoordsInt);
}
if (targetRect.intersect(rectNW)) {
callbackCounterForTitlesInCoordsSearch++;
LocalArchive.getTitlesInCoordsInt(localArchive, coordinateFileIndex, pos2, targetRect, rectNW, maxTitles, titlePositionsFound, callbackFunction, callbackGetTitlesInCoordsInt);
}
if (targetRect.intersect(rectNE)) {
callbackCounterForTitlesInCoordsSearch++;

View File

@ -5,6 +5,11 @@
// Geometry library.
// (c) 2011-2013 client IO
// Copied from https://github.com/DavidDurman/joint/blob/master/src/geometry.js
// and modified in order to :
// - add a few functions necessary to Evopedia
// - use the cartesian coordinate system (x goes right, y goes up)
// It might have inverted the clockwise/anticlockwise directions for angles/rotations
// but it doesn't matter because they are not used by Evopedia
define(function(require) {
@ -255,15 +260,15 @@ define(function(require) {
* @returns {String} One of the following bearings : NE, E, SE, S, SW, W, NW, N
*/
bearing: function() {
var lat1 = this.start.x * Math.PI / 180;
var lat2 = this.end.x * Math.PI / 180;
var lon1 = this.start.y;
var lon2 = this.end.y;
var dLon = (lon2 - lon1) * Math.PI / 180;
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1) * Math.sin(lat2) -
Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
var brng = Math.atan2(y, x) / Math.PI * 180;
var lat1 = toRad(this.start.y);
var lat2 = toRad(this.end.y);
var lon1 = this.start.x;
var lon2 = this.end.x;
var dLon = toRad(lon2 - lon1);
var y = sin(dLon) * cos(lat2);
var x = cos(lat1) * sin(lat2) -
sin(lat1) * cos(lat2) * cos(dLon);
var brng = toDeg(atan2(y, x));
var bearings = ["NE", "E", "SE", "S", "SW", "W", "NW", "N"];
@ -289,13 +294,13 @@ define(function(require) {
x = x.x;
}
if (w === undefined && h === undefined) {
// The rectangle is built from topLeft and bottomRight points
var topLeft = x;
var bottomRight = y;
this.x = topLeft.x;
this.y = bottomRight.y;
this.width = bottomRight.x - topLeft.x;
this.height = topLeft.y - bottomRight.y;
// The rectangle is built from bottomLeft and topRight points
var bottomLeft = x;
var topRight = y;
this.x = bottomLeft.x;
this.y = bottomLeft.y;
this.width = topRight.x - bottomLeft.x;
this.height = topRight.y - bottomLeft.y;
}
else {
this.x = x;
@ -321,18 +326,11 @@ define(function(require) {
ne : function() {
return point(this.x + this.width, this.y + this.height);
},
// TODO : rename all this right/left/top/bottom terms because they are misleading (and wrong) in the Evopedia context : replace with N/S/E/W
origin: function() {
return point(this.x, this.y);
},
corner: function() {
return point(this.x + this.width, this.y + this.height);
},
topRight: function() {
return point(this.x + this.width, this.y);
},
bottomLeft: function() {
return point(this.x, this.y + this.height);
return this.ne();
},
center: function() {
return point(this.x + this.width/2, this.y + this.height/2);
@ -356,8 +354,8 @@ define(function(require) {
p = point(p);
var distToLeft = p.x - this.x;
var distToRight = (this.x + this.width) - p.x;
var distToTop = p.y - this.y;
var distToBottom = (this.y + this.height) - p.y;
var distToBottom = p.y - this.y;
var distToTop = (this.y + this.height) - p.y;
var closest = distToLeft;
var side = 'left';
@ -365,21 +363,21 @@ define(function(require) {
closest = distToRight;
side = 'right';
}
if (distToTop < closest) {
closest = distToTop;
side = 'top';
}
if (distToBottom < closest) {
closest = distToBottom;
side = 'bottom';
}
if (distToTop < closest) {
closest = distToTop;
side = 'top';
}
return side;
},
// @return {bool} true if point p is insight me
containsPoint: function(p) {
p = point(p);
if (p.x > this.x && p.x < this.x + this.width &&
p.y > this.y && p.y < this.y + this.height) {
if (p.x >= this.x && p.x <= this.x + this.width &&
p.y >= this.y && p.y <= this.y + this.height) {
return true;
}
return false;
@ -436,8 +434,8 @@ define(function(require) {
switch (side){
case "right": return point(this.x + this.width, p.y);
case "left": return point(this.x, p.y);
case "bottom": return point(p.x, this.y + this.height);
case "top": return point(p.x, this.y);
case "bottom": return point(p.x, this.y);
case "top": return point(p.x, this.y + this.height);
}
}
return p.adhereToRect(this);
@ -453,10 +451,10 @@ define(function(require) {
// (clockwise, starting from the top side)
var sides = [
line(this.origin(), this.topRight()),
line(this.topRight(), this.corner()),
line(this.corner(), this.bottomLeft()),
line(this.bottomLeft(), this.origin())
line(this.sw(), this.nw()),
line(this.nw(), this.ne()),
line(this.ne(), this.se()),
line(this.se(), this.sw())
];
var connector = line(center, p);