Алгоритм DDA не рисует линии для некоторых координат?

Мой код работает правильно для уклона = 1, но не для других уклонов. Его рисование горизонтальной или вертикальной линии для наклонов, отличных от 1. Что не так с этим кодом. Любая помощь будет оценена.

#include <graphics.h>
#include <stdio.h>
#include <math.h>

int main( )
{
int x,y,x1,y1,x2,y2,dx,dy;
float step;

int i,gd,gm;

printf("Enter the value of x1,y1: ");
scanf("%f%f",&x1,&y1);
printf("Enter the value of x2,y2 : ");
scanf("%f%f",&x2,&y2);


detectgraph(&gd,&gm);
initgraph(&gd,&gm,"");

dx=abs(x2-x1);
dy=abs(y2-y1);

if(dx>=dy)
step=dx;
else
step=dy;

dx=dx/step;
dy=dy/step;

x=x1;
y=y1;

i=1;
while(i<=step)
{
      putpixel(x,y,1);
      x=x+dx;
      y=y+dy;
      i=i+1;
      delay(100);
}
getch();
}

person Ani    schedule 31.07.2013    source источник
comment
scratchapixel.com/lessons/3d-basic-lessons / для получения некоторой информации и кода по алгоритму DDA в целом.   -  person user18490    schedule 04.08.2013


Ответы (2)


dx=dx/step;
dy=dy/step;

Вы сделали шаг числом с плавающей запятой, но dx и dy — целые числа. Таким образом, это деление даст вам 0 в одном из этих двух значений. У меня сложилось впечатление, что все подпрограммы DDA были целочисленными, поэтому наличие числа с плавающей запятой вообще заставляет меня задуматься. Я посмотрю глубже на алгоритм и посмотрю, что еще я найду.

Вот процедура, использующая числа с плавающей запятой таким образом, чтобы не обнулить шаг.

и другой для Windows.

person Michael Dorgan    schedule 31.07.2013
comment
после исправления dx,dy, чтобы плавать, он работает для некоторых, но есть проблема, например. если я беру (200,0) и (0,200), линия нарисована неправильно. - person Ani; 31.07.2013
comment
Вам нужно выделить горизонтальные/вертикальные линии в особом случае, чтобы предотвратить деление на 0. Посмотрите различные примеры в Интернете, чтобы получить рекомендации здесь. - person Michael Dorgan; 01.08.2013

Кажется, вы просто принимаете одно значение в

scanf("%f%f",&x1);
scanf("%f%f",&y1);

заявления. Попробуйте исправить это и запустить код еще раз.

person Keval Doshi    schedule 31.07.2013
comment
ой извините..это опечатка. я правильно написал в реальном коде. - person Ani; 31.07.2013