Рекомендации по составлению программы ⇐ ПредыдущаяСтр 9 из 9
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 Все права принадлежат авторам размещенных материалов.
|