1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-16 19:54:29 +02:00

support by and idx

This commit is contained in:
Justin Lin
2020-03-14 16:20:19 +08:00
parent c59c4b6e3b
commit 1f741d63e5
3 changed files with 20 additions and 6 deletions

View File

@@ -1,7 +1,20 @@
use <util/_impl/_vt_default_comparator.scad>;
function _binary_search(sorted, elem, low, upper) =
function _binary_search_by(sorted, elem, low, upper, i) =
low > upper ? -1 :
let(mid = floor((low + upper) / 2))
lessThan(sorted[mid], elem) ? _binary_search(sorted, elem, mid + 1, upper) :
greaterThan(sorted[mid], elem) ? _binary_search(sorted, elem, low, mid - 1) : mid;
sorted[mid][i] < elem[i] ? _binary_search_by(sorted, elem, mid + 1, upper, i) :
sorted[mid][i] > elem[i] ? _binary_search_by(sorted, elem, low, mid - 1, i) : mid;
function _bsearch_vt(sorted, elem, low, upper) =
low > upper ? -1 :
let(mid = floor((low + upper) / 2))
lessThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, mid + 1, upper) :
greaterThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, low, mid - 1) : mid;
function _bsearch_by(sorted, elem, by, idx) =
let(
dict = [["x", 0], ["y", 1], ["z", 2], ["i", idx]],
i = dict[search(by == "idx" ? "i" : by, dict)[0]][1]
)
_binary_search_by(sorted, elem, 0, len(sorted) - 1, i);

View File

@@ -1,4 +1,5 @@
use <util/_impl/_bsearch_impl.scad>;
// for example, `sorted` is by zyx
function bsearch(sorted, elem) = _binary_search(sorted, elem, 0, len(sorted) - 1);
function bsearch(sorted, elem, by = "idx", idx = 0) =
by == "vt" ? _bsearch_vt(sorted, elem, 0, len(sorted) - 1) : // for example, `sorted` is by zyx
_bsearch_by(sorted, elem, by, idx);

View File

@@ -1,5 +1,5 @@
use <util/bsearch.scad>;
function has(lt, elem, sorted = false) =
sorted ? bsearch(lt, elem) != -1 :
sorted ? bsearch(lt, elem, by = "vt") != -1 :
search([elem], lt) != [[]];