mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-01-01 09:49:45 +00:00
commit
cad4bb1f89
4 changed files with 54 additions and 1 deletions
|
@ -940,7 +940,9 @@ module tag_scope(scope){
|
||||||
// subtracted from it, no matter where it appears because kept objects are unioned in at the end.
|
// subtracted from it, no matter where it appears because kept objects are unioned in at the end.
|
||||||
// If you want a child of an object tagged with a remove tag to stay in the model it may be
|
// If you want a child of an object tagged with a remove tag to stay in the model it may be
|
||||||
// better to give it a tag that is not a remove tag or a keep tag. Such an object *will* be subject to
|
// better to give it a tag that is not a remove tag or a keep tag. Such an object *will* be subject to
|
||||||
// subtractions from other remove-tagged objects.
|
// subtractions from other remove-tagged objects.
|
||||||
|
// .
|
||||||
|
// Note that `diff()` invokes its children three times.
|
||||||
// .
|
// .
|
||||||
// For a step-by-step explanation of attachments, see the [Attachments Tutorial](Tutorial-Attachments).
|
// For a step-by-step explanation of attachments, see the [Attachments Tutorial](Tutorial-Attachments).
|
||||||
// Arguments:
|
// Arguments:
|
||||||
|
@ -1196,6 +1198,8 @@ module tag_diff(tag,remove="remove", keep="keep")
|
||||||
// unioned with the result. Attachable objects should be tagged using {{tag()}}
|
// unioned with the result. Attachable objects should be tagged using {{tag()}}
|
||||||
// and non-attachable objects with {{force_tag()}}.
|
// and non-attachable objects with {{force_tag()}}.
|
||||||
// .
|
// .
|
||||||
|
// Note that `intersect()` invokes its children three times.
|
||||||
|
// .
|
||||||
// For a step-by-step explanation of attachments, see the [Attachments Tutorial](Tutorial-Attachments).
|
// For a step-by-step explanation of attachments, see the [Attachments Tutorial](Tutorial-Attachments).
|
||||||
// Arguments:
|
// Arguments:
|
||||||
// intersect = String containing space delimited set of tag names of children to intersect. Default: "intersect"
|
// intersect = String containing space delimited set of tag names of children to intersect. Default: "intersect"
|
||||||
|
@ -1313,6 +1317,8 @@ module tag_intersect(tag,intersect="intersect",keep="keep")
|
||||||
// not tagged with the `keep` tags are combined into a convex hull, and the children tagged with the keep tags
|
// not tagged with the `keep` tags are combined into a convex hull, and the children tagged with the keep tags
|
||||||
// are unioned with the result.
|
// are unioned with the result.
|
||||||
// .
|
// .
|
||||||
|
// Note that `conv_hull()` invokes its children twice.
|
||||||
|
// .
|
||||||
// For a step-by-step explanation of attachments, see the [Attachments Tutorial](Tutorial-Attachments).
|
// For a step-by-step explanation of attachments, see the [Attachments Tutorial](Tutorial-Attachments).
|
||||||
// Arguments:
|
// Arguments:
|
||||||
// keep = String containing space delimited set of tag names of children to keep out of the hull. Default: "keep"
|
// keep = String containing space delimited set of tag names of children to keep out of the hull. Default: "keep"
|
||||||
|
|
|
@ -2387,6 +2387,8 @@ module hull_points(points, fast=false) {
|
||||||
attachable(){
|
attachable(){
|
||||||
if (len(points[0])==2)
|
if (len(points[0])==2)
|
||||||
hull() polygon(points=points);
|
hull() polygon(points=points);
|
||||||
|
else if (len(points)==3)
|
||||||
|
polyhedron(points=points, faces=[[0,1,2]]);
|
||||||
else {
|
else {
|
||||||
if (fast) {
|
if (fast) {
|
||||||
extra = len(points)%3;
|
extra = len(points)%3;
|
||||||
|
|
28
math.scad
28
math.scad
|
@ -314,8 +314,36 @@ function lcm(a,b=[]) =
|
||||||
assert(len(arglist)>0, "Invalid call to lcm with empty list(s)")
|
assert(len(arglist)>0, "Invalid call to lcm with empty list(s)")
|
||||||
_lcmlist(arglist);
|
_lcmlist(arglist);
|
||||||
|
|
||||||
|
// Function rational_approx()
|
||||||
|
// Usage:
|
||||||
|
// pq = rational_approx(x, maxq);
|
||||||
|
// Description:
|
||||||
|
// Finds the best rational approximation p/q to the number x so that q<=maxq. Returns
|
||||||
|
// the result as `[p,q]`. If the input is zero, then returns `[0,1]`.
|
||||||
|
// Example:
|
||||||
|
// pq1 = rational_approx(PI,10); // Returns: [22,7]
|
||||||
|
// pq2 = rational_approx(PI,10000); // Returns: [355, 113]
|
||||||
|
// pq3 = rational_approx(221/323,500); // Returns: [13,19]
|
||||||
|
// pq4 = rational_approx(0,50); // Returns: [0,1]
|
||||||
|
function rational_approx(x, maxq, cfrac=[], p, q) =
|
||||||
|
let(
|
||||||
|
next = floor(x),
|
||||||
|
fracpart = x-next,
|
||||||
|
cfrac = [each cfrac, next],
|
||||||
|
pq = _cfrac_to_pq(cfrac)
|
||||||
|
)
|
||||||
|
approx(fracpart,0) ? pq
|
||||||
|
: pq[1]>maxq ? [p,q]
|
||||||
|
: rational_approx(1/fracpart,maxq,cfrac, pq[0], pq[1]);
|
||||||
|
|
||||||
|
|
||||||
|
// Converts a continued fraction given as a list with leading integer term
|
||||||
|
// into a fraction in the form p / q, returning [p,q].
|
||||||
|
function _cfrac_to_pq(cfrac,p=0,q=1,ind) =
|
||||||
|
is_undef(ind) ? _cfrac_to_pq(cfrac,p,q,len(cfrac)-1)
|
||||||
|
: ind==0 ? [p+q*cfrac[0], q]
|
||||||
|
: _cfrac_to_pq(cfrac, q, cfrac[ind]*q+p, ind-1);
|
||||||
|
|
||||||
|
|
||||||
// Section: Hyperbolic Trigonometry
|
// Section: Hyperbolic Trigonometry
|
||||||
|
|
||||||
|
|
|
@ -505,6 +505,23 @@ module test_lcm() {
|
||||||
}
|
}
|
||||||
test_lcm();
|
test_lcm();
|
||||||
|
|
||||||
|
module test_rational_approx()
|
||||||
|
{
|
||||||
|
pq1 = rational_approx(PI,10); // Returns: [22,7]
|
||||||
|
pq2 = rational_approx(PI,10000); // Returns: [355, 113]
|
||||||
|
pq3 = rational_approx(221/323,500); // Returns: [13,19]
|
||||||
|
pq4 = rational_approx(0,50); // Returns: [0,1]
|
||||||
|
assert_equal(pq1,[22,7]);
|
||||||
|
assert_equal(pq2,[355,113]);
|
||||||
|
assert_equal(pq3,[13,19]);
|
||||||
|
assert_equal(pq4,[0,1]);
|
||||||
|
assert_equal(rational_approx(-PI,10),[-22,7]);
|
||||||
|
assert_equal(rational_approx(7,10), [7,1]);
|
||||||
|
}
|
||||||
|
test_rational_approx();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module test_complex(){
|
module test_complex(){
|
||||||
|
|
Loading…
Reference in a new issue