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