Здавалка
Главная | Обратная связь

Рекомендации по составлению программы



 

1) Произвести описание всех переменных, (переменная foregcolor=getcolor()).

2) Вычислить вспомогательные переменные:

sq3=sqr(3.0); ha=0.5*a; c=-0.5; s=0.5*sq3; b=w/s; hb=0.5*b.

3) Определяем координаты центра Xc, Yc и координаты вершин треугольника

Xc = 0.5*X_max; Yc=0.5(Y_max-r);

X[0]= -ha-2*b-hb; Y[0]= -r-w;

X[1]= X[0]+hb; Y[1]=-r-2*w;

X[2[=-X[1]; Y[2]=Y[1];

X[3]= hb; Y[3]= 2*r+w;

X[4]=0.0; Y[4]= 2*r;

X[5]=ha+hb; Y[5]= y[0].

4) Организуем два цикла: внешний (по i) для выбора трех цветов окраски и внутренний (по j) для преобразования координат в пиксельные

points[2*j]=(xc+xj),

points[2*j+1]=(yc+yj).

Координаты xj=x[j], yj=y[j] вычисляются по формулам поворота

x[j]=c*xj-s*yj; c= cos( ), s= sin( ).

y[j[=s*xj+c*yj.

5) Для замыкания контура ввести points[12]=points[0]; points[13]=points[1].

6) Установить fillpattern=INTERLEAVE_FILL;

setfillstyle(fillpattern,foregroundcolor );

fillpoly(7,points).

 

Задание на выполнение работы

 

1) Внимательно ознакомиться с содержанием работы и с геометрическими преобразованиями для построения “магического” треугольника.

2) Составить полную программу построения полигона.

3) Откомпилировать и отладить программу.

4) Внести изменения в программу для получения различных вариантов заливки полигона.

 

 

Содержание отчета

 

1) Краткое изложение содержания работы с необходимыми геометрическими построениями.

2) Распечатка программы с подробными комментариями.

3) Выводы по работе.


Литература основная

 

1. Пореев В.Н. Компьютерная графика.- СПб.: БХВ-Петербрг, 2002.-432 с

2. Березин Б.И., Березин С.Б. Начальный курс Си и С++.- М.: ДИАЛОГ-МИФИ, 2001.-288 с.

3. Культин Н.Б.Самоучитель С++ Builder.- СПб.: БХВ – Петербург, 2006.- 320 с.

 

 

Литература дополнительная

4. Боресков А.В., Шикин Е.В., Шикина Г.Е. Компьютерная графика: первое знакомство/Под ред, Шикина Е.В.-М.: Финансы и статистика,1996.-176 с.

5. Аммерал Л. Принципы программирования в машинной графике / Пер. с англ.-М.:”Сол Систем”,1992.-224 с.

6. Аммерал Л. Программирование графики на Турбо Си / Пер. с англ. -М.:

”Сол Систем”,1992.-221 с.

7. Шишкин А.Д.. Программирование на языке Си. Учебное пособие. СПб.:изд. РГГМУ, 2003.-104 с.

 

 

ПРИЛОЖЕНИЕ

 

Программа Circle.c

 

#include <graphics.h>

/*#include"grasptco.h"*/

/*Использование графических функций для рисования окружностей*/

#include<zaggraf.c>

void main(void)

