153 lines
3.8 KiB
OpenSCAD
153 lines
3.8 KiB
OpenSCAD
|
|
include <BOSL2/std.scad>;
|
|
include <BOSL2/beziers.scad>;
|
|
|
|
|
|
if (false) {
|
|
|
|
bez = [[0,0], [30,30], [80,0]];
|
|
debug_bezier(bez, N=len(bez)-1);
|
|
translate(bezier_points(bez, 0.3)) color("red") sphere(1);
|
|
}
|
|
|
|
|
|
if (false) {
|
|
bez = [[0,0], [5,35], [60,-25], [80,0]];
|
|
debug_bezier(bez, N=len(bez)-1);
|
|
pts = bezier_points(bez, [0:0.2:1]);
|
|
rainbow(pts) move($item) sphere(1.5, $fn=12);
|
|
}
|
|
|
|
if (false) {
|
|
|
|
bez = [[0,0], [5,15], [40,20], [60,-15], [80,0]];
|
|
move_copies(bezier_curve(bez, 8)) sphere(r=1.5, $fn=12);
|
|
debug_bezier(bez, N=len(bez)-1);
|
|
}
|
|
|
|
|
|
fin_height = 250; // 10 inches in mm
|
|
fin_width = 240; // Width at the base in mm
|
|
fin_top_withdraw = 30;
|
|
fin_back_withraw = 20;
|
|
|
|
fin_start_angle = 70; // Angle [Point 0 ]
|
|
fin_sweep = 25; // Sweep Angle [Point 1]
|
|
|
|
fin_counter_angle = 30; // counter angle [Point 2]
|
|
fin_counter_strength = 20; // Length [Point 2]
|
|
|
|
fin_base = 200; // Width at the base in mm
|
|
|
|
|
|
|
|
|
|
fin_width_tip = 5; // Width at the tip in mm
|
|
fin_thickness = 5; // Thickness of the fin in mm
|
|
|
|
fin_end_angle = 110;
|
|
fin_end_strength = 30;
|
|
|
|
// Back
|
|
fin_back_height = 30; // Percent height
|
|
fin_back_widthdraw = 20; // Percent height
|
|
fin_back_angle = 20; // back angle
|
|
fin_back_strength=30;
|
|
|
|
|
|
|
|
pt1_x = adj_ang_to_opp(fin_height,fin_sweep)+fin_base/2;
|
|
pt1_y = fin_height;
|
|
|
|
|
|
|
|
pt = [100,0];
|
|
bez = [
|
|
[0,0], // Point 0
|
|
[opp_ang_to_adj(fin_height/3,fin_start_angle),fin_height/3], // Handle 0
|
|
|
|
|
|
[pt1_x-100,pt1_y], // Handle 1 ()
|
|
//[220,250], // Point 1
|
|
[pt1_x,pt1_y], // Point 1
|
|
[pt1_x+30,pt1_y], // Handle 1 (End)
|
|
|
|
// *****************
|
|
// COUNTER POINT
|
|
// *****************
|
|
handleStart(fin_width,fin_top_withdraw,fin_counter_angle,fin_counter_strength),
|
|
counterTop(fin_width,fin_top_withdraw), // [250,220], // Point 2
|
|
handleEnd(fin_width,fin_top_withdraw,fin_counter_angle,fin_counter_strength),
|
|
|
|
// *****************
|
|
// BACK POINT
|
|
// *****************
|
|
|
|
//[165,100], // Handle 2 (Start)
|
|
handle(backPoint(),fin_back_angle,fin_back_strength),
|
|
//[155,80], // Point 2
|
|
backPoint(),
|
|
handle(backPoint(),-fin_back_angle,fin_back_strength),
|
|
// [145,60], // Handle 2 (End)
|
|
|
|
|
|
//[250,230],
|
|
|
|
// *****************
|
|
// END POINT
|
|
// *****************
|
|
endHandle(fin_end_angle), // End Handle
|
|
[fin_base,0] // End point
|
|
];
|
|
pos = bezpath_closest_point(bez, pt);
|
|
xy = bezpath_points(bez,pos[0],pos[1]);
|
|
debug_bezier(bez, N=3);
|
|
color("red") translate(pt) sphere(r=1);
|
|
color("blue") translate(xy) sphere(r=1);
|
|
|
|
|
|
echo ("pt1_x",pt1_x);
|
|
|
|
|
|
function counterTop(x,withdraw) = [x, x-withdraw ];
|
|
function handleStart(x,withdraw,angle,strength) =
|
|
[
|
|
x+adj_ang_to_opp(strength,angle),
|
|
x-withdraw +strength
|
|
];
|
|
|
|
function handleEnd(x,withdraw,angle,strength) =
|
|
[
|
|
x-adj_ang_to_opp(strength,angle),
|
|
x-withdraw -strength
|
|
];
|
|
|
|
|
|
function endHandle(angle)=
|
|
angle < 90 ?
|
|
[fin_base + adj_ang_to_opp(fin_end_strength,90-angle),fin_end_strength]
|
|
:
|
|
[fin_base - adj_ang_to_opp(fin_end_strength,angle-90),fin_end_strength]
|
|
;
|
|
|
|
|
|
//function backPoint() = [fin_base-fin_base * fin_back_widthdraw/100]; //[155,80];
|
|
function backPoint() = [fin_base-(fin_back_widthdraw/100*fin_base),fin_back_height/100*fin_height];
|
|
|
|
|
|
function handle(point,angle,strength)=
|
|
[
|
|
point[0] + adj_ang_to_opp(strength,angle) ,
|
|
point[1] + (angle>0 ? strength : -strength)
|
|
];
|
|
|
|
|
|
//echo ("*** EndHandle",endHandle(70));
|
|
|
|
//echo ("*** test",[fin_base-(fin_back_widthdraw/100*fin_base),(fin_back_height/100*fin_height)]);
|
|
|
|
echo ("*** handle 0",handle(backPoint(),0,fin_back_strength));
|
|
echo ("*** handle +30",handle(backPoint(),fin_back_angle,fin_back_strength));
|
|
echo ("*** handle -30",handle(backPoint(),-fin_back_angle,fin_back_strength));
|
|
|