l*cos(theta) & l*sin(theta)

本文探讨了几何公差中直角度和平行度的算法实现,通过深入讨论与同事的交流,作者理解了垂直度和平行度的具体含义,并推导出了相应的数学公式。

这几天在写几何公差相关算子的测试用例,写到直角度和平行度的时候,我开始想:他们的实现算法是怎样的呢?于是开始满大街找定义,结果每个字都认识,但就是不知道在说什么;满大街找公式,木有。问同事,同事发过来:

抓狂还是满脸懵逼。

同事责任心满满,在我表达还是不太懂之后,动手给我画出“垂直度是垂直于基准直线且距离最近的两个包含被测直线的平面之间的距离(好吧,现在看这句话,觉得确确实实描述的就是这样一件事情。)”

再一讨论,线与线之间的直角度不就是对象线在基准线上的投影么,彻底懂了,顺便推出了直角度=l*cos(theta),平行度 = l*sin(theta); 把推测公式代入别人的工具中一试,结果正好正确。

还有点误差,但是公式已被算子工程师直接拿去套用了大笑

这是否才是一个算子测试工程师的真正职责!!!!



function track_motion() % 参数定义 theta = deg2rad(30); % 直线段与y轴的夹角(弧度) L = 50; % 直线段长度 r = 20; % 半圆半径 V = 10; % 速度 t0 = 0; % 初始时间 t1 = 8; % 终止时间 s0 = 0; % 初始位置(弧长,需根据实际情况调整) % 计算总弧长运动距离 total_length = 2*L + 2*pi*r; delta_t = t1 - t0; s_total = mod(s0 + V*delta_t, total_length); % 参数化跑道 [track_x, track_y] = generate_track(theta, L, r); % 计算t1时刻位置 [x1, y1] = get_position(theta, L, r, s_total); % 绘图 figure; plot(track_x, track_y, 'b-', 'LineWidth', 1.5); hold on; plot(x1, y1, 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r'); axis equal; grid on; xlabel('X'); ylabel('Y'); title(sprintf('t=%.1f时点位置', t1)); legend('跑道', '当前位置'); end function [x, y] = get_position(theta, L, r, s) % 分段处理 segments = [L, pi*r, L, pi*r]; % 各段长度 total = cumsum(segments); s = mod(s, sum(segments)); % 确定当前段 seg = find(s <= total, 1); if isempty(seg), seg = 4; end s_seg = s - [0, total(1:end-1)] * (s > [0, total(1:end-1)])'; % 计算各段坐标 switch seg case 1 % 上直道 dx = s_seg * sin(theta); dy = s_seg * cos(theta); x = -L/2*sin(theta) + dx; y = -L/2*cos(theta) + dy; case 2 % 右半圆 O_x = (L/2)*sin(theta) + r*cos(theta); O_y = (L/2)*cos(theta) - r*sin(theta); angle = pi - theta - s_seg/r; x = O_x + r*cos(angle); y = O_y + r*sin(angle); case 3 % 下直道 dx = s_seg * sin(theta); dy = s_seg * cos(theta); end_prev = [(L/2)*sin(theta) + 2*r*cos(theta), (L/2)*cos(theta) - 2*r*sin(theta)]; x = end_prev(1) - dx; y = end_prev(2) - dy; case 4 % 左半圆 O_x = -L/2*sin(theta) + r*cos(theta); O_y = -L/2*cos(theta) - r*sin(theta); angle = -theta + s_seg/r; x = O_x + r*cos(angle); y = O_y + r*sin(angle); end end function [track_x, track_y] = generate_track(theta, L, r) % 生成跑道坐标 n = 100; t1 = linspace(0, L, n); % 上直道 t2 = linspace(0, pi, n); % 右半圆 t3 = linspace(0, L, n); % 下直道 t4 = linspace(0, pi, n); % 左半圆 % 上直道 x1 = -L/2*sin(theta) + t1*sin(theta); y1 = -L/2*cos(theta) + t1*cos(theta); % 右半圆 O1_x = (L/2)*sin(theta) + r*cos(theta); O1_y = (L/2)*cos(theta) - r*sin(theta); angle1 = linspace(pi - theta, -theta, n); x2 = O1_x + r*cos(angle1); y2 = O1_y + r*sin(angle1); % 下直道 x3 = flip((L/2)*sin(theta) + 2*r*cos(theta) - t3*sin(theta)); y3 = flip((L/2)*cos(theta) - 2*r*sin(theta) - t3*cos(theta)); % 左半圆 O2_x = -L/2*sin(theta) + r*cos(theta); O2_y = -L/2*cos(theta) - r*sin(theta); angle2 = linspace(-theta, -theta + pi, n); x4 = O2_x + r*cos(angle2); y4 = O2_y + r*sin(angle2); track_x = [x1, x2, x3, x4]; track_y = [y1, y2, y3, y4]; end 将坐标原点位置移动至两条直线中间的中电,修改代码
最新发布
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值