环形菜单把一圈方向分给若干选项。指针刚好落在分界线上时,必须先约定归属,否则轻微移动就可能在两个项目之间反复跳动。把角度标准化以后再划分扇区,可以清楚解释首尾相接的位置。
这份练习把数据、规则和中间状态一起列出。可以先自行推演,再与过程记录逐项比较;如果结果不同,先找到第一处分歧,确认时间单位、端点归属和运算顺序。案例是一套限定模型,不把其他作品的不同实现认定为错误。
规则与输入
本例从指定起始角按角度增大的方向编号,等宽扇区采用左闭右开区间。角度先减起始角,再取模到零至三百六十之间;只处理有方向的输入,不讨论菜单中心附近的死区。
一圈分10份,每份36度,起始角135 ['135', '495', '-225', '135', '171', '207', '243', '279', '315', '351', '387', '423', '459', '-125/2', '235/2', '404', '-1', '48', '-405']
逐项推演
原角度135减起始角135后,归一化方向0;属于扇区0的[0,36),选择编号0。
原角度495减起始角135后,归一化方向0;属于扇区0的[0,36),选择编号0。
原角度-225减起始角135后,归一化方向0;属于扇区0的[0,36),选择编号0。
原角度135减起始角135后,归一化方向0;属于扇区0的[0,36),选择编号0。
原角度171减起始角135后,归一化方向36;属于扇区1的[36,72),选择编号1。
原角度207减起始角135后,归一化方向72;属于扇区2的[72,108),选择编号2。
原角度243减起始角135后,归一化方向108;属于扇区3的[108,144),选择编号3。
原角度279减起始角135后,归一化方向144;属于扇区4的[144,180),选择编号4。
原角度315减起始角135后,归一化方向180;属于扇区5的[180,216),选择编号5。
原角度351减起始角135后,归一化方向216;属于扇区6的[216,252),选择编号6。
原角度387减起始角135后,归一化方向252;属于扇区7的[252,288),选择编号7。
原角度423减起始角135后,归一化方向288;属于扇区8的[288,324),选择编号8。
原角度459减起始角135后,归一化方向324;属于扇区9的[324,360),选择编号9。
原角度-125/2减起始角135后,归一化方向325/2;属于扇区4的[144,180),选择编号4。
原角度235/2减起始角135后,归一化方向685/2;属于扇区9的[324,360),选择编号9。
原角度404减起始角135后,归一化方向269;属于扇区7的[252,288),选择编号7。
原角度-1减起始角135后,归一化方向224;属于扇区6的[216,252),选择编号6。
原角度48减起始角135后,归一化方向273;属于扇区7的[252,288),选择编号7。
原角度-405减起始角135后,归一化方向180;属于扇区5的[180,216),选择编号5。
逐次选择结果为[0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 4, 9, 7, 6, 7, 5]。
复核与使用边界
逐个枚举扇区的区间,检查归一化方向只落在其中一个区间;另检验原角度加减整圈后选择不变。分界线归属应与区间约定保持一致。
把扇区中心而不是边界对准默认方向,需要整体偏移半个扇区,而不能只修改编号文字。方向输入的去抖或迟滞属于另一层规则,应在边界归属确定以后再设计。
复盘时建议保留输入表和中间状态,而不仅保存最终答案。改动一个条件后重新推演,再检查起点、终点、重复值和临界输入;这样能把规则本身、计算实现和显示结果分别核对,避免把一次偶然相同当成验证完成。
