Генерация точек отрезка методом симметричного ЦДА. Функция определения знака целого числа. Вывод "крупного" пиксела на экран

Страницы работы

14 страниц (Word-файл)

Фрагмент текста работы

Пример со страницы 16:

//Генерация точек отрезка методом симметричного ЦДА

#include <conio.h>

#include <graphics.h>

int x0, y0; //Координаты центра системы координат относит. лев. верх. угла

int hx=3, hy=3; //1/2 ширины и длины пиксела

//Функция определения знака целого числа

int sign (int r)

{

if (r>0) return 1;

else if (r<0) return -1;

else return 0;

}

//Вывод "крупного" пиксела на экран

void point( int ix, int iy )

{bar(x0+hx*2*ix-hx+1, y0-hy*2*iy-hy+1,x0+hx*2*ix+hx-1, y0-hy*2*iy+hy-1);}

//Генерация и вывод точек отрезка

void symcda(int x0, int y0, int x1, int y1)

{

int res_x=512, res_y=512;  //Инициализация аккумуляторов

int x=x0, y=y0; //Начало отрезка

int dx=x1-x0, dy=y1-y0;

int ex=sign(dx), ey=sign(dy);

point (x,y);               //Выводим первый пиксел

while (!(x==x1 && y==y1))  //Цикл пока не дойдем до конца отрезка

{

res_x+=dx;

//Проверка аккумулятора

if (res_x>=1024 || res_x <0)

{

x+=ex;

point(x,y);//Вывод очередного пиксела

res_x-=ex*1024;

}

res_y+=dy;

//Проверка аккумулятора

if (res_y>=1024 || res_y<0)

{

y+=ey;

point(x,y);//Вывод очередного пиксела

res_y-=ey*1024;

}

}

}

void main()

{

int gdriver=DETECT, gmode;

initgraph (&gdriver, &gmode, "");

x0=getmaxx()/2; y0=getmaxy()/2;

moveto(0,y0); linerel(getmaxx(),0);

moveto(x0,0); linerel(0, getmaxy());

symcda(0,0,5,3);  //Вывод отрезка

getch();                //Ожидание нажатия клавиши

closegraph();           //Выключение графического режима

}        


Пример со страницы 17:

//Метод простого ЦДА

#include<conio.h>

#include<graphics.h>

#include<math.h>

int x0, y0; //Координаты центра системы координат относит. лев. верх. угла

int hx=3, hy=3; //1/2 ширины и длины пиксела

//Функция определения знака целого числа

sign(int r)

{

if(r>0) return 1;

else if(r<0) return -1;

else return 0;

}

//Вывод "крупного" пиксела на экран

void point(int ix, int iy)

{bar(x0+hx*2*ix-hx+1, y0-hy*2*iy-hy+1,x0+hx*2*ix+hx-1, y0-hy*2*iy+hy-1);}

//Генерация и вывод точек отрезка

void line_cda(int x0,int y0,int x1,int y1)

{

int l,x,y;

if(abs(x1-x0)>abs(y1-y0)) l=abs(x1-x0);

else l=abs(y1-y0);

if(l==0) {point(x0,y0); return;}

float hhx=1, hhy=1;

float dx=(float)((x1-x0)/float(l));

float dy=(float)((y1-y0)/float(l));

int ex=sign(x1-x0), ey=sign(y1-y0);

float rez=0.5;          //аккумулятор

x=x0; y=y0;

int flagx=0, flagy=0;   //флаги для проверки на конечную точку

do

{

if(abs(dx)<abs(dy))

{

//приращение всегда по у, а по х при условии rez<=0 rez>=1

point(x,y);

rez+=dx;

if(rez>=1||rez<=0)

{

x+=ex*hhx;

rez-=ex;

}

if(!flagx) flagx=x==x1?1:0;

y+=ey*hhy;

if(!flagy) flagy=y==y1?1:0;

}

else

{

//всегда по х, а по у при условии rez<=0 rez>=1

point(x,y);

x+=ex*hhx;

if(!flagx)flagx=x==x1?1:0;

rez+=dy;

if(rez>=1||rez<=0) {y+=ey*hhy; rez-=ey;}

if(!flagy)flagy=y==y1?1:0;

}

}

while(!(flagx==1 && flagy==1));

point(x1,y1);     //последняя точка

}

void main()

{

int gdriver=DETECT, gmode;

initgraph (&gdriver, &gmode, "");

x0=getmaxx()/2; y0=getmaxy()/2;

moveto(0,y0); linerel(getmaxx(),0);

moveto(x0,0); linerel(0, getmaxy());

line_cda(0,0,5,3);      //Вывод отрезка

getch();                //Ожидание нажатия клавиши

closegraph();           //Выключение графического режима

}


Пример со страницы 20:

//Метод Брезенхема

#include<conio.h>

