Skip to content

Commit

Permalink
Resample using a great-circle distance threshold.
Browse files Browse the repository at this point in the history
Projections will typically exhibit less curvature at larger scales, with
geodesics becoming closer and closer to straight lines.  Using a minimum
angular distance for resampling therefore makes more sense than using an
arbitrary scale-dependent threshold.

It's not clear whether this new threshold should depend on the precision
parameter, or be configurable separately.
  • Loading branch information
jasondavies committed Jun 25, 2013
1 parent 34544e3 commit 3f8097d
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 10 deletions.
6 changes: 3 additions & 3 deletions d3.js
Original file line number Diff line number Diff line change
Expand Up @@ -3306,7 +3306,7 @@ d3 = function() {
return stream;
}
function d3_geo_resample(project) {
var δ2 = .5, maxDepth = 16;
var δ2 = .5, cosMinDistance = Math.cos(1 * d3_radians), maxDepth = 16;
function resample(stream) {
var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;
var resample = {
Expand Down Expand Up @@ -3367,8 +3367,8 @@ d3 = function() {
function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, buffer) {
var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
if (d2 > 4 * δ2 && depth--) {
var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = Math.abs(Math.abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2, curve = dz * dz / d2 > δ2;
if (curve || d2 > 16384 * δ2) {
var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = Math.abs(Math.abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2, curve = dz * dz / d2 > δ2 || Math.abs((dx * dx2 + dy * dy2) / d2 - .5) > .3;
if (curve || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
var s0 = resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, buffer);
buffer.push(p);
var s1 = resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, buffer);
Expand Down
Loading

0 comments on commit 3f8097d

Please sign in to comment.