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:
parent
b891640014
commit
412672b00c
@ -15,7 +15,7 @@ new:
|
||||
- t3d - roll/pitch/forward
|
||||
- polyline_join: doc multi-childs
|
||||
|
||||
- util/count
|
||||
- util/count、binary_search
|
||||
- lemniscate_curve?
|
||||
- perlin_sphere?
|
||||
|
||||
|
6
src/util/_impl/_binary_search_impl.scad
Normal file
6
src/util/_impl/_binary_search_impl.scad
Normal 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]);
|
19
src/util/binary_search.scad
Normal file
19
src/util/binary_search.scad
Normal 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
|
||||
);
|
@ -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>;
|
||||
|
19
test/util/test_binary_search.scad
Normal file
19
test/util/test_binary_search.scad
Normal 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();
|
Loading…
x
Reference in New Issue
Block a user