直线段与圆弧光栅化的计算方法

直线段光栅化

数值微分法(DDA算法)

计算方法:

Δx = x2x1Δy=y2y1k=ΔyΔx

1k1 时:

{xi+1=xi+1yi+1=yi+k

k>1 时:

{xi+1=xi+1kyi+1=yi+1

k<1 时:

{xi+1=xi1kyi+1=yi1

算法评价:

  • 比直接使用y=kx+b更快
  • 耗时(增加了浮点数运算,除法运算,取整操作等,不利于硬件实现)

Bresenham划线算法(重点掌握)

计算方法:

Δx = x2x1Δy=y2y1k=ΔyΔx di=Δx(siti)

  • 0<k1 时:

d0=2dydx
绘制点的递推公式:

{xi+1=xi+1yi+1=yi+Δy{Δy=0di<0Δy=1di0

误差项递推公式:

di+1={di+2(dydx)di0di+2dydi<0

  • 1<k 时:

    d0=2dxdy
    绘制点的递推公式:

    {yi+1=yi+1xi+1=xi+Δx{Δy=0di<0Δy=1di0

    误差项递推公式:

    di+1={di+2(dxdy)di0di+2dxdi<0

    • 1<k 时:

      d0=2dxdy
      绘制点的递推公式:

      {yi+1=yi+1xi+1=xi+Δx{Δy=0di<0Δy=1di0

      误差项递推公式:

      di+1={di+2(dxdy)di0di+2dxdi<0

注意: 感觉期末只可能考察斜率在 0~1之间且起点从原点开始的

若dx > 0, dy > 0, 0< m < 1:

xi = x1, yi = y1

第一项: pi = 2dy -dx

若pi < 0: pi = pi + 2dy, yi = yi

若pi > 0: pi = pi + 2dy - 2dx, yi = yi + 1

xi = xi + 1

输出: (xi, yi)

若dx > 0, dy > 0, m > 1:

xi = x1, yi = y1

第一项: pi = 2dx -dy

若pi < 0: pi = pi + 2dx, xi = xi

若pi > 0: pi = pi + 2dx - 2dy, xi = xi + 1

yi = yi + 1

输出: (xi, yi)

若dx > 0, dy < 0, 0< m < 1:

xi = x1, yi = -y1

第一项: pi = 2dy -dx

若pi < 0: pi = pi + 2dy, yi = yi

若pi > 0: pi = pi + 2dy - 2dx, yi = yi + 1

xi = xi + 1

输出: (xi, -yi)

若dx > 0, dy < 0, m > 1:

xi = x1, yi = -y1

第一项: pi = 2dx -dy

若pi < 0: pi = pi + 2dx, xi = xi

若pi > 0: pi = pi + 2dx - 2dy, xi = xi + 1

yi = yi + 1

输出: (xi, -yi)

若dx < 0, dy > 0, 0< m < 1:

xi = -x1, yi = y1

第一项: pi = 2dy -dx

若pi < 0: pi = pi + 2dy, yi = yi

若pi > 0: pi = pi + 2dy - 2dx, yi = yi + 1

xi = xi + 1

输出: (-xi, yi)

若dx < 0, dy > 0, m > 1:

xi = -x1, yi = y1

第一项: pi = 2dx -dy

若pi < 0: pi = pi + 2dx, xi = xi

若pi > 0: pi = pi + 2dx - 2dy, xi = xi + 1

yi = yi + 1

输出: (-xi, yi)

若dx < 0, dy < 0, 0< m < 1:

xi = -x1, yi = -y1

第一项: pi = 2dy -dx

若pi < 0: pi = pi + 2dy, yi = yi

若pi > 0: pi = pi + 2dy - 2dx, yi = yi + 1

xi = xi + 1

输出: (-xi, -yi)

若dx < 0, dy < 0, m > 1:

xi = -x1, yi = -y1

第一项: pi = 2dx -dy

若pi < 0: pi = pi + 2dx, xi = xi

若pi > 0: pi = pi + 2dx - 2dy, xi = xi + 1

yi = yi + 1

输出: (-xi, -yi)

image

评价方法:

  • 只有整数运算,不含乘除法
  • 只有加法和乘2运算,效率高

中点划线算法(重点掌握)

计算方法:(假定0k1x是最大位移方向

di=F(M)=yi+0.5k(xi+1)b

绘制点的递推公式:

{xi+1=xi+1yi+1={yi+1d<0yid0

误差项递推公式:

d1=0.5k

di+1={di+1kdi<0dikdi0

改进的计算方法:(假定0k1x是最大位移方向

2dΔx 代替 d ,令D=2dΔx

绘制点的递推公式:

{xi+1=xi+1yi+1={yi+1d<0yid0

误差项递推公式:

D1=Δx2Δy

Di+1={Di+2Δx2ΔyDi<0Di2ΔyDi0

圆弧光栅化

八分法画圆

image

中点画圆算法

计算方法:

  • 误差项

d=F(xM,yM)=F(xi+1yi0.5)=(x+1)2+(yi0.5)2R2

  • d<0时,下一点取Pu(xi+1,yi)
  • di0时,下一点取Pd(xi+1,yi1)

d0=1.25R

di+1={di+2xi+3di<0di+2(xiyi)+5di0

改进计算方法:

e=d0.25d

e0=1R

ei+1={ei+2xi+3ei<0ei+2(xiyi)+5ei0

posted @   ICE_棋  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示