Infographie (2) - Expérience 2 : Algorithme de génération de droites

Expérience 2 : Algorithme de génération de droites

2.1 Objectif expérimental

(1) Comprendre les principes de base de la rastérisation des éléments graphiques de base
(2) Maîtriser un algorithme de rastérisation des éléments graphiques de base
(3) Comprendre l'algorithme DDA, la méthode de la ligne médiane, l'algorithme de Bresenham
(4) Maîtriser l'utilisation de la classe CDC dans VC++

2.2 Contenu de l'expérience

(1) Écrire la classe
(2) Compléter l'algorithme DDA, la méthode de la ligne médiane et l'algorithme de Bresenham

2.3 Idées d'algorithmes

Méthode de différenciation numérique (méthode DDA): déterminez d'abord s'il faut avancer dans la direction X ou dans la direction Y en fonction de la pente de la ligne droite, puis avancez le long de la direction du pas pour chaque point (pixel), le long d'une autre variable de coordonnées k , k est la pente de la droite, car elle est délivrée au dispositif matriciel, il est nécessaire d'arrondir un couple de coordonnées calculé à chaque fois.
Algorithme de Bresenham : connectez les centres de pixels de chaque ligne et colonne du dispositif de réseau pour construire un ensemble de lignes de grille virtuelles. Calculez l'intersection de la ligne droite et de chaque ligne de grille verticale dans l'ordre du point de départ au point d'arrivée de la ligne droite, puis déterminez le pixel le plus proche de l'intersection dans la colonne de pixels.
Algorithme de dessin de la ligne médiane : en supposant que la pente k de la ligne droite est comprise entre 0 et 1 et que le point de pixel actuel est (xp, yp), il existe deux options pour le point de pixel suivant : P1 (xp+1, yp) ou P2 (xp+1, yp+1). Si le milieu (xp+1, yp+0,5) de P1 et P2 est appelé M, Q est l'intersection de la droite idéale et de la verticale de x=xp+1. Lorsque M est inférieur à Q, prenez P2 comme pixel suivant ; lorsque M est supérieur à Q, prenez P1 comme pixel suivant.

2.4 Organigramme

(1) Méthode de différenciation numérique (méthode DDA) :
insérez la description de l'image ici(2) Algorithme de la ligne médiane :
insérez la description de l'image ici(3) Algorithme de Bresenham :
insérez la description de l'image ici

2.5 Étapes expérimentales

(1) Méthode de différenciation numérique (méthode DDA) :
Dessinez un point (x, y) du point de départ au point final, et parcourez une unité de longueur sur l'axe des x ou sur l'axe des y (le long de l'axe des x ou du l'axe des ordonnées dépend de l'angle d'inclinaison de la droite), déterminer l'incrément d'une autre coordonnée par l'inclinaison de la droite (pente ou inverse de la pente), obtenir la coordonnée du point suivant, arrondir x ou y pour obtenir (x, y), si (x, y) n'est pas le point final, continuer .
(2) Algorithme de dessin de ligne médiane :
dessinez un point (x, y) du point de départ au point final, et le point de pixel actuel est (xp, yp), puis il y a deux options pour le point de pixel suivant P1 (xp +1 , yp) ou P2 (xp+1, yp+1), si le milieu de P1 et P2 (xp+1, yp+0.5) est appelé M, et Q est l'intersection de la droite idéale et de la verticale de x=xp+1. Lorsque M est en dessous de Q, alors prenez P2 comme pixel suivant ; lorsque M est au-dessus de Q, prenez P1 comme pixel suivant, obtenez (x, y), si (x, y) Si ce n'est pas la fin, continuez.
(3) Algorithme de Bresenham :
Dessinez un point (x, y) du point de départ vers le point final. Préparez-vous à dessiner le point suivant, ajoutez 1 à la coordonnée X et jugez si le point final est atteint, puis terminez, sinon trouvez le point suivant. Le point à dessiner est soit le voisin droit du point courant, soit le voisin supérieur droit du point courant. Si la coordonnée y de l'intersection du segment de droite ax+by+c=0 et x=x1+1 est supérieure à (y+*y+1))/2, sélectionnez le point supérieur droit, sinon sélectionnez le point inférieur droit point pour obtenir (x, y).

