mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-18 12:31:17 +02:00
support by and idx
This commit is contained in:
@@ -1,7 +1,20 @@
|
|||||||
use <util/_impl/_vt_default_comparator.scad>;
|
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 :
|
low > upper ? -1 :
|
||||||
let(mid = floor((low + upper) / 2))
|
let(mid = floor((low + upper) / 2))
|
||||||
lessThan(sorted[mid], elem) ? _binary_search(sorted, elem, mid + 1, upper) :
|
sorted[mid][i] < elem[i] ? _binary_search_by(sorted, elem, mid + 1, upper, i) :
|
||||||
greaterThan(sorted[mid], elem) ? _binary_search(sorted, elem, low, mid - 1) : mid;
|
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);
|
@@ -1,4 +1,5 @@
|
|||||||
use <util/_impl/_bsearch_impl.scad>;
|
use <util/_impl/_bsearch_impl.scad>;
|
||||||
|
|
||||||
// for example, `sorted` is by zyx
|
function bsearch(sorted, elem, by = "idx", idx = 0) =
|
||||||
function bsearch(sorted, elem) = _binary_search(sorted, elem, 0, len(sorted) - 1);
|
by == "vt" ? _bsearch_vt(sorted, elem, 0, len(sorted) - 1) : // for example, `sorted` is by zyx
|
||||||
|
_bsearch_by(sorted, elem, by, idx);
|
@@ -1,5 +1,5 @@
|
|||||||
use <util/bsearch.scad>;
|
use <util/bsearch.scad>;
|
||||||
|
|
||||||
function has(lt, elem, sorted = false) =
|
function has(lt, elem, sorted = false) =
|
||||||
sorted ? bsearch(lt, elem) != -1 :
|
sorted ? bsearch(lt, elem, by = "vt") != -1 :
|
||||||
search([elem], lt) != [[]];
|
search([elem], lt) != [[]];
|
Reference in New Issue
Block a user