From b570425f32d1a38cb59dff89dea2f77d91c731ca Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Sun, 14 Oct 2018 20:51:46 -0700 Subject: [PATCH] added perf example for sweep There is a case when sweep line is still faster --- README.md | 11 +++++++++++ demo/interactive/src/generators.js | 12 ++++++++++++ perf/generators.js | 16 +++++++++++++++- perf/index.js | 17 ++++++++++++++++- 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1fb14fd..199ee38 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,17 @@ Bush shortens. Sweep line comes last. Now Bush algorithm wins by huge margin. Bentley-Ottman comes second, and brute force comes the last. +### Parallel Slanted lines + +[![slanted](https://i.imgur.com/vYAZzNvm.png)](https://anvaka.github.io/isect/?isAsync=false&p0=1000&p1=40&generator=parallelSlanted&algorithm=sweep&stepsPerFrame=1) + +* **Sweep: 1000 slanted, not intersect x 622 ops/sec ±1.23% (91 runs sampled)** +* Brute: 1000 slanted, not intersect x 230 ops/sec ±2.37% (87 runs sampled) +* Bush: 1000 slanted, not intersect x 243 ops/sec ±1.07% (87 runs sampled) + +In this example there too many lines, and none of them intersect. Furthermore, most of the +rectangular bounding boxes do intersect, which gives more work for the `bush` algorithm + # usage Install the module from npm: diff --git a/demo/interactive/src/generators.js b/demo/interactive/src/generators.js index f41cb37..8bfb83a 100644 --- a/demo/interactive/src/generators.js +++ b/demo/interactive/src/generators.js @@ -20,6 +20,18 @@ export function random(count = 4, range = 100, seed) { return lines; } +export function parallelSlanted(count) { + var lines = []; + for (var i = 0; i < count; ++i) { + var x = -i, y = i; + lines.push({ + from: {x, y}, + to: {x: i, y: i + i} + }) + } + return lines; +} + export function sparse(size = 50) { var lines = []; var rows = size, columns = size; diff --git a/perf/generators.js b/perf/generators.js index 14dace4..309ce26 100644 --- a/perf/generators.js +++ b/perf/generators.js @@ -14,7 +14,8 @@ module.exports = { grid: grid, complete: complete, drunkGrid: drunkGrid, - sparse: sparse + sparse: sparse, + parallelSlanted: parallelSlanted } function sparse(size, seed) { @@ -37,6 +38,19 @@ function sparse(size, seed) { return lines; } +function parallelSlanted(count) { + var lines = []; + for (var i = 0; i < count; ++i) { + var x = -i, y = i; + lines.push({ + from: {x, y}, + to: {x: i, y: i + i} + }) + } + return lines; +} + + function random(count = 4, range = 100, seed) { if (seed !== undefined) { prng = createRandom(seed); diff --git a/perf/index.js b/perf/index.js index 6543d5c..cb28419 100644 --- a/perf/index.js +++ b/perf/index.js @@ -20,6 +20,10 @@ var sparseLines = g.sparse(50, seed); var bruteSparseLines = g.sparse(50, seed); var bushSparseLines = g.sparse(50, seed); +var slanted = g.parallelSlanted(1000); +var bruteSlanted = g.parallelSlanted(1000); +var bushSlanted = g.parallelSlanted(1000); + var aLines = lines.map(x => [[x.from.x, x.from.y], [x.to.x, x.to.y]]); var aRandomLines = randomLines.map(x => [[x.from.x, x.from.y], [x.to.x, x.to.y]]); @@ -69,7 +73,18 @@ suite.add('Sweep: Circular lines 12x40', function() { var res = bush(bushSparseLines).run(); if (res.length !== 358) throw new Error('Invalid number of intersections'); }) - +.add('Sweep: 1,000 slanted, not intersect', function() { + var res = sweep(slanted).run(); + if (res.length !== 0) throw new Error('Invalid number of intersections'); +}) +.add('Brute: 1,000 slanted, not intersect', function() { + var res = brute(bruteSlanted).run(); + if (res.length !== 0) throw new Error('Invalid number of intersections'); +}) +.add('Bush: 1,000 slanted, not intersect', function() { + var res = brute(bushSlanted).run(); + if (res.length !== 0) throw new Error('Invalid number of intersections'); +}) // .add('Alternative circular lines 12x40', function () { // var res = alternativeImplementation(aRandomLines); // if (res.length !== 1123) throw new Error('Invalid number of intersections');