2.6 Code expérimental

(1) Méthode de différenciation numérique (méthode DDA) :

/
//DDA直线生成算法
/
void CLiHuchenView::OnDdaline() 
{
    
    
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();//获取设备指针
	int xa=100,ya=300,xb=300,yb=200,c=RGB(255,0,0);//定义直线的两端点,直线颜色红色
	int x,y;//定义变量x,y
	float dx,dy,k;//定义增量dx,dy和斜率k
	dx=(float)(xb-xa),dy=(float)(yb-ya);//直线两端点之差为增量
	k=dy/dx;//直线斜率
	y=ya;//将第一个点纵坐标赋给y
	//k值判断
	if(abs(k)<1)
	{
    
    
		for(x=xa;x<=xb;x++)//从x左端向右端点步进
		{
    
    
			pDC->SetPixel(x,int(y+0.5),c);//添加光栅点
			y=y+k;//y增加k的单位
		}
	}
	if(abs(k)>=1)
	{
    
    
		for(y=ya;y<=yb;y++)
		{
    
    
			pDC->SetPixel(int(x+0.5),y,c);//添加光栅点
			x=x+1/k;//x增加1/k的单位
		}
	}
	ReleaseDC(pDC);//指针释放
}

(2) Algorithme de dessin de ligne médiane :

/
//中点直线生成算法
/
void CLiHuchenView::OnMidpointline() 
{
    
    
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();//获取设备指针
	int xa=300,ya=200,xb=450,yb=300,c=RGB(0,255,0);//定义直线的两端点,直线颜色绿色
	float a,b,d1,d2,d,x,y;//定义直线方程系数a,b,中点带入直线的值d,增量d1,d2,变量x,y
	a=ya-yb;b=xb-xa;d=2*a+b;//计算a,b,d
	d1=2*a;d2=2*(a+b);计算增量d1,d2
	x=xa,y=ya;//赋初值
	pDC->SetPixel(x,y,c);添加光栅点
	while(x<xb)
	{
    
    
		//判断d
		if(d<0)
		{
    
    
			x++,y++,d+=d2;
		}
		else
		{
    
    
			x++,d+=d1;
		}
		pDC->SetPixel(x,y,c);添加光栅点
	}
	ReleaseDC(pDC);//指针释放
}

(3) Algorithme de Bresenham :

/
//Bresenham直线生成算法
/
void CLiHuchenView::OnBresenhamline() 
{
    
    
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();//获取设备指针
	int x1=100,y1=200,x2=300,y2=100,c=RGB(0,0,255);//定义直线的两端点,直线颜色蓝色
	int i,s1,s2,interchange;//定义变量
	float x,y,deltax,deltay,f,temp;//定义变量x,y;增量dx,dy
	x=x1;y=y1;//赋初值
	deltax=abs(x2-x1);deltay=abs(y2-y1);//直线两端点之差为增量
	if(x2-x1>=0){
    
     s1=1;}else {
    
    s1=-1;}//判断s1正负前进
	if(y2-y1>=0) {
    
    s2=1;}else {
    
    s2=-1;}//判断s2正负前进
	//判断dy和dx的大小
	if(deltay>deltax)
	{
    
    
		//交换dy和dx
		temp=deltax;
		deltax=deltay;
		deltay=temp;
		interchange=1;//设置交换
	}
	else {
    
    interchange=0;}
	f=2*deltay-deltax;//计算误差初值
	pDC->SetPixel(x,y,c);添加光栅点
	for(i=1;i<=deltax;i++)
	{
    
    
		if(f>=0)
		{
    
    
			if(interchange==1) x+=s1;
			else y+=s2;
			pDC->SetPixel(x,y,c);添加光栅点
			f=f-2*deltax;
		}
		else
		{
    
    
			if(interchange==1)  y+=s2;
			else x+=s1;
			f=f+2*deltay;
		}
	}
	ReleaseDC(pDC);//指针释放
}

2.7 Affichage des résultats expérimentaux

insérez la description de l'image iciRouge : Méthode de différenciation numérique (Méthode DDA)
Vert : Algorithme de ligne médiane
Bleu : Algorithme de Bresenham

Je suppose que tu aimes

Origine blog.csdn.net/chengzilhc/article/details/106728648
conseillé
Classement