An@mik@ Ответов: 1

Вопрос об алгоритме DDA в компьютерной графике


Привет

Я попытался нарисовать прямую линию, используя алгоритм dda. Я писал код в Редакторе Си, используя язык Си.
Я использую следующие точки, чтобы нарисовать другой тип прямой линии.

Я сделал одну функцию dda, в которой я пишу код для реализации dda.
Я хочу нарисовать четыре линии, и я прошел следующие точки в вызове функции.
Аргумент функции в последовательности
xa, ya ,xb ,yb

1) 10,10,30,10. Эту линию нарисуйте правильно.
2) 10,10,10,30. Эту линию нарисуйте правильно.
3) 10,10,20,20. Эту линию нарисуйте правильно.
4) но для точек 50,10,40,20 линия нарисована, но это неправильно.
Я отслеживаю программу и узнаю, что x и y каждый раз увеличиваются на 1.но на самом деле это должно быть x должно уменьшаться, а y должно увеличиваться. Но алгоритм dda не имеет возможности для такого типа линий. Тогда что же мне делать??

Что я уже пробовал:

#include <stdio.h>
#include <math.h>
#include <graphics.h>
#include <conio.h>
#define r1(a) (a+0.5)
int gdrivers=DETECT,gmode;
void dda(int xa,int ya,int xb,int yb);
void main()
{
	initgraph(&gdrivers,&gmode,"c:\\tc\\bgi");
    	setcolor(BLUE);	
	dda(10,10,30,10);
	dda(10,10,10,30);
	dda(10,10,20,20);
	dda(50,10,40,20);
   	getch();
}
void dda(int xa,int ya,int xb,int yb)
{
	int x, y;
	float xincr,yincr,xp,yp;
	int k,steps,dx,dy;
	float temp;
	dx = abs(xa-xb);
	dy = abs(ya-yb);

	if(dx > dy)	{
		steps=dx;}
	else{
		steps=dy;	}
	temp = (float)(steps);
	xincr=dx/temp;
	yincr=dy/temp;
	x = xa;
	y = ya;
	putpixel(x,y,4);
	xp = x;
	yp = y;
	for(k=0;k<steps;k++)
	{
		xp+=xincr;
		yp+=yincr;
		x = r1(xp);
		y = r1(yp);
		putpixel(x,y,4);
	}
}

Patrice T

Покажи свой код !

An@mik@

Я улучшаю свой вопрос и пишу код.

An@mik@

для последнего вызова dda он показывает неправильный вывод

1 Ответов

Рейтинг:
6

Patrice T

Цитата:
Тогда что же мне делать?

Прежде всего, я бы изменил тестовые данные, чтобы нарисовать 12 линий часов от центра, просто чтобы покрыть любую возможность.
dx = abs(xa-xb); // because of abs here
dy = abs(ya-yb); // and here

if(dx > dy)  {
    steps=dx;}
else{
    steps=dy;   }
temp = (float)(steps);
xincr=dx/temp; // the increments are loosing the direction of drawing
yincr=dy/temp; // and this 1 too

Ваш код работает только в 1 квадранте.