#include<graphics.h>

#include<math.h>

int x0, y0; //Координаты центра системы координат относит. лев. верх. угла

int hx=3, hy=3; //1/2 ширины и длины пиксела

//Вывод "крупного" пиксела на экран

void point(int ix, int iy)

{bar(x0+hx*2*ix-hx+1, y0-hy*2*iy-hy+1,x0+hx*2*ix+hx-1, y0-hy*2*iy+hy-1);}

//Функция вывода отрезка по алгоритму Брезенхема

void bresenham(int ix0, int iy0, int ix1, int iy1)

{

int ix, iy, delta_x, delta_y, esh, sx, sy;

int register temp, swab, i;

ix=ix0; iy=iy0;

delta_x=abs(ix1-ix0); delta_y=abs(iy1-iy0);

if (ix1-ix0>=0) sx=1; else sx=-1;

if (iy1-iy0>=0) sy=1; else sy=-1;

if (ix1==ix0) sx=0;

if (iy1==iy0) sy=0;

//Обмен значений delta_x delta_y в зависимости от угла

if (delta_y > delta_x)

{

temp=delta_x;

delta_x=delta_y;

delta_y=temp;

swab=1;

}

else swab=0;

//Инициализация Е с поправкой на половину пиксела

esh=2*delta_y-delta_x;

for(i=0;i<=delta_x;i++)

{

point(ix,iy);

while(esh>=0)

{

if (swab==1) ix=ix+sx; else iy=iy+sy;

esh=esh-2*delta_x;

}

if (swab==1)iy=iy+sy; else ix=ix+sx;

esh=esh+2*delta_y;

}

}

void main()

{

int gdriver=DETECT, gmode;

initgraph (&gdriver, &gmode, "");

x0=getmaxx()/2; y0=getmaxy()/2;

moveto(0,y0); linerel(getmaxx(),0);  //Вывод осей координат

moveto(x0,0); linerel(0, getmaxy());

bresenham(0,0,5,3);     //Вывод отрезка

getch();                //Ожидание нажатия клавиши

closegraph();           //Выключение графического режима

}


Пример со страницы 22:

#include <conio.h>

#include <graphics.h>

#include <math.h>

int x0, y0 , hx=3, hy=3;

//Функция определения знака целого числа

int sign (int r)

{

if (r>0) return 1;

else if (r<0) return -1;

else return 0;

}

//Функция вывода крупного пиксела

void point (int ix, int iy)

{bar(x0+hx*2*ix-hx+1, y0-hy*2*iy-hy+1, x0+hx*2*ix+hx-1, y0-hy*2*iy+hy-1);}

//Генерация точек прямой методом приращений

void line4 (int x0, int y0, int x1, int y1)

{

int x=x0, y=y0;

int dx=x1-x0, dy=y1-y0;

int delta=0, ex=sign(dx), ey=sign(dy);

point (x,y);

//Если dx = 0, то выводится вертикальный отрезок

if (dx==0)

{while (y!=y1) point (x, ++y); return;}

//Если dy = 0, то выводится горизонтальный отрезок

if (dy==0)

{while (x!=x1) point (++x, y); return;}

//Если abs(dx) = abs(dy):

if (abs(dx)==abs(dy))

{

while (x!=x1) {x+=ex; y+=ey; point(x,y);}

return;

}

//Основной цикл

while (!(x==x1 && y==y1))

{

if (delta<=0)

{

if (dy*ex-dx*ey>0)

{

x+=ex; y+=ey; delta+=dy*ex-dx*ey;

point(x,y);

}

else

if (abs(dx)>abs(dy))

{

x+=ex; delta+=dy*ex;

point(x,y) ;

}

else

{

y+=ey; delta -=dx*ey;

point(x,y);

}

}

else

{

if (dy*ex-dx*ey<0)

{

x+=ex; y+=ey; delta+=dy*ex-dx*ey;

point(x,y);

}

else

if (abs(dx)>abs(dy))

{

x+=ex; delta+=dy*ex;

point(x,y);

}

else

{

y+=ey; delta-=dx*ey;

point(x,y) ;

}

}

}

}

void main()

{

int gdriver=DETECT, gmode;

initgraph(&gdriver, &gmode, "");

x0=getmaxx()/2; y0=getmaxy()/2;

moveto(0,y0); linerel(getmaxx(),0);

moveto(x0,0); linerel(0, getmaxy());

line4(0,0,5,3);

getch();

closegraph();

}


Пример со страницы 24:

//Метод приращений использующий четыре перемещения

#include<conio.h>

#include<graphics.h>

#include<math.h>

int x0, y0; //Координаты центра системы координат относит. лев. верх. угла

int hx=3, hy=3; //1/2 ширины и длины пиксела

//Вывод "крупного" пиксела на экран

void point(int ix, int iy)

