山坡轮廓为什么会挡住更远处的观察点:独立演算第07例
观察远处地形时,不能只比较两点谁更高。同样的高度差放在不同距离上,会形成不同的仰角;近处小坡也可能挡住远处高坡。
把观察者眼睛放在横坐标零、高度e处,地形每隔一单位有一个采样点。某点的视线斜率是高度差除以距离;只有严格大于所有更近采样点的斜率才记为可见。相等表示视线接触前面的不透明地形,也算遮挡。
这一例的完整输入
眼睛高度3,十二处地形高度依次为[2, 12, 11, 10, 11, 0, 11, 10, 11, 9, 13, 14]。
逐项计算记录
距离 | 地形高 | 本点斜率 | 此前最高斜率 | 最高点编号 | 可见 1 | 2 | -1 | None | None | 是 2 | 12 | 9/2 | -1 | 1 | 是 3 | 11 | 8/3 | 9/2 | 2 | 否 4 | 10 | 7/4 | 9/2 | 2 | 否 5 | 11 | 8/5 | 9/2 | 2 | 否 6 | 0 | -1/2 | 9/2 | 2 | 否 7 | 11 | 8/7 | 9/2 | 2 | 否 8 | 10 | 7/8 | 9/2 | 2 | 否 9 | 11 | 8/9 | 9/2 | 2 | 否 10 | 9 | 3/5 | 9/2 | 2 | 否 11 | 13 | 10/11 | 9/2 | 2 | 否 12 | 14 | 11/12 | 9/2 | 2 | 否
读表时先把输入与计算后的结果分开。空值表示这一步没有适用对象或没有可用结果,不应自动换成零。编号只负责识别本例中的元素,同一个数字出现在不同字段时,要先确认它代表位置、对象还是数值。
怎样复核和使用
用分数比较斜率可以避免小数舍入改变边界判断。每次只把已经经过的地形加入最高斜率,不能让更远的坡提前挡住近处的点。表中的遮挡点保留最早达到最高斜率的编号。
这是沿一条竖直截面的地形可见性,采样点之间用直线连接,未描述三维建筑、植被透明度或弯曲地表。游戏地图上不同方向需要分别检查,单条剖面的结果不能当成完整视野。
可以先遮住记录表,只按上述规则重算前两步,再选择一个边界条件重新试算。若结果不一致,应逐项检查输入顺序、端点是否包含以及状态在哪一步更新;不要只看最终合计相同就认为中间处理也完全正确。
