Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Си, графика

Автор: Тёмный Эльф 8.03.2007 14:59

Программа вырисовывает пиксели множество раз, так что в конце-концов должен зарисоваться весь экран.
Но несколько пикселей она пропускает, оставляя незакрашенными. В чем тут дело?

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define PATHTODRIVER "d:\\tc\\bgi\\"

void f1(int x1, int y1, int x2, int y2, int color)
{
long a=0;
long k=1024;
long max, x, y;
if(abs(x2-x1) > abs(y2-y1))
{
if(x1 > x2)
{ x=x2; y=y2; max=x1; }
else
{ x=x1; y=y1; max=x2; }
a=(k*(y2-y1))/(x2-x1); y*=k;
while(abs(max-x))
{
x++; y+=a;
putpixel(x, y/k, color);
}
}
else
{
a=(k*(x2-x1))/(y2-y1);
if(y1 > y2)
{ x=x2; y=y2; max=y1; }
else
{ x=x1; y=y1; max=y2; }
x*=k;
while(abs(max-y))
{
y++; x+=a;
putpixel(x/k, y, color);
}
}
}

void main (void)
{
int gdriver = DETECT, gmode, errorcode;
initgraph( &gdriver, &gmode, PATHTODRIVER);
int i,j;
int x0 = 0;
int y0 = 480;
for(int round=0; round<3; round++)
{
cleardevice();
for(i=0,j=0; i<=640; i++) f1(x0, y0, i, j, 6);
for( ;j<=480;j++) f1(x0, y0, i, j, 6);
}
closegraph();
}

Автор: volvo 8.03.2007 15:55

Цитата
так что в конце-концов должен зарисоваться весь экран
Ничего подобного... Ты в putpixel используешь целочисленное деление, так будь готов к тому, что один и тот же пиксель обработается дважды, а другой вообще не затронется... Смотри... Замени свою процедуру F1 на мою:

void f1(int x1, int y1, int x2, int y2, int color)
{
long a=0;
long k=1024;
long max, x, y;
if(abs(x2-x1) > abs(y2-y1))
{
if(x1 > x2)
{ x=x2; y=y2; max=x1; }
else
{ x=x1; y=y1; max=x2; }
a=(k*(y2-y1))/(x2-x1); y*=k;
while(abs(max-x))
{
x++; y+=a;
if(getpixel(x, y/k) == color) putpixel(x, y/k, YELLOW);
else putpixel(x, y/k, color);
}
}
else
{
a=(k*(x2-x1))/(y2-y1);
if(y1 > y2)
{ x=x2; y=y2; max=y1; }
else
{ x=x1; y=y1; max=y2; }
x*=k;
while(abs(max-y))
{
y++; x+=a;
if(getpixel(x/k, y) == color) putpixel(x/k, y, YELLOW);
else putpixel(x/k, y, color);
}
}
}


И расскажи мне, почему, если у тебя есть столько повторений, ты не допускаешь, что могут быть пропуски?

Автор: Тёмный Эльф 9.03.2007 1:56

Смешно. lol.gif Теперь, когда я заменил процедуру, не только остались пропуски, но и еще множество прибавилось, которые закрасились желтым цветом. blink.gif

На самом деле если поменять направление закраски, так чтобы зарисовывалось справа налево, то это процедурка все хорошо закрашивает. Хз.