{bar(x0+hx*2*ix-hx+1, y0-hy*2*iy-hy+1,x0+hx*2*ix+hx-1, y0-hy*2*iy+hy-1);}

//Функция вывода отрезка по методу

//приращений использующий четыре перемещения

void line4(int x0, int y0, int x1, int y1)

{

int dx=abs(x1-x0), dy=abs(y1-y0);

int ex, ey;

if (x1>x0) ex=1; else ex=-1;

if (y1>y0) ey=1; else ey=-1;

int E=0, x=x0, y=y0;

while((y!=y1) || (x!=x1))

{

point(x,y);

if (E>0) {E-=dx; y+=ey;} else {E+=dy; x+=ex;}

}

point(x,y);

}

void main()

{

int gdriver=DETECT, gmode;

initgraph (&gdriver, &gmode, "");

x0=getmaxx()/2; y0=getmaxy()/2;

moveto(0,y0); linerel(getmaxx(),0);  //Вывод осей координат

moveto(x0,0); linerel(0, getmaxy());

line4(0,0,5,3);         //Вывод отрезка

getch();                //Ожидание нажатия клавиши

closegraph();           //Выключение графического режима

}


Пример со страницы 25:Построение границы многоугольника с использованием алгоритма Брезенхема и закраски многоугольника с использованием алгоритма с запоминанием точек границы в стек.

#include <math.h>

#include <conio.h>

#include <graphics.h>

#define pop() stx[--deep]

#define push(x) stx[deep++]=x

void horline (int y, int x0, int x1)

{

int i;

if (x0>x1) {i=x1; x1=x0; x0=i;}

for (i=x0; i<=x1; i++) putpixel(i, y,15 );

}

void fl(int *arx, int *ary, int dimar)

{

int deep=0;

int stx[1000];

int i0, iglob, ix0, iy0, ix1, iy1;

int ymin;

int ix, iy, deltax , deltay, esh, sx, sy;

int temp, swab, i;

//Находим наименьший ary[i]

i0=0; ymin=ary[0];

for (i=0;i<dimar;i++)

if (ary[i]<ymin) {i0=i; ymin=ary[i];}

//на отрезке (i, i+1) проводим прямую линию от

//arx[i], ary[i] до  arx[i+1], ary[i+1]

iglob=i0;

do

{

ix0=arx[iglob]; iy0=ary[iglob];

iglob++; if (iglob==dimar) iglob=0;

ix1=arx[iglob]; iy1=ary[iglob];

//Основной цикл - вывод отрезка по алгоритму Брезенхема

ix=ix0;     iy=iy0;

deltax=abs(ix1-ix0);

deltay=abs(iy1-iy0);

if (ix1-ix0>=0) sx=1;

else sx=-1;

if (iy1-iy0>=0) sy=1;

else sy = -1;

if (deltay>deltax)

{

temp=deltax;

deltax=deltay;

deltay=temp;

swab=1;

}

else

swab = 0;

esh=2*deltay-deltax;

for (i=1;i<=deltax;i++)

{

while (esh>=0)

{

if (swab==1) ix = ix + sx;

else

{

iy=iy+sy;

if (sy==1) push (ix);

if (sy==-1)

{

temp=pop();

horline(iy,ix,temp);

}

}

esh=esh-2*deltax;

}

if (swab==1)

{

iy=iy+sy;

if (sy==1) push(ix);

if (sy==-1)

{

temp=pop();

horline(iy,ix,temp);

}

}

else ix=ix+sx;

esh=esh+2*deltay;

}

}

while (i0!=iglob);

}

void main()

{

int gd=DETECT, gm;

int arx[3]={200,150,100};

int ary[3]={120,180,60};

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

fl(arx,ary,3);

getch();

closegraph() ;

}


Пример со страницы 28: Закрасить квадрат со стороной 40 пикселов, используя алгоритм заполнения с установкой режима XOR_PUT. Левой верхней вершиной квадрата является точка с координатами (20,20). В качестве перегородки использовать вертикальную линию x=80.

#include<conio.h>

#include<graphics.h>

#include<math.h>

#include<dos.h>

//xпред, yпред

int oldx,oldy;

//Функция сравнивает текущею точку обхода периметра

//с предыдущей и выполняет соответствующие действия

//в качестве параметров передаются координаты текущей точки

void XorLine(int x, int y)

{

if (y>oldy) line(x,y,80,y);

if (y<oldy) line(oldx,oldy,80,oldy);

oldx=x; oldy=y;    //текущая точка становится предыдущей

}

void main()

