2018年10月8日

计算机图形学 中点算法

由于在显示器中,图像的显示是一个个像素点共同作用的结果,故我们需要让电子设备显示一幅图像时,则需要让近似直线无数个像素点共同发光,然而这些像素点可能不全在同一条直线上,我们则需要近似表示让其宏观显示为一条直线。

则我们需要一个算法去布置这些像素点,让这些像素点整体显示起来为一条直线。

下面介绍其中一个基础算法——————中点算法:
目标:求出A点(1,1)到B点(72,41)这条直线的画法。
首先我们知道直线可以用Ax+By+C = 0表示,以及A = -(y2-y1), B = x2-x1,C = -B(x2-x1)。
对于这条直线,我们用方程F(x,y)表示(怕讲的不清楚,看下下面的图片吧)

则像素点和我们的目标直线存在了上面的三种关系,我们则需要选择离直线最近的点去表示这条直线,这里我们采用中点算法去完成这个过程。

首先讲下思路,我们从初始点往终点画直线的过程中,每次遇到下一个点我们判断是

解释下为什么是x+1和y+0.5,x+1是因为需要往下一个x点走,y+0.5是y轴方向中点。如果f(x,y)>0的话则证明中点在直线上方,则需要选择中点下面的点作为下一个点,即y等于上一个点的y,x=x+1。反过来如果f(x,y)< 0的话,则y=y+1,x=x+1。

上面这个d的值是利用了一个递推推导得到的,感兴趣的可以自己从上面往下面推下来。
下面是我用matlab代码实现的:

%定义一个直线绘制函数,后面是输入参数x1,y1,x2,y2
function [] =mid_point_linear(x1,y1,x2,y2)
    %创建一个72*48的坐标网格
    axis([0 72 0 48]);
    %给x轴坐标值,从0到72中间间隔1
    set(gca,'xtick',0:72);
    %给y轴坐标值,从0到48中间间隔1
    set(gca,'ytick',0:48);
    %以表格形式展现
    grid on;
    %让x等于x1,y等于y1,(为了让x,和y为变量依次往后画)
    x = x1;y = y1;
    %根据原来学的A=-得塔y
    A = -(y2-y1);
    %根据上课讲的B=得塔x
    B = x2 - x1;
    %d0 = A+0。5B
    d0 = A+0.5*B;
    %让x一直走啊走啊走画到x2
    while(x<x2)
        %如果d0<0的话,则执行x+1,y+1
       if(d0<0)
           x = x+1;
           y = y+1;
           d0 = d0+A+B;
         %如果d0>=0的话,则执行x+1,y不变
       elseif(d0>=0)
           x = x+1;
           y = y;
           d0 = d0+A;
       end
       %把它绘制出来就好了
       hold on;
       plot(x,y,'o');
    end
end

随后控制台运行mid_point_linear(1,1,72,41)即可,得到图像:

小老虎加油!!!

I think therefore I be.

stupid0121

我是热爱生活热爱运动的程序员----stupid,谢谢大家陪伴我一起成长。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注