计算机图形学是研究怎样用数字计算机生成、处理和显示图形的一门学科。
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();
}