1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-04-20 14:11:52 +02:00

add binary_search

This commit is contained in:
Justin Lin 2022-05-10 09:08:34 +08:00
parent b891640014
commit 412672b00c
5 changed files with 47 additions and 4 deletions

View File

@ -15,7 +15,7 @@ new:
- t3d - roll/pitch/forward
- polyline_join: doc multi-childs
- util/count
- util/count、binary_search
- lemniscate_curve?
- perlin_sphere?

View File

@ -0,0 +1,6 @@
function _binary_search_impl(sorted, cmp, low, upper) =
low > upper ? -1 :
let(mid = floor((low + upper) / 2), compared = cmp(sorted[mid]))
compared == 0 ? mid :
let(lu = compared < 0 ? [mid + 1, upper] : [low, mid - 1])
_binary_search_impl(sorted, cmp, lu[0], lu[1]);

View File

@ -0,0 +1,19 @@
/**
* bsearch.scad
*
* @copyright Justin Lin, 2020
* @license https://opensource.org/licenses/lgpl-3.0.html
*
* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html
*
**/
use <_impl/_binary_search_impl.scad>;
function binary_search(sorted, target) =
_binary_search_impl(
sorted,
is_function(target) ? target : function(elem) elem == target ? 0 : elem > target ? 1 : -1,
0,
len(sorted) - 1
);

View File

@ -67,10 +67,8 @@ include <util/test_sub_str.scad>;
include <util/test_split_str.scad>;
include <util/test_parse_number.scad>;
include <util/test_slice.scad>;
include <util/test_sorted.scad>;
include <util/test_reverse.scad>;
include <util/test_fibseq.scad>;
include <util/test_bsearch.scad>;
include <util/test_choose.scad>;
include <util/test_dedup.scad>;
include <util/test_zip.scad>;
@ -82,7 +80,8 @@ include <util/test_spherical_coordinate.scad>;
include <util/test_count.scad>;
include <util/set/test_hashset.scad>;
include <util/map/test_hashmap.scad>;
include <util/test_sort.scad>;
include <util/test_sorted.scad>;
include <util/test_binary_search.scad>;
// Voxel
include <voxel/test_vx_bezier.scad>;

View File

@ -0,0 +1,19 @@
use <util/sorted.scad>;
use <util/binary_search.scad>;
module test_binary_search() {
echo("==== test_binary_search ====");
points = [[1, 1], [3, 4], [7, 2], [5, 2]];
lt = sorted(points); // [[1, 1], [3, 4], [5, 2], [7, 2]]
assert(binary_search(lt, [7, 2]) == 3);
xIs5 = function(elem) elem[0] - 5;
assert(binary_search(lt, xIs5) == 2);
yIs4 = function(elem) elem[1] - 4;
assert(binary_search(lt, yIs4) == 1);
}
test_binary_search();