基于YASM 8086绘制y=cos(x²+x+1)图形的比例归一化问题
8086 FPU图形比例归一化方案(DosBox环境)
核心逻辑:坐标映射与缩放
DosBox常用的VGA显示模式(如320x200)像素范围固定,要让函数图形清晰可读,关键是把数学坐标系的取值范围线性映射到屏幕像素坐标系,步骤如下:
1. 明确函数的取值区间
先锁定你要绘制的x范围(比如x ∈ [-2, 2],可根据函数特性调整),而cos(x²+x+1)的值域固定为[-1, 1],无需额外计算。
2. 建立屏幕坐标转换公式
以320x200 VGA模式为例:
- 屏幕X坐标:将数学x的区间
[x_start, x_end]映射到屏幕像素[0, 319]:screen_x = ((x - x_start) / (x_end - x_start)) * 319 - 屏幕Y坐标:屏幕坐标系Y轴向下为正,需先翻转数学坐标系方向,再将
y ∈ [-1, 1]映射到[0, 199]:
其中screen_y = 100 - (y * 99)100是屏幕垂直中点,99是垂直方向的缩放系数(将y的[-1,1]范围拉伸到99像素的上下区间)。
3. FPU指令实现缩放计算
用YASM的FPU指令完成浮点运算,示例片段:
; 预定义常量(数据段) x_start dd -2.0 x_end dd 2.0 x_range dd 4.0 ; x_end - x_start screen_width dd 319.0 screen_mid dd 100.0 scale_y dd 99.0 ; 计算屏幕X坐标(代码段) fld dword [x_current] ; 加载当前x值 fsub dword [x_start] ; x - x_start fdiv dword [x_range] ; 归一化到[0,1] fmul dword [screen_width] ; 映射到屏幕X范围 fistp word [screen_x] ; 转整数存储 ; 计算屏幕Y坐标(y_value为cos运算结果) fld dword [y_value] ; 加载cos输出值 fmul dword [scale_y] ; 缩放Y方向 fsub dword [screen_mid] ; 翻转坐标系并定位中点 fistp word [screen_y] ; 转整数存储 ; 绘制像素(VGA 320x200模式) mov ax, 0xA000 mov es, ax mov bx, [screen_x] mov ax, [screen_y] mov cx, 320 mul cx add bx, ax mov byte [es:bx], 0x0F ; 绘制白色像素点
4. 优化可读性的调整技巧
- 若Y方向图形过扁:增大
scale_y(比如改为120),放大Y轴波动幅度 - 若X方向图形过密:缩小x的取值区间(比如改为
x ∈ [-1.5, 1.5]),让每个x对应更宽的屏幕像素 - 添加坐标轴刻度:在屏幕上绘制固定间隔的刻度线,方便对比验证坐标映射是否正确
内容的提问来源于stack exchange,提问作者KazlLaur
相关产品推荐
相关产品推荐

