SurfFins/SurfFins.scad

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));