{

int i, gdriver=DETECT, gmode;

//иницализация графического режима

initgraph (&gdriver, &gmode, "");

setcolor(RED);              //установка красного цвета

rectangle(19,20,60,61);    //рисование периметра квадрата (необязательно)

line(80,20,80,60);         //рисование перегородки (необязательно)

setcolor(WHITE);              //установка белого цвета

setwritemode(XOR_PUT);     //установка режима вывода XOR_PUT

oldx=20; oldy=20;          //инициализируем предыдущие координаты

//проход по левой стороне квадрата с задержкой

for(i=20;i<=60;i++) {XorLine(20,i); delay(200);}

//проход по нижней стороне квадрата

for(i=20;i<=60;i++) XorLine(i,60);

//проход по правой стороне квадрата с задержкой

for(i=60;i>=20;i--) {XorLine(60,i); delay(200);}

//проход по верхней стороне квадрата с задержкой

for(i=60;i>=20;i--) XorLine(i,20);

getch();                //Ожидание нажатия клавиши

closegraph();           //Выключение графического режима

}


Пример со страницы 30:

#include <conio.h>

#include <graphics.h>

#define pop() x=stx[--deep];y=sty[deep]

#define push(a,b) stx[deep]=a;sty[deep++]=b

int deep=0, stx[1000], sty[1000] ;

int xmax, xmin=0, ymax, ymin=0 ;

void flstr(int color, int x, int y)

{

int tempx;

int xleft, xright;

int xenter;

int flag, i ;

push(x,y) ;

while(deep>0)

{

pop() ;

if(getpixel(x,y)!=color)

{

putpixel(x,y,color) ;

tempx=x; //сохранение текущей коорд. x

x++;     //перемещение вправо

while(getpixel(x,y)!=color && x<=xmax)

putpixel(x++, y, color);

xright=x-1;

x=tempx; x--; //перемещение влево

while(getpixel(x,y)!=color && x>=xmin)

putpixel(x--, y, color);

xleft=x+1;

x=tempx;

for(i=0;i<2;i++)

{

//при i=0 проверяем нижнюю,

//а при i=1 - верхнюю строку

if(y<ymax && y>ymin)

{

x=xleft; y+=1-i*2;

while(x<=xright)

{

flag=0;

while(getpixel(x,y)!=color && x<xright)

{

if(flag==0) flag=1;

x++;

}

if (flag==1)

{

if(x==xright &&

getpixel(x,y)!=color)

{

push(x,y);

}

else

{push(x-1,y);}

flag=0;

}

xenter=x;

while(getpixel(x,y)==color && x<xright)

x++;

if(x==xenter) x++;

}

}

y-- ;

}

}

}

}

void main()

{

int gd=DETECT , gm;

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

moveto (280, 110);

lineto (250, 180);

lineto (50, 20);

lineto (280, 110);

xmax=getmaxx();ymax=getmaxy();

flstr (WHITE, 270, 110);

getch();

closegraph();

}


Пример со страницы 32:

#include <conio.h>

#include <graphics.h>

int xmax, xmin=0, ymax, ymin=0;

void flrec( int color, int x, int y)

{

int xleft=x, xright=x, yy;

if (getpixel(x,y)==color) return;

if (y>ymax||y<ymin) return;

if (x>xmax||x<xmin) return;

while (getpixel(xleft,y)!=color&& xleft>=xmin)

putpixel(xleft--, y, color);

xright++;

while (getpixel(xright,y)!=color&& xright<=xmax)

putpixel (xright++,y,color);

for (yy=y-1;yy<=y+1;yy+=2)

{

x=xleft+1;

while (x<xright&&x<xmax)

{

if (getpixel(x,yy)!=color) flrec(color,x,yy);

x++;

}

}

}

void main()

{

int gd=DETECT, gm;

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

moveto (280, 110);

lineto (250, 180);

lineto (50, 20);

lineto (280, 110);

xmax=getmaxx();ymax=getmaxy();

flrec(WHITE, 280, 110);

getch();

closegraph();

}


Пример со страницы 36:

#include <graphics.h>

#include <conio.h>

int x0, y0; //экранные координаты начала координат

int hx, hy; //половины ширины и высоты пиксела

void point(int ix, int iy)

{bar (x0+hx*2*ix-hx+1, y0-hy*2*iy-hy+1, x0+hx*2*ix+hx-1, y0-hy*2*iy+hy-1);}

void main()

{

int gdriver = DETECT, gmode;

int x, y, a=30, b=20;

float delta;

long a2, b2;

hx=3; hy=3;

//Инициализация графического режима

initgraph ( &gdriver, &gmode, "") ;

x0 = getmaxx()/2; y0 = getmaxy()/2;

moveto(0,y0); linerel(getmaxx(),0);

moveto(x0,0); linerel(0, getmaxy());

a2=a*a; b2=b*b;

x=a; y=0; delta=0;            //начальная точка (x0,y0))

while (b2*x>a2*y)             //пока вектор касательной принадлежит третьей

Похожие материалы

Информация о работе

Тип:
Написанные программы на языках программирования
Размер файла:
73 Kb
Скачали:
0