光栅图形学

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
end while
2002年10月24日 上海交通大学计算机系 何援军 7
2) James D.Foley 描述
令 k =(y2-y1)/(x2-x1) 有:
yi+1=yi+k•StepX
若0<k来自百度文库1,即∆x >∆y
因光栅单位为1,
可以采用每次x方向增加1, 而y方向增加k的办法得到下一个直线点。
最后将终点 按四舍五入 原则校正到 光栅点上
何援军 11
4)本教程描述——任意方向直线插补算法
void DDALine ( float xs,ys; //起点 float xe,ye; //终点 int value; //赋给线上的象数值 { int n,ix,iy,idx,idy ; int Flag; //插补方向标记 int Length; //插补长度 float x,y,dx,dy;
2002年10月24日 上海交通大学计算机系 何援军 5
1) David F. Rogers 描述
// Digital Differential Analyzer (DDA ) routine for rasterizing a line // The line end points are (xs,ys) and (xe,ye) assumed not equal. // Round is the function. Note: Many Round functions are floor functions, i.e Round (-8.5)=-9 rather than -8. The algorithm assumes this is the case. // Approximate the line length if (|xs- xe | ≥ | ys-ye |) then //插补长度
2002年10月24日 上海交通大学计算机系 何援军 9
3)已有算法描述分析
Rogers 描述:
采用x = x + StepX ,y = y + StepY, 逼近点并不一定是直线的一个最好的逼近; D.Foley描述: 未分析直线端点不在象素点上的情况; 只给出0-45°卦限的描述。 为避免引起积累误差,D.Foley描述中采用 double dx =xe-xs; double dy =ye-ys; double k =dy/dx; // 直线之斜率k
直线光栅化算法
DDA算法 Bresenham算法
圆光栅化算法
中点算法 中点整数算法 中点整数优化算法
2002年10月24日
上海交通大学计算机系 何援军
1
2.1直线光栅化算法
DDA算法(Digital Differential Analyzer) Bresenham算法
2002年10月24日
Length ← |xs- xe |;
else
Length ←| ys-ye |;
end if
2002年10月24日 上海交通大学计算机系 何援军 6
1) David F. Rogers 描述
// Select the larger of ∆x or ∆y to be one raster unit. StepX = ( xe -xs) / Length; StepY = ( ye -ys) / Length; x = xs; //首点 y = ys; i = 1; // Begin main loop while (i≤Length) WritePixel (Round(x), Round(y) ,value)); x = x + StepX; y = y + StepY; i++;
2002年10月24日 上海交通大学计算机系 何援军 10
4)本教程描述——几个注记
终点按四舍五 入原则校正到 光栅点上
起点直接按四 舍五入原则校 正到光栅点上
先求取直线与 最近垂直光栅 线的交点
先将直线延长求 取与最近垂直光 2002 年10月24日 栅线的交点
最后将起点按四 舍五入原则校正 到光栅点上 上海交通大学计算机系
上海交通大学计算机系 何援军
2
2.1.1 DDA算法
DDA算法(Digital Differential Analyzer) 基本原理 根据直线的增量方程 xi+1=xi+∆x yi+1=yi+k∆x 算得直线理论点的坐标四舍五入得到光栅点 算法实现 David F. Rogers 的描述(适用于所有象限) James D. Foley的描述(第一象限,且K<1) 本教程的描述(适用于所有象限及任何端点)
上海交通大学计算机系 何援军
4
1)David F. Rogers 描述
如果已知第i点的坐标,可用步长StepX和StepY 得到第i+1点的坐标为: xi+1=xi+ StepX yi+1=yi+ StepY 或 yi+1=yi+ k • StepX 例图中 0<k<1 StepX=1 StepY=k 将算得的直线上每个点 的当前坐标,按四舍五 入得到光栅点的位置
2002年10月24日 上海交通大学计算机系 何援军 3
1)David F. Rogers 描述
直线的基本微分方程是: Dy/Dx=常数(k) 设直线通过点P1(x1,y1)和P2(x2,y Dy/Dx), 则直线方程可表示为: Dy/Dx=(y2-y1)/(x2-x1)=k
2002年10月24日
2002年10月24日 上海交通大学计算机系 何援军 8
2) James D.Foley 描述
void Line ( //设0≤k≤1,xs<xe int xs,ys; //左端点 int xe,ye; //右端点 int value) //赋给线上的象数值 { int x; //x以步长为单位从xs增长到xe double dx =xe-xs; double dy =ye-ys; double k =dy/dx; // 直线之斜率k double y =ys; for (x=xs; x<=xe; x++) { WritePixel(x,Round(y),value); //置象数值为 value y+=k; // y移动步长是斜率k } // End of for } // Line
相关文档
最新文档