IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Си, графика, компилятор Turbo C++
сообщение
Сообщение #1


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


Программа вырисовывает пиксели множество раз, так что в конце-концов должен зарисоваться весь экран.
Но несколько пикселей она пропускает, оставляя незакрашенными. В чем тут дело?
#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();
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
так что в конце-концов должен зарисоваться весь экран
Ничего подобного... Ты в 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);
}
}
}


И расскажи мне, почему, если у тебя есть столько повторений, ты не допускаешь, что могут быть пропуски?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


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

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



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.09.2020 22:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name