zoukankan      html  css  js  c++  java
  • 计算机图形学初步

    华南理工大学 梁宇正

    老师教的直线段Bresenham扫描转换算法中直线段的两端均为整数,那么这里也同样假设 $c_x, c_y ,r $均为整数。公式推导时需要使用的是与圆心的相对坐标,所以只考虑圆心在原点的情况,其他情况只需要进行一个坐标偏移。

    ([frac{pi}{4},frac{pi}{2}]) 的圆弧段中,圆切线的斜率范围为 ([-1,0]) ,仿照直线段Bresenham扫描转换算法,每次 (x_{i+1}=x_i+1) ,而因为斜率的范围的原因,所以 (y_{i+1}) 只有两种取法:(y_{i+1}=y_i)(y_{i+1}=y_i-1)

    考虑即将点亮的两个像素与圆的位置关系。一共有4种情况

    当圆恰好穿过其中一个点时,点亮对应的点即可。

    当两个点都在圆外时,(y_i-1) 的误差显然更小,选择 (y_{i+1}=y_i-1)
    当两个点都在圆内时,(y_i) 的误差显然更小,选择 (y_{i+1}=y_i)

    最后一种情况,点 ((x_i+1,y_i-1)) 在圆内,而 ((x_i+1,y_i)) 在圆外,比较他们与圆的误差关系。

    首先我选择的“误差”是指点亮的点到圆心的距离与半径r的差的绝对值:

    圆外的点 ((x_i+1,y_i)) 满足
    $dH= sqrt{(x_i+1)2+y_i2} - R $
    圆内的点 ((x_i+1,y_i-1)) 满足
    (dL= R - sqrt{(x_i+1)^2+(y_i-1)^2})

    仿照直线段Bresenham扫描转换算法,现在要比较 (dH)(dL) 的大小关系,作差
    判别式为

    (Delta = dH- dL= sqrt{(x_i+1)^2+y_i^2} + sqrt{(x_i+1)^2+(y_i-1)^2} - 2R)

    这个方法到这里我就做不下去了,貌似没有办法再化简了,而上面的方程和暴力使用方程计算没有分别。

    考虑到两个像素实际上只有1个 (y) 坐标的差异,所以一个点在圆内一个点在圆外时,点到圆心的距离与半径 (r) 的差必定不超过1。

    因为在 (x_1∈[0,1]) ,且 (x_2∈[0,1]) 时,假如 (x1>x2) 必有 (x1^2>x2^2) ,根据这个性质我认为可以改作比较点到圆心的距离与半径 (r) 的差的平方。

    最后我把“误差”定为点亮的点到圆心的距离的平方与半径 (r) 的平方的差,则有:

    圆外的点 ((x_i+1,y_i)) 满足
    (dH= (x_i+1)^2+y_i^2 – R^2)
    圆内的点 ((x_i+1,y_i-1)) 满足
    (dL= R^2 - (x_i+1)^2-(y_i-1)^2)

    仿照直线段Bresenham扫描转换算法,现在要比较 (dH)(dL) 的大小关系,作差,判别式为

    (Delta = dH- dL= (x_i+1)^2+y_i^2 + (x_i+1)^2+(y_i-1)^2 - 2R^2)

    定义第 (i) 个点有 (p_{i}= x_i^2+y_i^2 – 2R^2)

    则上式可化简为
    (egin{align} Delta&= x_i^2+2x_i+1+y_i^2 +x_i^2+2x_i+1+y_i^2-2y_i+1 - 2R^2\ &=2p_i+4x_i -2y_i+3\ end{align})

    那么根据 $Delta $ 的符号就可以确定选择哪个点了。但是看起来还是有多余的计算,设一个 (q_i=2p_i+4x_i -2y_i) ,那么只需要比较 (Delta=q_i+3) 的符号就可以了。

    再考虑如何从 (q_i) 推导出 (q_{i+1})

    当选择点 ((x_i+1,y_i)) 时,得

    新的点:
    (egin{align} q_{i+1}&=2((x_i+1)^2+y_i^2 – 2R^2)+ 4(x_i+1)-2y_i\ &=2x_i^2+2 y_i^2+8 x_i-2y_i+6-4R^2 end{align})

    旧的点:
    (egin{align} q_{i}&=2p_i+4x_i -2y_i\ &=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i\ end{align})

    两式作差得:
    (q_{i+1}- q_{i}=4x_i+6=4x_{i+1}+2)

    当选择点 ((x_i+1,y_i-1)) 时,得

    新的点:
    (egin{align} q_{i+1} &= 2((x_i+1)^2+(y_i-1)^2 – 2R^2)+ 4(x_i+1)-2(y_i-1)\ &=2 x_i^2+2 y_i^2+8 x_i-6y_i+10-4R^2 end{align})

    旧的点:

    (egin{align} q_i&=2p_i+4x_i -2y_i\ &=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i end{align})

    两者作差得:
    (q_{i+1}- q_{i}=4x_i-4y_i+10=4x_{i+1}-4y_{i+1}+10)

  • 相关阅读:
    八数码
    狂神说笔记——多线程05
    狂神说笔记——Java SE基础03
    从零开始的卷积神经网络
    深度学习与机器学习的区别
    模型的评估与选择
    经验风险VS风险函数
    常见的损失函数
    Erlang聊天室
    uniapp APP端 清除缓存
  • 原文地址:https://www.cnblogs.com/Inko/p/11552889.html
Copyright © 2011-2022 走看看