一条线段部分位于相机允许显示的区域之外时,直接丢掉整个线段会损失可见部分。先求与边界的交点,可以保留应显示的那一段。裁切与最终投影是不同阶段。
以下是一组输入完整的独立案例。先读清规则,再按时间或操作顺序记录中间状态;遇到与预期不同的结果时,检查首次出现差异的位置。案例使用明确限定的教学模型,不假定所有作品都采用相同的处理方式。
用二维坐标横向x和深度z表示线段,只有深度不小于近边界的部分保留,边界包含在内。两端都不可见则丢弃,一端可见时线性求交点;不处理远边界、透视除法或其他方向的裁切。
近边界深度6,每个点写作[x,z] [[[2, 4], [0, 9]], [[2, 10], [8, 3]], [[0, 6], [5, 4]], [[1, 5], [6, 5]], [[-4, 7], [0, 12]], [[2, 4], [12, 8]], [[5, 12], [7, 11]], [[-10, 6], [6, 8]], [[9, 5], [7, 5]], [[4, 7], [-6, 6]]]
线段0从[2, 4]到[0, 9],端点可见状态(False,True);保留[['6/5', '6'], ['0', '9']],交点横坐标6/5、深度6。
线段1从[2, 10]到[8, 3],端点可见状态(True,False);保留[['2', '10'], ['38/7', '6']],交点横坐标38/7、深度6。
线段2从[0, 6]到[5, 4],端点可见状态(True,False);保留[['0', '6'], ['0', '6']],交点横坐标0、深度6。
线段3从[1, 5]到[6, 5],端点可见状态(False,False);全部丢弃。
线段4从[-4, 7]到[0, 12],端点可见状态(True,True);保留[['-4', '7'], ['0', '12']],原端点均保留。
线段5从[2, 4]到[12, 8],端点可见状态(False,True);保留[['7', '6'], ['12', '8']],交点横坐标7、深度6。
线段6从[5, 12]到[7, 11],端点可见状态(True,True);保留[['5', '12'], ['7', '11']],原端点均保留。
线段7从[-10, 6]到[6, 8],端点可见状态(True,True);保留[['-10', '6'], ['6', '8']],原端点均保留。
线段8从[9, 5]到[7, 5],端点可见状态(False,False);全部丢弃。
线段9从[4, 7]到[-6, 6],端点可见状态(True,True);保留[['4', '7'], ['-6', '6']],原端点均保留。
十条线段中8条有保留部分,含只剩边界点的退化情况。
把线段写成起点加参数乘端点差,求满足深度条件的参数区间,再还原区间两端。所有保留端点都要符合深度限制,原本可见的端点应保持。
裁切保留一个点的退化结果,并不保证最终光栅化会画出可见像素。这里解决的是几何范围,后续绘制如何处理零长度线段需要另行约定,不能把几何保留与屏幕可见直接等同。
建议保留原始输入、每一步状态和最终输出,再只改变一个条件做对照。重点检查空输入、相等边界、重复请求以及先后顺序;把规则约定、计算过程和显示表现分别核对,比只比较最后一个数字更容易找到原因。