📜  计算机图形扫描转换直线

📅  最后修改于: 2020-12-20 03:54:54             🧑  作者: Mango

扫描转换直线

一条直线可以由两个端点和一个方程式定义。在图1中,两个端点由(x 1 ,y 1 )和(x 2 ,y 2 )描述。直线方程式用于确定这两个端点之间所有点的x,y坐标。

使用直线方程,y = mx + b其中m = 扫描转换直线 &b = y中断,我们可以通过将x从x = x 1递增到x = x 2来找到y的值。通过对这些计算出的x,y值进行扫描转换,我们将线条表示为像素序列。

好的线描算法的属性:

1.线应显示为直线:我们必须通过选择靠近线的可寻址点来使线合适。如果选择正确,该线将显示为直线,否则,将产生交叉线。

这些线必须与x和y轴平行或成45°角生成。其他线会引起问题:通过它的线段在可寻址点处开始和结束,可能恰好没有经过它们之间的其他可寻址点。

2.线应准确终止:除非精确绘制线,否则它们可能在错误的位置终止。

3.线应具有恒定的密度:线密度与编号成正比。显示的点数除以线的长度。

为了保持恒定的密度,点应均匀分布。

4.线密度应独立于线长和角度:这可以通过计算近似线长估计值并使用线生成算法来实现,该算法将线密度保持在此估计精度范围内。

5.线应迅速画出:此计算应由专用硬件执行。

画线算法:

  • 直接使用线方程
  • DDA(数字差分分析仪)
  • 布雷森纳姆算法

直接使用线方程:

这是最简单的转换形式。首先扫描P 1和P 2点。第1页具有坐标(X 1 'Y 1 ')和(x 2' Y 2')。

然后m =(y 2 ',y 1 ')/(x 2 ',x 1 ')和b = 扫描转换直线

对于x的每个整数值,如果| m |≤1的值。但是不要考虑”扫描转换直线”

对于每个y整数值,如果| m |> 1的值。但是不要考虑”扫描转换直线”

示例:给出了一条起点为(0,0)和终点(6,18)的线。计算中间点的值和直线的斜率。

解决方案: P 1 (0,0)P 7 (6,18)

x 1 = 0
y 1 = 0
x 2 = 6
y 2 = 18
扫描转换直线

我们知道线的方程是
y +="" .............方程(1)<="" =="" b="" b
="" mx="" p="" y="3x">

将x的值从等式(1)的初始点开始放置,即(0,0)x = 0,y = 0
+="" 0="b⟹b" 0<="" =="" b
="" p="" x="">

将b = 0代入等式(1)
+="" 0
="" y="3x

现在计算中间点
令x 1="" 2="" 3="" 4="" 5="" 6="" =="" x="" y="18

所以点是P 1 (0,0)
P 2 (1,3)
P 3 (2,6)
P 4 (3,9)
P 5 (4,12)
P 6 (5,15)
P 7 (6,18)

使用方程式画线的算法:

步骤1:开始算法

步骤2:声明变量x 1 ,x 2 ,y 1 ,y 2 ,dx,dy,m,b,

步骤3:输入x 1 ,x 2 ,y 1 ,y 2的值
(x 1 ,y 1 )是线的起点的坐标。
(x 2 ,y 2 )是线的终点的坐标。

步骤4:计算dx = x 2 -x 1

步骤5:计算dy = y 2 -y 1

步骤6:计算m = 扫描转换直线

步骤7:计算b = y 1 -m * x 1

步骤8:将(x,y)设置为等于起点,即,最低点和x end等于x的最大值。

如果dx <0
然后x = x 2
y = y 2
x末端= x 1
如果dx> 0
那么x = x 1
y = y 1
x末端= x 2

步骤9:如果x = x end ,请检查是否已画出整条线,然后停止

步骤10:在当前(x,y)坐标上绘制一个点

步骤11:递增x的值,即x = x + 1

步骤12:根据方程式y = mx + b计算y的下一个值

步骤13:转到步骤9。

程序使用LineSlope方法画一条线

#include 
#include 
#include 
#include 
#include 
#include 

class bresen
{
    float x, y, x1, y1, x2, y2, dx, dy, m, c, xend;
    public:
    void get ();
    void cal ();
};
    void main ()
    {
    bresen b;
    b.get ();
    b.cal ();
    getch ();
   }
    Void bresen :: get ()
   {
    print ("Enter start & end points");
    print ("enter x1, y1, x2, y2");
    scanf ("%f%f%f%f",sx1, sx2, sx3, sx4)
}
void bresen ::cal ()
{
    /* request auto detection */
    int gdriver = DETECT,gmode, errorcode;
    /* initialize graphics and local variables */
    initgraph (&gdriver, &gmode, " ");
    /* read result of initialization */
    errorcode = graphresult ();
    if (errorcode ! = grOK)    /*an error occurred */
    {
         printf("Graphics error: %s \n", grapherrormsg (errorcode);
        printf ("Press any key to halt:");
        getch ();
        exit (1); /* terminate with an error code */
    }
    dx = x2-x1;
    dy=y2-2y1;
    m = dy/dx;
    c = y1 - (m * x1);
    if (dx<0)
    {
        x=x2;
        y=y2;
        xend=x1;
    }
    else
    {
        x=x1;
        y=y1;
        xend=x2;
    }
while (x<=xend)
    {
        putpixel (x, y, RED);
        y++;
        y=(x*x) +c;
    }
}

输出:

Enter Starting and End Points
Enter (X1, Y1, X2, Y2) 200 100 300 200


令x>


>


>


y>