cut adjusted involute, to better show the difference

This commit is contained in:
numzero 2026-10-09 01:55:28 +03:00
parent 1c0dfa51c9
commit b51356acd0

View File

@ -2,7 +2,7 @@ use std::{f32::consts::PI, time::Duration};
use flo_draw::{
DrawEvent, Key,
canvas::{Color::Rgba, GraphicsContext},
canvas::{Color::Rgba, GraphicsContext, GraphicsPrimitives},
create_drawing_window_with_events, with_2d_graphics,
};
use glam::{FloatExt, Vec2, mat3, vec2, vec3};
@ -80,6 +80,15 @@ fn main() {
mat3(vec3(1.0, 0.0, 0.0), vec3(0.0, c, s), vec3(0.0, -s, c))
};
let adjust_offset = |off: f32| {
let (s, c) = crown_angle.sin_cos();
let pitch = vec2(r_crown * c, r_pitch);
let offset = off * vec2(s, -c);
let pt = pitch + offset;
let intersect = pt * (pitch.x / pt.x);
r_pitch - intersect.y
};
let adjust_angle = |angle: f32| (angle.tan() * crown_angle.cos()).atan();
let gear_profile = Profile {
addemdum: ADDENDUM,
dedendum: DEDENDUM,
@ -90,11 +99,21 @@ fn main() {
dedendum: gear_profile.addemdum,
pressure_angle: gear_profile.pressure_angle,
};
let gear_profile_adj = Profile {
addemdum: adjust_offset(gear_profile.addemdum),
dedendum: -adjust_offset(-gear_profile.dedendum),
pressure_angle: adjust_angle(gear_profile.pressure_angle),
};
let cutter_profile_adj = Profile {
addemdum: adjust_offset(cutter_profile.addemdum),
dedendum: -adjust_offset(-cutter_profile.dedendum),
pressure_angle: adjust_angle(cutter_profile.pressure_angle),
};
let n_points_per_tooth = 100;
let n_points = n_points_per_tooth * n_teeth_sample;
let mut inv_shape = vec![r_pitch + ADDENDUM; n_points];
let mut bevel_shape = vec![r_pitch + 3.0 * ADDENDUM; n_points];
let mut inv_shape = vec![r_pitch + gear_profile_adj.addemdum; n_points];
let mut bevel_shape = vec![r_pitch + gear_profile_adj.addemdum; n_points];
let mut show_crown_gear = false;
let mut show_crown_cutter = true;
let mut show_rack_gear = false;
@ -156,7 +175,7 @@ fn main() {
let crown_cutter = make_crown(&cutter_profile);
let rack_y_at_x = |x, profile| rack_shape(x - rack_offset * PI, profile);
let inv_cutter_y_at_x = |x| rack_y_at_x(x, &cutter_profile);
let inv_cutter_y_at_x = |x| rack_y_at_x(x, &cutter_profile_adj);
let bevel_cutter: Vec<_> = crown_cutter
.iter()
@ -213,6 +232,11 @@ fn main() {
gc.close_path();
gc.stroke_color(Rgba(0.3, 0.3, 0.3, 0.4));
gc.stroke();
gc.stroke_color(Rgba(0.3, 0.3, 0.3, 0.1));
gc.circle(0.0, r_pitch, r_pitch - gear_profile_adj.dedendum);
gc.circle(0.0, r_pitch, r_pitch);
gc.circle(0.0, r_pitch, r_pitch + gear_profile_adj.addemdum);
gc.stroke();
line(
gc,
@ -228,7 +252,7 @@ fn main() {
for k in 0..n_points_per_tooth {
let x = (tooth as f32 + k as f32 / n_points_per_tooth as f32 + rack_offset)
* PI;
pts_rack.push(vec2(x, rack_y_at_x(x, &gear_profile)));
pts_rack.push(vec2(x, rack_y_at_x(x, &gear_profile_adj)));
pts_cutter.push(vec2(x, inv_cutter_y_at_x(x)));
}
}