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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

Пример со страницы 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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.