{

int zaggraf(void);

int zaggraf();

int driver,mode,errorcode;

register int i;

int X_max,Y_max;

float xC,yC,d,rmax,r,x_max,y_max;

printf("расстояние в дюймах например 10:");

scanf("%f",&d);

driver=DETECT;

initgraph(&driver,&mode,"");

errorcode=graphresult();

if(errorcode!=grOk) /*если произошла ошибка*/

{

printf("Ошибка:%s\n",grapherrormsg(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /*Завершение работы программы*/

}

X_max=getmaxx(),Y_max=getmaxy();

xC=0.5*X_max;

yC=0.5*Y_max; rmax=200.5;

for(r=d;r<=rmax;r+=d)

circle(xC,yC,r);

getch();

closegraph();

}

 

Программа Clipd1.c

 

/*Program Clipdemo*/

/* Рисование многоугольников,вписанных в квадрат*/

#include <graphics.h>

#include<zaggraf.c>

#include "math.h"

float xmin,xmax,ymin,ymax;

main()

{

int i;

float r,pi,alpha,phi0,phi,x0,y0,x1,y1,x2,y2,dx,dy;

pi=4.0*atan(1.0);

alpha=72.0*pi/180.0;phi0=0.0;

printf("Введите xmin,ymin,xmax,y max\n");

scanf("%f,%f,%f,%f",&xmin,&ymin,&xmax,&ymax);

printf("Введите X0,y0\n");

scanf("%f,%f",&x0,&y0);

zaggraf();

moveto(xmin,ymin);lineto(xmax,ymin);lineto(xmax,ymax);

lineto(xmin,ymax);lineto(xmin,ymin);

for(r=10.5;r<250.5;r+=20.5)

{

x2=x0+r*cos(phi0);y2=y0+r*sin(phi0);

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

{

phi=phi0+i*alpha;

x1=x2;y1=y2;

x2=x0+r*cos(phi);y2=y0+r*sin(phi);

moveto(x1,y1);lineto(x2,y2);

}

}

getch();

closegraph();

}

 

 

Программа Clipdemo.c

 

/*clipdemo1*/

/*Рисование многоугольников */

/*Удаление линий,выходящих за пределы окна*/

#include <graphics.h>

#include<zaggraf.c>

#include "math.h"

float xmin=50.0,xmax=600.0,ymin=80.0,ymax=400.0;

main()

{

int i;

float r,pi,alpha,phi0,phi,x0,y0,x1,y1,x2,y2,dx,dy;

pi=4.0*atan(1.0);

alpha=72.0*pi/180.0;phi0=0.0;

x0=300.0;y0=270.0;

zaggraf();

moveto(xmin,ymin);lineto(xmax,ymin);lineto(xmax,ymax);

lineto(xmin,ymax);lineto(xmin,ymin);

for(r=10.5;r<400.5;r+=20.5)

{

x2=x0+r*cos(phi0);y2=y0+r*sin(phi0);

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

{

phi=phi0+i*alpha;

x1=x2;y1=y2;

x2=x0+r*cos(phi);y2=y0+r*sin(phi);

clip(x1,y1,x2,y2);

}

}

}

int code(x,y) float x,y;

{ return(x<xmin)<<3|(x>xmax)<<2|(y<ymin)<<1|(y>ymax);

}

clip(x1,y1,x2,y2) float x1,y1,x2,y2;

{int c1=code(x1,y1),c2=code(x2,y2);float dx,dy;

while(c1|c2)

{ if(c1&c2) return;

dx=x2-x1;dy=y2-y1;

if(c1)

{ if(x1<xmin){y1+=dy*(xmin-x1)/dx;x1=xmin;} else

if(x1>xmax){y1+=dy*(xmax-x1)/dx;x1=xmax;}else

if(y1<ymin){x1+=dx*(ymin-y1)/dy;y1=ymin;}else

if(y1>ymax){x1+=dx*(ymax-y1)/dy;y1=ymax;}

c1=code(x1,y1);

} else

{ if(x2<xmin){y2+=dy*(xmin-x2)/dx;x2=xmin;}else

if(x2>xmax){y2+=dy*(xmax-x2)/dx;x2=xmax;}else

if(y2>ymin){x2+=dx*(ymin-y2)/dy;y2=ymin;}else

if(y2>ymax){x2+=dx*(ymax-y2)/dy;y2=ymax;}

c2=code(x2,y2);

}

}

moveto(x1,y1);lineto(x2,y2);

}

Программа Hilbert.c

 

/*HILBERT*/

/*Построение рекурсий*/

#include <graphics.h>

#include"grasptco.c"

#include<zaggraf.c>

typedef struct{float x,y;}vec;

int recdepth,steps;

void Hilbert(vec A,vec B,vec C,vec dAB,vec dAC,int n)

{ vec D,E,F,G,H,I,J,K,L;

if(n>0)

{ D.x=(A.x+C.x-dAC.x)/2;

D.y=(A.y+C.y-dAC.y)/2;

E.x=(A.x+B.x-dAB.x)/2;

E.y=(A.y+B.y-dAB.y)/2 ;

F.x=D.x+dAC.x;F.y=D.y+dAC.y;

G.x=F.x+E.x-A.x;G.y=F.y+E.y-A.y;

H.x=G.x+dAB.x;H.y=G.y+dAB.y;

I.x=F.x+B.x-A.x;I.y=F.y+B.y-A.y;

J.x=C.x+H.x-F.x;J.y=C.y+H.y-F.y;

K.x=I.x-dAC.x;K.y=I.y-dAC.y;

L.x=H.x-dAC.x;L.y=H.y-dAC.y;

Hilbert(A,D,E,dAC,dAB,n-1);

lineto(F.x,F.y);

Hilbert(F,G,C,dAB,dAC,n-1);

lineto(H.x,H.y);

Hilbert(H,I,J,dAB,dAC,n-1);

lineto(K.x,K.y);

dAB.x=-dAB.x;dAB.y=-dAB.y;

dAC.x=-dAC.x;dAC.y=-dAC.y;

Hilbert(K,B,L,dAC,dAB,n-1);

}

}

void square(float xA,float yA,float xB,float yB,float xC,float yC)

{

vec A,B,C,dAB,dAC;

A.x=xA; A.y=yA;

C.x=xC;C.y=yC;

B.x=xB; B.y=yB;

 

dAB.x=(xB-xA)/steps;

dAB.y=(yB-yA)/steps;

dAC.x=(xC-xA)/steps;

dAC.y=(yC-yA)/steps;

moveto(xA,yA);

Hilbert(A,B,C,dAC,dAB,recdepth);

}

main()

{ float xCenter,yCenter,h,xP,yP,xQ,yQ,xR,yR;

printf("\Введите глубину рекурсии:");

scanf("%d",&recdepth);

steps=(1<<recdepth)-1;

zaggraf();

X_max=600; Y_max=500;

xCenter=X_max/2;

yCenter=Y_max/2;

h=Y_max/30;

xP=xR=xCenter-3*h;

xQ=xCenter+3*h;

yP=yQ=yCenter-4*h;

yR=yCenter+4*h;

setcolor(BLUE);

square(xQ,yQ,xR,yR,xQ+8*h,yQ+6*h);

setcolor(SLASH_FILL);

square(xR,yR,xP,yP,xR-8*h,yR);

setcolor(GREEN);

square(xP,yP,xQ,yQ,xP,yP-6*h);

}

 

Программа Intria.c

 

/*Program INTRIA */

/*Построение рекурсивного треугольника*/

#include<stdio.h>

#include<graphics.h>

#include "grasptco.c"

#include<zaggraf.c>

void tria(float xA,float yA,float xB,float yB,float xC,

float yC,int n)

{

float xP,yP,xQ,yQ,xR,yR;

if(n>0)

{ xP=(xB+xC)/2;yP=(yB+yC)/2;

xQ=(xC+xA)/2;yQ=(yC+yA)/2;

xR=(xA+xB)/2;yR=(yA+yB)/2;

moveto(xP,yP);lineto(xQ,yQ);

lineto(xR,yR);lineto(xP,yP);

tria(xA,yA,xR,yR,xQ,yQ,n-1);

tria(xB,yB,xP,yP,xR,yR,n-1);

tria(xC,yC,xQ,yQ,xP,yP,n-1);

}

}

main()

{ int n;

int xA,yA,xB,yB,xC,yC;

X_max=500;Y_max=300;

printf("\Глубина рекурсии(например 7):");

scanf("%d",&n);

zaggraf();

xA=0;yA=Y_max;xB=X_max;yB=Y_max;xC=0;yC=0;

moveto(xA,yA);lineto(xB,yB);lineto(xC,yC);lineto(xA,yA);

tria(xA,yA,xB,yB,xC,yC,n);

/* endgr();*/

}

 

Программа magtria.c

 

 

#include <graphics.h>

#include<math.h>

#include<stdio.h>

/*МАГИЧЕСКИЙ ТРЕУГОЛЬНИК*/

#include<zaggraf.c>

main(void)

{

float a,b,ha,hb,c,sq3,xC,yC,x[6],y[6],xl,yl,r,w,s;

int points[14],i,l,foregroundcolor,fillpattern;

printf("Магический треугольник\n");

printf("\nРазмер стороны вн-го треуг-ка( например,100:");

scanf("%f",&a);ha=0.5*a;

sq3=sqrt(3.0);r=ha*sq3/3.0;

c=-0.5;

s=0.5*sq3;

printf("\nВведите параметр толщины(напр.50:");

scanf("%f",&w);

b=w/s;

hb=0.5*b;

zaggraf();

setcolor(GREEN);

xC=0.5*500; yC=0.5*(300-r);

x[0]=-ha-2*b-hb;y[0]=-r-w;

x[1]=x[0]+hb;y[1]=-r-2*w;

x[2]=-x[1];y[2]=y[1];

x[3]=hb;y[3]=2*r+w;

x[4]=0.0;y[4]=2*r;

x[5]=ha+hb;y[5]=y[0];

foregroundcolor=getcolor();

setcolor(RED);

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

{ for(l=0;l<6;l++)

{xl=x[l];yl=y[l];

points[2*l]=(xC+xl);

points[2*l+1]=(yC+yl);

x[l]=c*xl-s*yl;

y[l]=s*xl+c*yl;

}

points[12]=points[0];

/* setbkcolor(BLUE);*/

points[13]=points[1];

fillpattern=

(i==0? SOLID_FILL:

i==1? INTERLEAVE_FILL:

WIDE_DOT_FILL);

setfillstyle(fillpattern,foregroundcolor);

fillpoly(7,points);

}

getch();

closegraph;

}

 

Программа strelka.c

 

/* Программа стрелка*/

 

#include <graphics.h>

#include<zaggraf.c>

#include"math.h"

float x[4]={300.0,300.0,310.,290.0},y[4]={-10.25,20.25,10.0,10.0};

main(void)

{

int i,j;

float pi,phi,cos_phi,sin_phi,xx,yy;

pi=4.0*atan(1.0);phi=6*pi/180;

cos_phi=cos(phi);sin_phi=sin(phi);

zaggraf();

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

{

for(j=0;j<=3;j++)

{

xx=x[j];yy=y[j];

x[j]=xx*cos_phi-yy*sin_phi;

y[j]=xx*sin_phi+yy*cos_phi;

}

moveto(x[0],y[0]);

for(j=1;j<=3;j++)

lineto(x[j],y[j]);

lineto(x[1],y[1]);

}

getch();

closegraph();

}

 

 

Программа CUBE

 

/*Проволочная модель куба*/

#include "grasptco.c"

#include<graphics.h>

#include<zaggraf.c>

#include"math.h"

float v11,v12,v13,v21,v22,v23,v32,v33,v43,

screen_dist,c1,c2;

int main(void)

{ float rho,theta,phi,h=10.0;

printf("Расстояние до наблюдателя rho=EO:");

scanf("%f",&rho);

printf("\nЗадайте два угла в градусах.\n");

printf("\nУгол theta измеряется по горизонтали от оси х:");

scanf("%f",&theta);

printf("Угол phi измеряется по вертикали от оси z:");

scanf("%f",&phi);

printf("Расстояние от точки наблюдения до экрана (например,….):");

scanf("%f",&screen_dist);

printf("Коэффициент c1=");

scanf("%f",&c1);

printf("Коэффициент C2=");

scanf("%f",&c2);

coeff(rho,theta,phi);

zaggraf();

mv(h,-h,-h); dw(h,h,-h);

dw(-h,h,-h);

dw(-h,h,h);

dw(-h,-h,h);

dw(h,-h,h);

dw(h,-h,-h);

mv(h,h,-h); dw(h,h,h);

dw(-h,h,h);

mv(h,h,h); dw(h,-h,h);

mv(h,-h,-h);dw(-h,-h,-h);

dw(-h,h,-h);

mv(-h,-h,-h);dw(-h,-h,h);

return(0);

}

coeff(rho,theta,phi)

float rho,theta,phi;

{ float th,ph,costh,sinth,cosph,sinph,factor;

factor=atan(1.0)/45.0;

/*Углы в радианах*/

th=theta*factor; ph=phi*factor;

costh=cos(th); sinth=sin(th);

cosph=cos(ph); sinph=sin(ph);

/*Элементы матрицы V см.(4.9) */

v11=-sinth; v12=-cosph*costh; v13=-sinph*costh;

v21=costh; v22=-cosph*sinth; v23=-sinph*sinth;

v32=sinph; v33=-cosph; v43=rho;

return(0);

}

mv(x,y,z) float x,y,z;

{ float X,Y ;

perspective(x,y,z,&X,&Y);

moveto(X,Y);

return(0);

}

dw(x,y,z) float x,y,z;

{ float X,Y;

perspective(x,y,z,&X,&Y);

lineto( X,Y);

return dw();

}

perspective(x,y,z,pX,pY)

float x,y,z,*pX,*pY;

{ float xe,ye,ze;

/* Координаты ,вычисляемые по (2)*/

xe=v11*x+v21*y;

ye=v12*x+v22*y+v32*z;

ze=v13*x+v23*y+v33*z+v43;

/* Экранные координаты,вычисляемые по (3) и (4)*/

*pX=screen_dist*xe/ze+c1;

*pY=screen_dist*ye/ze+c2;

return perspective();

}

 

Вспомогательная программа GRASPTCO

 

#include <graphics.h>

#include<conio.h>

int X_max,Y_max,foregrcolor,backgrcolor,colorsum;

float x_max=100.0,y_max=150.0,horfact,vertfact;

void initgr(void)

{ int gdriver=DETECT,gmode;

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

foregrcolor=getcolor();backgrcolor=getbkcolor();

colorsum=foregrcolor+backgrcolor;

X_max=getmaxx();Y_max=getmaxy();

horfact=X_max/x_max;vertfact=Y_max/y_max;

}

 

int IX(float x)

{ return(int)(x*horfact+0.5);

}

int IY(float y)

{ return(int)Y_max-(int)(y*vertfact+0.5);

}

void move(float x,float y)

{ moveto(IX(x),IY(y));

}

void draw(float x,float y)

{ lineto(IX(x),IY(y));

}

void line_uc(float x1,float y1,float x2,float y2)

{ line(IX(x1),IY(y1),IX(x2),IY(y2));

}

void endgr(void)

{ getch();closegraph();

}

void invertpixel(int X,int Y)

{ putpixel(X,Y,colorsum-getpixel(X,Y));

}

 

 

//Программа «График» для построения графика в среде С++Builder

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

 

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

#include "math.h"

float f(float x)

{return 2*sin(x)*exp(x/5);}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::onPaint(TObject *Sender)

{

float x1,x2,y1,y2;// границы изменения аргумента и значения функции

float x,y;// аргумент функции и значение функции в точке x

float dx; //приращение аргумента

int l,b ;//левый нижний угол области вывода

int w,h; // ширина и высота области вывода

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

float mx,my; // масштаб по осям X и Y

// Область вывода графика

l=10;

b=Form1->ClientHeight-20;

h= Form1->ClientHeight-40;

w=Form1->Width-20;

x1=0; //нижняя граница диапазона аргумента

x2=25; // верхняя граница диапазона аргумента

dx=0.05;

y1=f(x1); //минимальное значение функции

y2=f(x2); // максимальное значение функции

do

{

y=f(x);

if(y<y1) y1=y;

if(y>y2) y2=y;

x+=dx;

}

while(x<=x2);

my=(float)h/(abs)(y2-y1); // масштаб по оси Y

mx=w/(abs)(x2-x1); //масштаб по оси X

//Оси

x0=l+abs(x2-x1);

y0=b-abs(y1*my);

Canvas->MoveTo(x0, b); Canvas->LineTo(x0,b-h);

Canvas->MoveTo(l, y0); Canvas->LineTo (l+w, y0);

Canvas->TextOutA(x0+5, b-h, FloatToStrF(y2, ffGeneral,6,3));

Canvas->TextOutA(x0+5, b, FloatToStrF (y1, ffGeneral,6,3));

Canvas->TextOutA(x0+5, y0, 0);

Canvas->TextOutA(x0+150,y0-150, "График функции y=2sin(x)exp(x/5)");

x=x1;

//Построение графика

do

{

y=f(x);

Canvas->Pixels[x0+x*mx][y0-y*my]=clRed;

x+=dx;

}

while(x<=x2);

}

 

Шишкин Анатолий Дмитриевич

Чернецова Елена Анатольевна

 

 

ПРАКТИКУМ ПО УЧЕБНОЙ ДИСЦИПЛИНЕ

 

“КОМПЬЮТЕРНАЯ ГРАФИКА”

 

 

Редактор И.Г. Максимова

Подписано в печать Формат 60/901/2 Бумага книжно – журнальная

Печ. л. Тир. 55

РГГМУ, 195196, СПб, Малоохтинский пр., Отпечатано

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.