DDA直线生成算法(1)


计算机图形学是研究怎样用数字计算机生成、处理和显示图形的一门学科。

DDA

数字微分分析 Digital Differential Analyzer

一、预备知识

屏幕坐标系

屏幕左上角为(0,0)

经改造的二维笛卡尔坐标系

直线的生成算法

在光栅显示器的荧光屏上生成一个对象,实质上是往帧缓存寄存器的相应单元中填入数据。画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的象素序列,并填入色彩数据的过程。这个过程也称为直线光栅化。

DDA经典生成直线算法

:rainbow:C#绘图环境(bitmap方式)

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TextTemp
{
    public partial class Form2 : Form
    {
        Graphics Graphics;//定义画布,为form2的全局字段
        Bitmap Bitmap;//定义位图,为form2的全局字段
        public Form2()
        {
            InitializeComponent();
            Graphics = panel1.CreateGraphics();  //在form2的构造方法中实例化画布对象graphic
            Bitmap = new Bitmap(1000,1000); //在form2的构造方法中实例化位图对象Bitmap
        }
        //经典DDA算法
        private void Dda(float x1,float y1,float x2,float y2,Color color)
        {
            float k;  //取最大值,作为分母。
            k = Math.Abs(x2 - x1);
            if (Math.Abs(y2-y1)>k)
            {
                k = Math.Abs(y2 - y1);
            }
            float x, y;//动态坐标,也就是这条线上所有的点
            x = x1;
            y = y1;//等于起始点

            float xincrea, yincrea;//坐标增量,动态坐标每走一点,所增加的量。
            xincrea = (x2 - x1) / k;
            yincrea = (y2 - y1) / k;
            for (int i = 0; i < k; i++) //注意这个终止k,很讲究。
            {
                Bitmap.SetPixel((int)x, (int)y, color);//使用位图的SetPixel方法。
                x += xincrea;
                y += yincrea;
            }
        }

        //通过button1的点击事件,来执行dda方法。
        private void button1_Click(object sender, EventArgs e)
        {
            Dda(0,0,500,800,Color.Blue);
            Graphics.DrawImage(Bitmap, 0, 0, Bitmap.Width, Bitmap.Height);//很重要,将位图和画布联系起来


        }
    }
}

图解

窗体

在From中所用到的控件有,Panel和Button。

Panel是画布的容器,画布是位图的容器。


C#绘图环境(dll方式)不会dll

引用部分

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; //外部

声明部分

namespace WindowsApplication1
{    
    public partial class Form1 : Form
    {
        [DllImport("gdi32.dll")]
        private static extern int SetPixel(IntPtr hdc, int x1, int y1, int color);
        public Form1()
        {
            InitializeComponent();
        }
    }
}

取颜色函数

private uint RGB(Color color)
{
// 返回由RGB构成的位uint
uint R = color.R;
uint G = color.G;
uint B = color.B;
G <<= 8;
B <<= 16;
return ((uint)(R | G | B));
}

使用部分

SetPixel(g.GetHdc(), (int)x, (int)y, (int)RGB(color));
    g.ReleaseHdc();

直线的DDA实现程序(TC2.0)不会c

#include<stdio.h>
#include<graphics.h>
void dda(x1,y1,x2,y2,c)
int x1,y1,x2,y2,c;
{    float x,y,xincre,yincre;
      int k,i;
      k=abs(x2-x1);
    if(abs(y2-y1)>k)
            k=abs(y2-y1);
    xincre=(float)(x2-x1)/(float)k;
    yincre=(float)(y2-y1)/(float)k;
    x=x1;
    y=y1;
      for(i=1;i<=k;i++)
      {     putpixel(x,y,c);
         x+=xincre;
         y+=yincre; }    
}

--------------------------------

main()
{
    int graphmode , i;
    int  graphdiver =DETECT;
    initgraph (&graphdriver, &graphmode , NULL);
      dda(50,50,600,350,9);
      getch();
}

GIE色度图

RGB

CMY

HSV



文章作者: 李世昱
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 李世昱 !
评论
  目录