CG Project
CG Project
CG Project
INTRODUCTION
1.1 Overview
Computer graphics is one of the most exciting and rapidly growing computer fields. It is also an extremely effective medium for communication between man and computer; a human being can understand the information content of a displayed diagram or perspective view much faster than he can understand a table of numbers or text containing the same information. Thus computer graphics is being used more extensively. There is a lot of development in hardware and software required to generate images, and nowadays the cost of such hardware and software is dropping rapidly. Due to this the interactive computer graphics is becoming available to more and more people. Computer graphics started with the display of data on hardcopy plotters and cathode ray tube (CRT) screens soon after the introduction of computers themselves. It has grown to include the creation, storage, and manipulation of models and images of objects. These models come from a diverse and expanding set of fields, and include physical, mathematical, engineering, architectural, and even conceptual structures, natural phenomena, and so on. Computer graphics today is largely interactive. The user controls the contents, structure, and appearance of objects and their displayed images by using input devices, such as a keyboard, mouse, or touch sensitive panel on the screen. The handling of such devices is included in the study of computer graphics, because of the close relationship between the input devices and the display.
Chapter 1
Introduction
1.2 About C:
C seems a strange name for a programming language. But this strange sounding language is one of the most popular computer languages today. C is an offspring of Basic Combined Programming Language (BPCL) called B, developed in 1960s at Cambridge University. B language was modified by Dennis Ritchie and was implemented in Bell laboratories in 1972. This new language was named C. C++ has its origin in C language. It was developed by Bjarne Stroustrup at AT&T Bell labs in the early 1980s to overcome the shortcomings of C. Initially named C with classes, the language is actually improved version of C language with some additional features made possible by using classes and an object-oriented approach.
Chapter 1
Introduction
(BGI). All interfaces to the SRGP and SPHIGS graphics package are defined in C/C++. The objective of this project is to design and implement a paint editor similar to the MS-PAINT application. We use our computer graphics skills to create this application by operating on C in graphics mode. C/C++ co-ordinate system has a origin (0,0) in the upper-left corner. Positive x values are to the right, and positive y values are to the bottom. The values of the coordinates x and y are in pixels.
----------->x-axis
| | | V y-axis
2. REQUIREMENT SPECIFICATIONS
Purpose:
The purpose of this document is to describe all external
Scope: This document describes the functional requirements for the graphics
package to run efficiently and provide optimum results. It is meant for use by the developers and will also be used for further maintaining and upgrading the various components of the requirements in future. Then, it will be reflected as an addition to this document.
Chapter 2
Requirement Specification
3. SYSTEM DESIGN
The objective of this particular design is to implement the graphics project called Paint in an efficient way. It is designed using many builtin functions and also user-defined functions. This increases the speed and efficiency.
Chapter 3
System Design
int restrictmouse( )
This is a function which sets the horizontal and vertical limits for pointer. Horizontal limit is set using service 07h. Register CX contains minimum x-coordinate and DX contains maximum x-coordinate. Vertical limit is set using service 08h. Register CX contains minimum y-coordinate and DX contains maximum y-coordinate.
3.12 Other Features Line: We can draw a line in any of the coordinates using Bresenhams line
algorithm. Based on the input values given by the user, slopes are calculated and corresponding pixels are called using putpixel( ) built-in function. We also ensure that the line lies within the user area.
Rectangle: We can draw a rectangle using service 03h, which returns current
x and y coordinates. Then, we call line function 4 times to draw a rectangle and ensure that it is within user area as long as left button is pressed.
Circle: We can draw a circle using Bresenhams circle algorithm. The initial
left click position of the mouse is taken as the centre of the circle. The radius is given by service 03h which returns x and y coordinates when the left button is released. We ensure that it is within the user area.
Spiral: We can draw a spiral using service 02h. It makes use of contents of CX
and DX registers to know the centre and maximum radius. We ensure that it is within the user area.
Chapter 3
System Design
Wheel: When this icon is clicked, a rotating wheel is displayed within the user
screen, until right button of mouse is clicked.
Rotating tangent: When this icon is clicked, a tangent moves around a circle
until keyboard is hit.
Translate: We can translate a given circle within the user screen. The circle is
translated to the position where the mouse is clicked.
New file: We can create a new file by filling the entire user area with white
colour and naming it as untitled.bmp.
Save file: We can save a created image by using file operations. Load file: We can load a saved file by using file operations. If the file is not
present, error is displayed.
Clear: This option clears the screen and fills the user area with white colour. Colours: We can select a colour and perform any of the operations using that
colour.
Fill colour: This option fills the entire user screen within the selected colour. Locator position: It displays the coordinate position of the mouse
Pointer. Most graphics editors use the following screed design.
Chapter 3
System Design
The construction techniques are one of the most important ingredients of a graphics editor. A superior approach to the construction technique is the rubber-band technique, which is used in this editor. The state diagram for rubber-band line drawing is show below.
Chapter 4
Source Code
Source Code
/* GLOBAL DECLARATION */ #include<stdio.h> #include<dos.h> #include<graphics.h> #include<conio.h> #include<stdlib.h> #include<math.h> #include<time.h> #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define MIN_X 100 MAX_X 627 MIN_Y 70 MAX_Y 390 MAX_BUTTONS 25 MAX_COLOR 16 //total no of color buttons NEW 0 SAVE 1 LOAD 2 CLEAR 3 CLIP_OP 10 TRANS_OP 19 MAX_PIXEL 5000 ORG -50 PI 3.1415927 M 5
void wel(); int initmouse(); void startmouse(int x,int y); void showmouse(); void hidemouse(); void getxy(); void disp_coord(); void restrictmouse(int,int,int,int); void tme(); void ClearStatus(); void ShowStatus(char*); void beep(); char* readline(char*); void animate(); //void loading(); void save(); void load(); void clear(); void exchange(int*,int*); //void erase();
Department of Computer Science Engineering,U.V.C.E, 2011
10
Source Code
void putcircle(int,int,int,int); void bcircle( int,int,int); void setpixel(int,int,int); void bline(int,int,int,int); void brectangle(int,int,int,int); void spiral(int,int,int,int,int); void plotpnts(int,int,int,int,int,int); void bellipse(int,int,int,int); void myw(int,int,float); void Wheel(); void myl(int,int,float); void rotate_line(); void rubberband(); void scale(); void rotate(); void translate(); void CohenSutherlandLine(int,int,int,int,int,int,int,int); void lineclipping(); void clearin(); void clearout(); void seg(); void New_icon(int x1, int y1); void Save_icon(int x1, int y1); void Open_icon(int x1, int y1); void Line_icon(int x1, int y1); void Rectangle_icon(int x1, int y1); void Circle_icon(int x1, int y1); void Ellipse_icon(int x2,int y1); void Spiral_icon(int x1,int y1); void Rot_icon(int x1,int y1); void Rotate_icon(int x, int y); void Translate_icon(int x1, int y1); void scale_icon(int x1,int y1); void Clip_icon(int x1,int y1); void Wheel_icon(int x2,int y1); void Seg_icon(int x1,int y1); void icons(int,int,int,int,int); void init_button(int,int,int,int,int,char*); void draw_button_border(int); void undraw_button_border(int); void init_color_button(int,int,int,int,int); void draw_color_button_border(int); void init(); void dispfile(); void frame(); int check_mouse_on(int,int,int,int); void check_if_exit();
Department of Computer Science Engineering,U.V.C.E, 2011
11
Chapter 4 int check_if_color(); int check_if_button_pressed(); void tools(); void drawrectangle(); int a,b,c,d; int Current_Color=BLACK; int Current_Pattern=EMPTY_FILL;
Source Code
struct //the button-structure consists of { int xmin,ymin,xmax,ymax; //1.boundaries-field int button_no; //2.the button-no. for access char* desc; //3.a string for description to the user }buttons[MAX_BUTTONS]; struct //another structure-this time for colorbuttons { //consists of: int xmin,ymin,xmax,ymax; //1.boundaries-fields int color; //2.color-i.e. color no. }colorbuttons[MAX_COLOR]; struct { int x,y; int c; }r[MAX_PIXEL]; struct Node { int x,y; struct Node* next; }; int R; //restore mode int t; //number of pixel to restore char filename[20]="Untitled"; int saved; int LeftButtonPressed; //is leftbutton-pressed int RightButtonPressed;// is Right button pressed int mousex,mousey; //current mouse pos int prevx,prevy; //prev mouse pos //int Current_Color=BLACK; // to Store the current color int Current_Button=9;// to store the current button pressed int Prev_Button=1;// to store the previous button union REGS regs; void wel() {
Department of Computer Science Engineering,U.V.C.E, 2011
12
Chapter 4 }
Source Code
/* INITIALISE THE SCREEN */ void frame() { char name[20]; setcolor(WHITE); rectangle(3,3,637,477); setfillstyle(1,10); floodfill(6,6,WHITE); icons(10,70,93,455,0); // icon button panel icons(MIN_X+1,MIN_Y+1,MAX_X-1,MAX_Y-1,0); icons(MIN_X-1,MIN_Y-1,MAX_X+1,MAX_Y+1,1); setfillstyle(SOLID_FILL, WHITE); bar(MIN_X+2,MIN_Y+2,MAX_X-2,MAX_Y-2); //drawing screen icons(10,460,629-200,477-3,0); //help message panel(status display) icons(20,MAX_Y+50,83,MAX_Y+60,0); icons(629-200+32,460,MAX_X-34,477-3,0); //for x y display_panel setcolor(BLACK); outtextxy(467,464,"x :"); outtextxy(533,464,"y :"); icons(MIN_X+70,MAX_Y+25,MIN_X+75+2+240,MAX_Y+65,1); // For color panel setcolor(DARKGRAY); icons(MIN_X+15,MAX_Y+30,MIN_X+49,MAX_Y+55,1); //for current_Color_indicator icons(MIN_X+16,MAX_Y+31,MIN_X+48,MAX_Y+55,1); setfillstyle(SOLID_FILL,Current_Color); bar(MIN_X+15+5,MAX_Y+35,MIN_X+49-5,MAX_Y+50); setcolor(WHITE); line(3,35,637,35); setfillstyle(SOLID_FILL,BLUE);floodfill(630,30,WHITE); setcolor(4); settextstyle(7,HORIZ_DIR,2); outtextxy((getmaxx()-textwidth(" 2DPACKAGE "))/2,7," 2DPACKAGE"); settextstyle(SMALL_FONT,HORIZ_DIR,4); setcolor(4); outtextxy(438,417,"Designed by : "); settextstyle(SMALL_FONT,HORIZ_DIR,4); settextstyle(4,0,1); outtextxy(430,432,"chinmaya \n amar"); settextstyle(SMALL_FONT,HORIZ_DIR,5); icons(MAX_X-208,MAX_Y+25,MAX_X-2,MAX_Y+65,1); icons(MIN_X,MAX_Y+6,MAX_X,MAX_Y+18,0); }
Department of Computer Science Engineering,U.V.C.E, 2011
13
Chapter 4
Source Code
void New_icon(int x1, int y1)// used to show new file icon { y1+=1; setlinestyle(0,1,1); setcolor(BLACK); line(9+x1,4+y1,9+x1,20+y1); line(9+x1,20+y1,21+x1,20+y1); line(21+x1,20+y1,21+x1,8+y1); line(9+x1,4+y1,17+x1,4+y1); line(17+x1,4+y1,17+x1,8+y1); line(17+x1,8+y1,21+x1,8+y1); line(21+x1,8+y1,17+x1,4+y1); setfillstyle(1,WHITE); floodfill(10+x1,9+y1,BLACK); } void Save_icon(int x1, int y1) // for saving { y1+=1; setlinestyle(0,1,1); setcolor(BLACK); line(6+x1,4+y1,24+x1,4+y1); line(24+x1,4+y1,24+x1,20+y1); line(24+x1,20+y1,8+x1,20+y1); line(8+x1,20+y1,6+x1,18+y1); line(6+x1,18+y1,6+x1,4+y1); line(9+x1,4+y1,9+x1,12+y1); line(9+x1,12+y1,21+x1,12+y1); line(21+x1,12+y1,21+x1,4+y1); line(10+x1,20+y1,10+x1,15+y1); line(10+x1,15+y1,20+x1,15+y1); line(20+x1,15+y1,20+x1,20+y1); line(17+x1,15+y1,17+x1,20+y1); line(21+x1,7+y1,24+x1,7+y1); setfillstyle(1,WHITE); floodfill(10+x1,5+y1,BLACK); setfillstyle(1,BROWN); floodfill(7+x1,5+y1,BLACK); setfillstyle(1,DARKGRAY); floodfill(11+x1,19+y1,BLACK); } void Open_icon(int x1, int y1)// for opening { y1+=1; setlinestyle(0,1,1); setcolor(BLACK); line(5+x1,20+y1,17+x1,20+y1); line(17+x1,20+y1,24+x1,15+y1); line(24+x1,15+y1,12+x1,15+y1); line(12+x1,15+y1,5+x1,20+y1);
Department of Computer Science Engineering,U.V.C.E, 2011
14
Chapter 4 setfillstyle(1,DARKGRAY); floodfill(10+x1,18+y1,BLACK); line(5+x1,20+y1,5+x1,10+y1); line(5+x1,10+y1,6+x1,8+y1); line(6+x1,8+y1,8+x1,8+y1); line(8+x1,8+y1,9+x1,10+y1); line(9+x1,10+y1,17+x1,10+y1); line(17+x1,10+y1,17+x1,15+y1); setfillstyle(1,YELLOW); floodfill(6+x1,12+y1,BLACK); line(15+x1,7+y1,17+x1,5+y1); line(17+x1,5+y1,22+x1,7+y1); line(22+x1,7+y1,24+x1,12+y1); line(24+x1,12+y1,20+x1,10+y1); line(24+x1,12+y1,26+x1,9+y1); }
Source Code
void Clear_icon(int x,int y)//clearing the working area { setfillstyle(SOLID_FILL,WHITE); bar3d(x+5,y+5,x+25,y+20,0,0); } void Line_icon(int x1, int y1)// used to show line icon { line(x1+8,y1+5,x1+22,y1+19); line(x1+7,y1+4,x1+21,y1+18); } void Circle_icon(int x1, int y1)// used to show circle icon { circle(x1+15,y1+13,8); } void Ellipse_icon(int x2,int y1)//used to show ellipse tool { ellipse(x2+15,y1+13,0,360,10,7); } void Spiral_icon(int x1,int y1) //used to show spiral icon { setcolor(BLACK); spiral(x1+15,y1+14,10,0,37); } void Rot_icon(int x1,int y1)//used to show rotate icon { setfillstyle(SOLID_FILL,YELLOW); circle(x1+15,y1+13,7); line(x1+23,y1+5,x1+23,y1+21);
Department of Computer Science Engineering,U.V.C.E, 2011
15
Chapter 4 }
Source Code
void Clip_icon(int x1,int y1)//used to display line clipping { setlinestyle(3,0,2); rectangle(x1+6,y1+6,x1+24,y1+19); setlinestyle(0,0,0); line(x1+20,y1+3,x1+10,y1+23); } void Wheel_icon(int x2,int y1) //used to show moving wheel { circle(x2+15,y1+13,8); circle(x2+15,y1+13,10); line(x2+7,y1+13,x2+23,y1+13); line(x2+15,y1+5,x2+15,y1+21); line(x2+9,y1+7,x2+21,y1+19); line(x2+21,y1+7,x2+9,y1+19); } void Seg_icon(int x,int y) { setcolor(4); settextstyle(DEFAULT_FONT,HORIZ_DIR,0); outtextxy(x+4,y+9,"SEG"); } void hr_icon(int x,int y) { setcolor(4); settextstyle(1,0,1); outtextxy(x+8,y+10,"HR"); } void bz_icon(int x,int y) { setcolor(RED); settextstyle(1,0,1); outtextxy(x+8,y+10,"BZ"); } void t3d_icon(int x,int y) { setcolor(RED); settextstyle(1,0,1); outtextxy(x+8,y+10,"3D"); } void fl_icon(int x,int y) { setcolor(RED); settextstyle(1,0,1);
Department of Computer Science Engineering,U.V.C.E, 2011
16
Chapter 4 outtextxy(x+4,y+10,"FIL"); } void Rotate_icon(int x, int y) { setcolor(0); rectangle(x+6,y+4,x+23,y+18); setcolor(RED); line(x+11,y+4,x+6,y+18); line(x+11,y+4,x+27,y+9); line(x+27,y+9,x+22,y+22); line(x+22,y+22,x+6,y+18); }
Source Code
void Rectangle_icon(int x1, int y1)// used to show rectangle icon { rectangle(x1+6,y1+6,x1+23,y1+20); } void Translate_icon(int x1, int y1)// used to display translation { setcolor(0); rectangle(x1+4,y1+4,x1+21,y1+18); setcolor(RED); rectangle(x1+7,y1+7,x1+24,y1+21); } void scale_icon(int x1, int y1)// used to display scaling picture { setcolor(0); rectangle(x1+4,y1+4,x1+21,y1+18); rectangle(x1+7,y1+7,x1+17,y1+12); setfillstyle(1,RED); floodfill(x1+8,y1+8,BLACK); } /* */ int initmouse() { regs.x.ax=0; int86(0x33,®s,®s); return(regs.x.bx); }
Department of Computer Science Engineering,U.V.C.E, 2011
MOUSE FUNCTIONS
17
Chapter 4 void startmouse(int x,int y) using { regs.x.ax=4; regs.x.cx=x; regs.x.dx=y; int86(0x33,®s,®s); } void showmouse() { regs.x.ax=1; int86(0x33,®s,®s); }
void getxy() { regs.x.ax=3; //get mouse status using 03h of int 33h int86(0x33,®s,®s); prevx=mousex; prevy=mousey; if(regs.x.bx&1) //LSB of reg BX LeftButtonPressed=1; else LeftButtonPressed=0; mousex=regs.x.cx; //(cx,dx)=(x,y) mousey=regs.x.dx; if(regs.x.bx&2) RightButtonPressed=1; else RightButtonPressed=0; } void hidemouse() { regs.x.ax=2; int86(0x33,®s,®s); } void disp_coord() //this fn display current mouse coordinates only when { //the mouse is on the canvas char x[5],y[5]; int color; if(prevx!=mousex||prevy!=mousey) //otherwise don't update if((mousex>MIN_X+1)&&(mousex<MAX_X1)&&(mousey>MIN_Y+1)&&(mousey<MAX_Y-1)) { settextstyle(DEFAULT_FONT,HORIZ_DIR,0);//restore normal font style/size
Department of Computer Science Engineering,U.V.C.E, 2011
18
Chapter 4
Source Code
sprintf(x," %d ",mousex-MIN_X-2); //copy positions into respective sprintf(y," %d ",mousey-MIN_Y-2); //strings color=getcolor(); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(487,462,522,472); //refresh display bar(555,462,585,472); setcolor(BLACK); outtextxy(487,464,x); //display current positions outtextxy(555,464,y); setcolor(color); } } void restrictmouse(int minx,int miny,int maxx,int maxy) { regs.x.cx=minx; regs.x.dx=maxx; regs.x.ax=0x7; //restrict along x-axis using fn 07h int86(0x33,®s,®s); regs.x.cx=miny; regs.x.dx=maxy; regs.x.ax=0x8; //restrict along y-axis using fn 08h int86(0x33,®s,®s); } //Time function void tme() { char k[3],l[3],m[4]=" : "; static int hour,minute; regs.h.ah=0x2c; int86(0x21,®s,®s); if(hour!=regs.h.ch||minute!=regs.h.cl) { setfillstyle(SOLID_FILL,LIGHTGRAY); bar(22,MAX_Y+52,81,MAX_Y+58); //refresh display settextstyle(DEFAULT_FONT,HORIZ_DIR,0);//restore normal font style/size //setusercharsize(0,0,0,0); setcolor(BLACK); sprintf(k,"%d",regs.h.ch); outtextxy(25,442,k); outtextxy(40,442,m); sprintf(l,"%d",regs.h.cl); outtextxy(62,442,l); } hour=regs.h.ch,minute=regs.h.cl; }
Department of Computer Science Engineering,U.V.C.E, 2011
19
Chapter 4
Source Code
/* */
FILE OPERATIONS
extern void dispfile(); void ClearStatus() { static int first_time; static char text[52]; int i; setcolor(LIGHTGRAY); if(!first_time) { strcpy(text,""); for(i=0;i<51;++i) strcat(text,""); text[51]='\0'; first_time=1; } outtextxy(12,464,text); } void ShowStatus(char* str) { int color=getcolor(); ClearStatus(); setcolor(BLACK); outtextxy(32,464,str); setcolor(color); } void beep() { sound(1000); delay(75); nosound(); } char* readline(char* msg) { char* Line; char temp[40]; char Disp_Line[60]; char ch; int i=0,length=0; int max=((475-12)-strlen(msg)*8)/8;// find maximum number of characters ClearStatus(); setcolor(BLACK); outtextxy(12,464,msg); strcpy(Disp_Line,msg); ch=getch();
Department of Computer Science Engineering,U.V.C.E, 2011
20
Chapter 4
Source Code
while((ch!=27)&&(ch!=13)) { switch (ch) { case '\b' : if(i==0) beep(); else { i--; ClearStatus(); length=strlen(Disp_Line); Disp_Line[length-1]='\0'; setcolor(BLACK); outtextxy(12,464,Disp_Line); } break; default : if(i > max) beep(); else { length=strlen(Disp_Line); Disp_Line[length]=ch; //copy next char into Disp_Line Disp_Line[length+1]='\0'; outtextxy(12,464,Disp_Line); temp[i++]=ch; } break; } ch=getch(); } temp[i]='\0'; ClearStatus(); if(ch==27) return NULL; else { Line=malloc(strlen(temp)+1); strcpy(Line,temp); } return Line; } void animate() { int i,j=2; setfillstyle(SOLID_FILL,BLUE); for(i=1;i<66;i++) { bar(MIN_X+j,MAX_Y+15,MIN_X+j+6,MAX_Y+9); j+=8; delay(10);
Department of Computer Science Engineering,U.V.C.E, 2011
21
Source Code
void save() { char* name; FILE* out; char ch; int row,col; char byte; if(strcmp(filename,"Untitled")==0) { name=readline("Save File As : "); if(name==NULL) return; } else { name=malloc(strlen(filename)+1); strcpy(name,filename); } out=fopen(name,"w"); if(out==NULL) { ShowStatus(" Error Opening File !"); delay(1000); ClearStatus(); return; } ShowStatus(" Saving File (Please Wait) "); animate(); for(row=MIN_Y+2;row<=MAX_Y-2;++row) { for(col=MIN_X+2;col<=MAX_X-2;) { byte=getpixel(col,row); byte=byte<<4; col++; byte+=getpixel(col,row); col++; if(fputc(byte,out)==EOF) { ShowStatus("Error Writing FIle ! "); delay(1000); ClearStatus(); free(name); fclose(out); } } } ClearStatus(); strcpy(filename,name);
Department of Computer Science Engineering,U.V.C.E, 2011
22
Chapter 4 dispfile(); free(name); fclose(out); saved=1; } void load() { FILE* in; char* name; char ch; char byte; int row,col; int temp; if(!saved) { ShowStatus(" Save Current File ? "); ch=getch(); if(ch=='y'||ch=='Y') save(); } name=readline(" Enter File To Open : "); if(name==NULL) return; in=fopen(name,"r"); if(in==NULL) { ShowStatus(" Error Opening File "); delay(1000); ClearStatus(); return; } byte=fgetc(in);// gets a char from a stream ClearStatus(); ShowStatus("Loading...."); animate(); ClearStatus(); strcpy(filename,name); dispfile(); for(row=MIN_Y+2;row<=MAX_Y-2;row++) { for(col=MIN_X+2;col<=MAX_X-2;) { temp=(byte&0xf0)>>4; putpixel(col,row,temp); col++; temp=(byte&0x0f); putpixel(col,row,temp); col++; byte=fgetc(in); } } free(name);
Department of Computer Science Engineering,U.V.C.E, 2011
Source Code
23
Source Code
/* ALGORITHMS */ void clear() { setfillstyle(SOLID_FILL,WHITE); bar(MIN_X+2,MIN_Y+2,MAX_X-2,MAX_Y-2); } void exchange(int *v1,int *v2) // to swap variables in line algo { int temp; temp=*v1; *v1=*v2; *v2=temp; } void putback() { int i; for(i=0;i<t;i++) { if(getpixel(r[i].x,r[i].y)!=r[i].c) putpixel(r[i].x,r[i].y,r[i].c); } t=0; } void set(int x,int y) { if(x>MIN_X+1&&x<MAX_X-1&&y>MIN_Y+1&&y<MAX_Y-1) { if(getpixel(x,y)!=Current_Color) { if(R) { r[t].c=getpixel(x,y); r[t].x=x; r[t++].y=y; } putpixel(x,y,Current_Color); } } }
Department of Computer Science Engineering,U.V.C.E, 2011
24
Chapter 4 void putcircle(int x,int y,int xc,int yc) { set(x+xc,y+yc); set(-x+xc,y+yc); set(y+xc,-x+yc); set(-y+xc,x+yc); set(x+xc,-y+yc); set(-x+xc,-y+yc); set(y+xc,x+yc); set(-y+xc,-x+yc); } void bcircle( int xc,int yc,int rad) { int x=0,y=rad,p=3-2*rad; if(rad<3) return; hidemouse(); while(x<=y) { putcircle(x,y,xc,yc); if(p<0) p+=4*x+6; else { p+=4*(x-y)+10; y--; } x++; if(x==y) putcircle(x,y,xc,yc); } showmouse(); } void setpixel(int x,int y,int slope) { if(slope) exchange(&x,&y); set(x,y); } void bline(int xs,int ys,int xe,int ye) { int dx,dy,c1,c2,slope,stype=1; signed long int p; dx=abs(xe-xs); dy=abs(ye-ys); slope=dy>dx; if(slope) { exchange(&dx,&dy); exchange(&xs,&ys);
Department of Computer Science Engineering,U.V.C.E, 2011
Source Code
25
Chapter 4 exchange(&xe,&ye); } c1=2*dy; c2=2*(dy-dx); p=2*dy-dx; if(xe<xs) { exchange(&xs,&xe); exchange(&ys,&ye); } if(ye<ys) stype=-1; setpixel(xs,ys,slope); while(xs<xe) { ++xs; if(p<0) p+=c1; else { p+=c2; ys+=stype; } setpixel(xs,ys,slope); } } void brectangle(int x1,int y1,int x2,int y2) { hidemouse(); if(x1==x2&&y1==y2) { showmouse(); return; } bline(x1,y1,x2,y1); bline(x2,y1,x2,y2); bline(x2,y2,x1,y2); bline(x1,y1,x1,y2); showmouse(); } void spiral(int xc,int yc,int r,int cip,int inc) { int x1,y1,x2,y2; float theta,dtheta,rad; if(r<=5) return; x1=xc; y1=yc; theta=rad=0.0; dtheta=M_PI/(60); while(rad<=r) { x2=xc+rad*cos(theta);
Department of Computer Science Engineering,U.V.C.E, 2011
Source Code
26
Chapter 4 y2=yc+rad*sin(theta); if(cip) bline(x1,y1,x2,y2); else line(x1,y1,x2,y2); //for icon x1=x2; y1=y2; rad+=(0.1/inc)*r; theta+=dtheta; } return; }
Source Code
void plotpnts(int xc,int yc,int x,int y,int r1,int r2) { float r=1.0,ro=1.0; if(r1>r2) r=(float)(r2*1.0/r1); else ro=(float)(r1*1.0/r2); set(xc+x*ro,(int)(yc+y*r)); set(xc-y*ro,(int)(yc+x*r)); set(xc-x*ro,(int)(yc+y*r)); set(xc+y*ro,(int)(yc+x*r)); set(xc-x*ro,(int)(yc-y*r)); set(xc+y*ro,(int)(yc-x*r)); set(xc+x*ro,(int)(yc-y*r)); set(xc-y*ro,(int)(yc-x*r)); } void bellipse(int xc,int yc,int r1,int r2) { int p,x,y,b; x=0; if(r1>r2) y=r1; else y=r2; p=3-2*r1; while(x<=y) { hidemouse(); plotpnts(xc,yc,x,y,r1,r2); showmouse(); if(p<0) p+=4*x+6; else { y--; p+=4*(x-y)+10; } x++;
Department of Computer Science Engineering,U.V.C.E, 2011
27
Chapter 4 } showmouse(); } void myw(int x,int y,float theta) { int i; circle(x,y,50); circle(x,y,48); for(i=0;i<3;i++) { line(x+50*cos(theta),y+50*sin(theta),x50*cos(theta),y-50*sin(theta)); theta+=M_PI/3; } }
Source Code
void hrcurve(int x1,int y1,int x4,int y4) { int x3,y3; double a,b,t,r1,r2; //x2=87,y2=47; //x3=632,y3=427; r1=abs(x4-x1); r2=abs(y4-y1); for(t=0;t<1;t+=0.001) { a=(2*t*t*t-3*t*t+1)*x1+(-2*t*t*t+3*t*t)*x4+(t*t*t2*t*t+t)*r1+(t*t*t-t*t)*r2; b=(2*t*t*t-3*t*t+1)*y1+(-2*t*t*t+3*t*t)*y4+(t*t*t2*t*t+1)*r1+(t*t*t-t*t)*r2; if((a>87&&a<632)&&(b>47&&b<427)) bline((int)a,(int)b,(int)a,(int)b); } } void bzcurve(int x1,int y1,int x4,int y4) { int x3,y3,x2,y2; double a,b,t; x2=87,y2=47; x3=632,y3=427; for(t=0;t<1;t+=0.0001) { a=(1-t)*(1-t)*(1-t)*x1+3*t*(1-t)*(1-t)*x2+3*t*t*(1t)*x3+t*t*t*x4; b=(1-t)*(1-t)*(1-t)*y1+3*t*(1-t)*(1-t)*y2+3*t*t*(1t)*y3+t*t*t*y4; if((a>87&&a<632)&&(b>47&&b<427)) bline((int)a,(int)b,(int)a,(int)b); } }
Department of Computer Science Engineering,U.V.C.E, 2011
28
Chapter 4
Source Code
void rotate() { char *name; int x,y,xnew=0,ynew=0; float tx=0,th=0; setcolor(Current_Color); rectangle(MIN_X,MIN_Y,MAX_X,MAX_Y); ShowStatus("Draw rectangle to rotate"); drawrectangle(); name=readline("Enter the rotational angle along xaxis: "); tx=atoi(name); th= (3.1416 * tx)/180.0; for(x=MIN_X+2; x<=MAX_X-2; x++) for(y=MIN_Y+2; y<=MAX_Y-2; y++) if(getpixel(x,y) !=WHITE && getpixel(x,y)==BLACK) { xnew = ( ( x*cos(th) y*sin(th)) ); ynew = ( ( x*sin(th) + y*cos(th)) ); // if(xnew>100&&ynew<340) putpixel(x,y,15); putpixel(xnew+200,abs(ynew70),10); continue; } } void seg() { setcolor(BLACK); rectangle(200,200,400,380); line(200,200,300,100); line(300,100,400,200); rectangle(275,300,325,380); rectangle(212,225,263,275); rectangle(337,225,388,275); line(237,225,237,275); line(212,250,263,250); line(362,225,362,275); line(337,250,388,250); circle(300,165,25); setfillstyle(SOLID_FILL,GREEN); floodfill(210,210,BLACK); setfillstyle(SOLID_FILL,WHITE); floodfill(300,165,BLACK);
Department of Computer Science Engineering,U.V.C.E, 2011
29
Chapter 4
Source Code
setfillstyle(SOLID_FILL,BROWN); floodfill(300,125,BLACK); /*int i,j=0,k=0; //delay(1000); settextstyle(3,0,3); setcolor(RED); outtextxy(250,350,"DEMONSTRATION OF SEGMENTATION"); setcolor(0); //MONITOR rectangle(140,110,220,210); rectangle(130,100,230,220); line(165,220,145,250); line(195,220,215,250); ellipse(180,250,130,50,45,15); line(120,90,120,210); line(120,210,130,220); line(120,90,220,90); line(220,90,230,100); setfillstyle(1,7); floodfill(131,101,0); setfillstyle(1,7); floodfill(121,91,0); line(120,90,130,100); setfillstyle(1,7); floodfill(166,222,0); getch(); //delay(1100); //CABINET setfillstyle(1,7); bar3d(350,90,280,250,7,1); setfillstyle(1,8); floodfill(345,87,0); setfillstyle(1,8); floodfill(353,235,0); getch(); //delay(1000); //CD ROM setcolor(0); line(280,100,350,100); line(280,110,350,110); setfillstyle(1,8); floodfill(281,101,0); setfillstyle(1,GREEN); fillellipse(340,105,4,4); ellipse(340,105,100,90,5,5); //delay(1000); getch(); //FLOPPY setfillstyle(1,7); floodfill(291,151,0);
Department of Computer Science Engineering,U.V.C.E, 2011
30
Chapter 4 rectangle(290,150,335,158); setfillstyle(1,8); floodfill(291,151,0); //delay(1000); getch(); //RESET BUTTON setfillstyle(1,RED); fillellipse(310,180,4,4); ellipse(310,180,100,90,3,5); //delay(1000); getch(); //POWER BUTTON setfillstyle(1,YELLOW); fillellipse(310,200,4,4); ellipse(310,200,100,90,7,8); circle(310,200,8); //MONITOR CONNECTOR //delay(1000); getch(); setcolor(0); line(230,210,250,200); line(231,211,251,201); line(232,212,252,202); line(250,200,280,180); line(251,201,280,181); line(252,202,280,182); setcolor(0); //delay(1000); getch(); //KEYBOAD k=0; for(i=0;i<7;i++) { line(106+k,280+j,258+k,280+j); j+=8; k+=3; } j=0; for(i=0;i<20;i++) { line(106+j,280,125+j,328); j+=8; } line(106,280,106,290);
Department of Computer Science Engineering,U.V.C.E, 2011
Source Code
31
Chapter 4 line(106,290,125,338); line(277,328,277,338); line(125,338,277,338); setfillstyle(1,7); floodfill(126,329,0); line(125,328,125,338); //delay(1000); getch(); //KEYBOARD CONNECTOR line(210,280,280,230); line(211,281,281,231); line(250,250,280,230); //delay(1000); getch(); //MOUSE setfillstyle(1,7); fillellipse(300,300,9,15); ellipse(300,300,100,90,10,18); //delay(1000); getch(); line(300,285,270,260); line(301,286,271,261); line(302,287,272,262); line(270,260,245,250); line(271,261,246,251); line(272,262,247,252); line(245,250,280,205); line(246,251,280,206); line(247,252,280,207); //display on screen settextstyle(3,0,1); setcolor(0); outtextxy(142,150,"CG PROJECT"); outtextxy(142,165,"By:uub1970"); //outtextxy(165,175,"Usha"); for(i=0;i<=5;i++) { delay(1000); if(i%2==0) { setfillstyle(1,11); floodfill(141,111,0); } else { setfillstyle(1,14); floodfill(141,111,0); }
Department of Computer Science Engineering,U.V.C.E, 2011
Source Code
32
Chapter 4
Source Code
}*/ } void mul(float a[10][10],float d[10][10]) { char k1[4],l1[4],m1[4]; int i,j,k,xc,yc,zc; float c[10][10]; for(i=0;i<1;i++) { for(j=0;j<4;j++) { c[i][j]=0; for(k=0;k<4;k++) c[i][j]+=a[i][k]*d[k][j]; } } xc=c[0][0],yc=c[0][1],zc=c[0][2]; outtextxy(570,100,"x="); outtextxy(570,120,"y="); outtextxy(570,140,"z="); sprintf(k1,"%d",(xc-MIN_X)); outtextxy(600,100,k1); sprintf(l1,"%d",(yc-MIN_Y)); outtextxy(600,120,l1); sprintf(m1,"%d",(zc-100)); outtextxy(600,140,m1); if(xc>MIN_X&&yc>MIN_Y&&xc<MAX_X&&yc<MAX_Y) { putpixel(xc,yc,RED); putpixel(xc+1,yc+1,RED); putpixel(xc,yc+1,RED); putpixel(xc+1,yc,RED); } else outtextxy(150,316 ,"sorry! pixel is outside the boundary"); } void t3d() { char *xs,*ys,*zs,*chs,*txs,*tys,*tzs,*sxs,*sys,*szs,*angs; float a[10][10],d[10][10],c[9][9]; int tx,ty,tz,sx,sy,sz,ch; int x,y,z,ang,i; float th; xs=readline("Enter x cordinate:(0-525) "); x=atoi(xs); ys=readline("Enter y cordinate:(0-290) "); y=atoi(ys);
Department of Computer Science Engineering,U.V.C.E, 2011
33
Chapter 4
Source Code
zs=readline("Enter z cordinate:(0-300) "); z=atoi(zs); x=x+MIN_X; y=y+MIN_Y; z=z+100; putpixel(x,y,BLUE); putpixel(x+1,y+1,BLUE); putpixel(x+1,y,BLUE); putpixel(x,y+1,BLUE); d[0][0]=x,d[0][1]=y,d[0][2]=z,d[0][3]=1; chs=readline("1.TRANS 2.SCALING 3.Zrotate 4.Yrotate 5.Xrotate"); ch=atoi(chs); switch(ch) { case 1: txs=readline("Enter tx: "); tx=atoi(txs); tys=readline("Enter ty "); ty=atoi(tys); tzs=readline("Enter tz: "); tz=atoi(tzs); a[0][0]=a[1][1]=a[2][2]=a[3][3]=1; a[3][0]=tx;a[3][1]=ty;a[3][2]=tz; a[0][1]=a[0][2]=a[0][3]=a[1][0]=a[1] [2]=a[1][3]=a[2][0]=a[2][1]=a[2][3]=0; mul(d,a); break; case 2:sxs=readline("Enter sx: "); sx=atoi(sxs); sys=readline("Enter sy "); sy=atoi(sys); szs=readline("Enter sz: "); sz=atoi(szs); a[0][0]=sx;a[1][1]=sy; a[2][2]=sz;a[3][3]=1; a[0][1]=a[0][2]=a[0][3]=a[1][0]=a[1] [2]=a[1][3]=a[2][0]=a[2][1]=a[2][3]=a[3][0]=a[3][1]=a[3] [2]=0; mul(d,a); break; case 3: angs=readline("enter rotatinal angle about z"); ang=atoi(angs); th=(3.142*ang)/180; a[0][0]=a[1][1]=cos(th);
Department of Computer Science Engineering,U.V.C.E, 2011
34
Chapter 4
Source Code
a[0][2]=a[1][2]=a[0][3]=a[1][3]=a[2] [1]=a[2][0]=a[3][0]=a[3][1]=a[3][2]=a[2][3]=0; a[3][3]=a[2][2]=1; a[0][1]=sin(th);a[1][0]=-sin(th); mul(d,a); break; case 4: angs=readline("enter rotatinal angle about y"); ang=atoi(angs); th=(3.142*ang)/180; a[1][1]=a[3][3]=1; a[0][1]=a[0][3]=a[1][0]=a[1][2]=a[1] [3]=a[2][1]=a[2][3]=a[3][0]=a[3][1]=a[3][2]=0; a[0][0]=a[2][2]=cos(th); a[2][0]=sin(th); a[0][2]=-sin(th); mul(d,a); break; case 5: angs=readline("enter rotatinal angle about x"); ang=atoi(angs); th=(3.142*ang)/180; a[0][0]=a[3][3]=1; a[1][1]=a[2][2]=cos(th); a[1][2]=sin(th);a[2][1]=-sin(th); a[0][1]=a[0][2]=a[0][3]=a[1][0]=a[1] [3]=a[2][0]=a[2][3]=a[3][0]=a[3][1]=a[3][2]=0; mul(d,a); break; default:exit(0); } } void translate() { char *name; int tx,ty; setcolor(Current_Color); rectangle(MIN_X,MIN_Y,MAX_X,MAX_Y); ShowStatus("Draw rectangle to translate"); drawrectangle(); name=readline("Enter the translation factor tx: "); tx=atoi(name); name=readline("Enter the translation factor ty: "); ty=atoi(name); setcolor(WHITE);
Department of Computer Science Engineering,U.V.C.E, 2011
35
Chapter 4 setfillstyle(SOLID_FILL,WHITE); bar(a,b,c,d); if(c+tx >MAX_X) c=MAX_X; else if(c+tx < MIN_Y) c=MIN_Y; else c=c+tx; if(d+ty >MAX_Y) else if(d+ty <MIN_Y) else d=d+ty; if(a+tx <MIN_X) else if( a+tx >MAX_X) else a=a+tx; if( b+ty<MIN_Y) else if(b+ty >MAX_Y) else b=b+ty; d=MAX_Y; d=MIN_Y; a=MIN_X; a=MAX_X; b=MIN_Y; b=MAX_Y;
Source Code
setcolor(Current_Color); if(Current_Pattern!=EMPTY_FILL) setfillstyle(Current_Pattern,Current_Color); bar(a,b,c,d); rectangle(a,b,c,d); } void insert(int x,int y,struct Node** last) { struct Node* p; p=(struct Node*)malloc(sizeof(struct Node)); if(p==NULL) { closegraph(); fprintf(stderr,"\ninsert:Out of memory.\n"); exit(2); } p->x=x; p->y=y; p->next=NULL; (*last)->next=p; *last=(*last)->next; } void floodfill4(int x,int y,int oldclr,int newclr) { struct Node* first,*last,*tmp; struct Node* p,*q; first=(struct Node*)malloc(sizeof(struct Node)); if(first==NULL) { closegraph(); fprintf(stderr,"floodfill4: Out of memory.\n"); exit(2); }
Department of Computer Science Engineering,U.V.C.E, 2011
36
Chapter 4 if(oldclr==newclr) { free(first); return; } //Create a node and stpre the seed there. first->x=x; first->y=y; first->next=NULL; last=first;
Source Code
//Use a linked list of adjacent nodes for filling while(first!=NULL) { putpixel(x,y,newclr); if(getpixel(x,y-1)==oldclr) { putpixel(x,y-1,newclr); insert(x,y-1,&last);//insert at the end } if(getpixel(x,y+1)==oldclr) { putpixel(x,y+1,newclr); insert(x,y+1,&last);//insert at the end } if(getpixel(x-1,y)==oldclr) { putpixel(x-1,y,newclr); insert(x-1,y,&last);//insert at the end } if(getpixel(x+1,y)==oldclr) { putpixel(x+1,y,newclr); insert(x+1,y,&last);//insert at the end } //This pixel is done .try the next node in the list tmp=first; first=first->next; x=first->x; y=first->y; free(tmp); } for(p=first;p!=NULL;p=q) { q=p->next; free(p); } }
Department of Computer Science Engineering,U.V.C.E, 2011
37
Chapter 4 void fillcolor() { unsigned oldcolor; int x=mousex; int y=mousey; oldcolor=getpixel(mousex,mousey); hidemouse(); floodfill4(x,y,oldcolor,Current_Color); showmouse(); } void myl(int x,int y,float theta) { line((int)(x+70*sqrt(2)*cos(theta)),(int) (y+70*sqrt(2)*sin(theta)),(int) (x+70*sqrt(2)*cos(theta+M_PI_2)),(int) (y+70*sqrt(2)*sin(theta+M_PI_2))); circle(x,y,70); } void rotate_line() { float theta=0; int i,j; clear(); ShowStatus("Press ESC to terminate"); while(1) { if(kbhit()) if(getch()==27) { clear(); return; } setcolor(BLACK); myl(360,249,theta); delay(100); setcolor(WHITE); myl(360,249,theta); theta+=M_PI_2/10; } } extern void draw_button_border(int); extern void undraw_button_border(int); typedef unsigned int outcode; enum { top=0x1,bottom=0x2,right=0x4,left=0x8 };
Department of Computer Science Engineering,U.V.C.E, 2011
Source Code
38
Chapter 4
Source Code
outcode compcode(int x,int y,int xmin,int ymin,int xmax,int ymax) { outcode code=0; if(y>ymax)code|=top; if(y<ymin)code|=bottom; if(x>xmax)code|=right; if(x<xmin)code|=left; return code; } int x2,y2,x3,y3; void CohenSutherlandLine(int x0,int y0,int x1,int y1,int xmin,int ymin,int xmax,int ymax) { outcode outcodeout,outcode0,outcode1; int accept=0,done=1,x,y,umin=MIN_X+100,vmin=MIN_Y+50,umax=MAX _X-100,vmax=MAX_Y-50; float m; outcode0=compcode(x0,y0,xmin,ymin,xmax,ymax); outcode1=compcode(x1,y1,xmin,ymin,xmax,ymax); while(done) { if(!(outcode0|outcode1)) { accept=1; done=0; } else if(outcode0&outcode1) done=0; else { outcodeout=outcode0?outcode0:outcode1; m=(y1-y0)/(float)(x1-x0); if(outcodeout&top) { x=x0+(ymax-y0)/m; y=ymax; } else if(outcodeout&bottom) { x=x0+(ymin-y0)/m; y=ymin; } else if(outcodeout&right) { y=y0+(xmax-x0)*m; x=xmax; }
Department of Computer Science Engineering,U.V.C.E, 2011
39
Chapter 4
Source Code
else { y=y0+(xmin-x0)*m; x=xmin; } if(outcodeout==outcode0) { x0=x; y0=y; outcode0=compcode(x0,y0,xmin,ymin,xmax,ymax); } else { x1=x; y1=y; outcode1=compcode(x1,y1,xmin,ymin,xmax,ymax); } } } hidemouse(); clear(); if(accept) { setcolor(BLACK); outtextxy(110,80,"Clipped line in the window"); rectangle(x3,y3,x2,y2); setcolor(Current_Color); bline(x0,y0,x1,y1); ClearStatus(); ShowStatus("Right click to view Clipped line in Viewport"); getxy(); while(!RightButtonPressed)getxy(); x0=(float)(x0-xmin)*(umax-umin)/(xmax-xmin)+umin; x1=(float)(x1-xmin)*(umax-umin)/(xmax-xmin)+umin; y0=(float)(y0-ymin)*(vmax-vmin)/(ymax-ymin)+vmin; y1=(float)(y1-ymin)*(vmax-vmin)/(ymax-ymin)+vmin; clear(); setcolor(BLACK); outtextxy(110,80,"Clipped line in viewport"); rectangle(umin,vmin,umax,vmax); setcolor(Current_Color); bline(x0,y0,x1,y1); } // if line within the region showmouse(); setcolor(Current_Color); } void lineclipping() { int x,y,current_x,current_y,tx,ty,b,color; int x0,y0,x1,y1; R=1;
Department of Computer Science Engineering,U.V.C.E, 2011
40
Chapter 4
Source Code
clear(); showmouse(); getxy(); x=mousex;y=mousey; disp_coord(); if(LeftButtonPressed) { while(LeftButtonPressed) { getxy();disp_coord(); if(prevx==mousex&&prevy==mousey) continue; hidemouse(); putback(); showmouse(); getxy(); hidemouse(); bline(x,y,mousex,mousey); showmouse(); delay(10); } x0=x;y0=y;x1=mousex;y1=mousey; ClearStatus(); ShowStatus("Draw the Clipping Window"); getxy(); while(!LeftButtonPressed) { getxy(); disp_coord(); } hidemouse(); setcolor(15-BLACK); setwritemode(XOR_PUT); x=mousex; y=mousey; while(LeftButtonPressed) { setlinestyle(3,1,1); disp_coord(); current_x=mousex; current_y=mousey; while(current_x==mousex && current_y==mousey) getxy(); rectangle(x,y,current_x,current_y); rectangle(x,y,mousex,mousey); } setlinestyle(0,1,1); setwritemode(COPY_PUT); setcolor(Current_Color); ClearStatus(); showmouse(); x3=mousex, y3=mousey, x2=x, y2=y; if(x2>x3)
Department of Computer Science Engineering,U.V.C.E, 2011
41
Chapter 4
Source Code
current_x=x2,x2=x3,x3=current_x; if(y2>y3) current_y=y2,y2=y3,y3=current_y; CohenSutherlandLine(x0,y0,x1,y1,x2,y2,x3,y3); t=0; draw_button_border(Current_Button); undraw_button_border(Prev_Button); Current_Button=Prev_Button; }//if left button } void icons(int minx,int miny,int maxx,int maxy,int status) { int up=WHITE,down=DARKGRAY; // ICON is used to draw buttons creating a int color=getcolor();// 3d effect with top and left drawn in darkgray if(status==0)// bottom and right drawn in white ,color gets swapped { // when a button is pressed indicating as though it has up=DARKGRAY;// gone inside down=WHITE; } setcolor(up); line(minx,miny,maxx,miny); line(minx,miny,minx,maxy); setcolor(down); line(minx,maxy,maxx,maxy); line(maxx,maxy,maxx,miny); setcolor(color); } void init_button(int no,int xmin,int ymin,int xwidth,int ywidth,char* desc) { int ygap=4; //the vertical gap between two buttons buttons[no].xmin=xmin; buttons[no].ymin=ymin; buttons[no].xmax=xmin+xwidth; buttons[no].ymax=ymin+ywidth-ygap; buttons[no].desc=(char *)malloc(strlen(desc) +1);//string for ShowStatus() if(buttons[no].desc==NULL) { cleardevice(); printf("\n No MEMORY "); } strcpy(buttons[no].desc,desc); }
Department of Computer Science Engineering,U.V.C.E, 2011
42
Chapter 4
Source Code
void draw_button_border(int no)//this creates the "notpressed-normal" effect { hidemouse(); //hiding mouse using dos interrupt icons(buttons[no].xmin,buttons[no].ymin,buttons[no].xm ax,buttons[no].ymax,1); icons(buttons[no].xmin+1,buttons[no].ymin+1,buttons[no ].xmax-1,buttons[no].ymax-1,1); showmouse(); } void undraw_button_border(int no)//this creates the "pressed" effect { hidemouse();//actually to avoid graying effect along the edges icons(buttons[no].xmin,buttons[no].ymin,buttons[no].xm ax,buttons[no].ymax,0); icons(buttons[no].xmin+1,buttons[no].ymin+1,buttons[no ].xmax-1,buttons[no].ymax-1,0); showmouse(); } void init_color_button(int color,int xmin,int ymin,int xwidth,int ywidth) { //this actually inits various fields of struct color-button int xgap=4; //the hori-gap between 2 color buttons colorbuttons[color].xmin=xmin; colorbuttons[color].xmax=xmin+xwidth-xgap; colorbuttons[color].ymin=ymin; colorbuttons[color].ymax=ymin+ywidth; colorbuttons[color].color=color; } // draws color buttons that are in struct colorbuttons void draw_color_button_border(int no) { int color=getcolor(); setcolor(BLACK); rectangle(colorbuttons[no].xmin+1,colorbuttons[no].ymi n+1,colorbuttons[no].xmax-1,colorbuttons[no].ymax-1); setfillstyle(SOLID_FILL,no); floodfill(colorbuttons[no].xmin+3,colorbuttons[no].ymi n+3,BLACK); setcolor(color); } void init() //this fn initializes the various fields of the struct button
Department of Computer Science Engineering,U.V.C.E, 2011
43
Chapter 4
Source Code
{ //this is done iteratively for all buttons of the struct-array int x1=10+10,y1=MIN_Y+12,x2=54,y2=MAX_Y+47,ywidth=30,xwidth=3 0; int butt=0,i,j; setcolor(BROWN); //icon panel New_icon(x1,y1+1); init_button(butt,x1,y1,xwidth,ywidth,"New File"); //of struct button draw_button_border(butt++); Save_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"Save File"); draw_button_border(butt++); y1+=ywidth; Open_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"Load File"); draw_button_border(butt++); Clear_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"Clear File"); draw_button_border(butt++); y1+=ywidth; Line_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"Line Drawing Tool"); draw_button_border(butt++); Rectangle_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"Rectangle Drawing Tool"); draw_button_border(butt++); y1+=ywidth; Circle_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"Circle Drawing Tool"); draw_button_border(butt++); Ellipse_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"Ellipse Drawing Tool"); draw_button_border(butt++); y1+=ywidth; Spiral_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"Spiral Drawing Tool");
Department of Computer Science Engineering,U.V.C.E, 2011
44
Chapter 4 draw_button_border(butt++);
Source Code
Clip_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"Line Clipper"); draw_button_border(butt++); y1+=ywidth; Rot_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"Rotating line around circle tangentially"); draw_button_border(butt++); Wheel_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"Rotating Wheel"); draw_button_border(butt++); y1+=ywidth; Seg_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"Segmentation"); draw_button_border(butt++); hr_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"DRAW HRMITE CURVE "); draw_button_border(butt++); y1+=ywidth; bz_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"DRAW BEZIER CURVE"); draw_button_border(butt++); t3d_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"3D ROTATION "); draw_button_border(butt++); y1+=ywidth; Translate_icon(x1,y1); init_button(butt,x1,y1,xwidth,ywidth,"TRANSLATE RECTANGLE"); draw_button_border(butt++); //y1+=ywidth; fl_icon(x2,y1); init_button(butt,x2,y1,xwidth,ywidth,"FILL A COLOR"); draw_button_border(butt++);
Department of Computer Science Engineering,U.V.C.E, 2011
45
Source Code
//now,the color buttons butt=0; x1=MIN_X+75; y1=MAX_Y+28; xwidth=30;ywidth=15; for(i=0;i<8;i++) //iteratively init the col-but structure { //init color button is very similar to init_button init_color_button(butt,x1,y1,xwidth,ywidth); draw_color_button_border(butt++); init_color_button(butt,x1,y2,xwidth,ywidth); draw_color_button_border(butt++); x1=x1+xwidth; } setcolor(Current_Color); } void dispfile() //display and updates filename in case of load/save,etc { setfillstyle(SOLID_FILL,LIGHTGRAY); bar(260,MIN_Y-30,379,MIN_Y-6); icons(260,MIN_Y-30,379,MIN_Y-6,1); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(MAX_X-15+8,4,MAX_X+1+8,15-2); icons(MAX_X-15+8,4,MAX_X+1+8,15-2,1); icons(MAX_X-14+8,5,MAX_X+8,15-3,1); setcolor(BLACK); settextstyle(DEFAULT_FONT,HORIZ_DIR,0); outtextxy(MAX_X-10+8,4,"x"); // exits on clicking outtextxy((getmaxx()textwidth(filename))/2,48,filename); } /* */ BASIC OPERATIONS
46
Chapter 4
Source Code
int check_mouse_on(int minx,int miny,int maxx,int maxy)//is mouse is on area { defined by boundary? if(mousex<minx || mousex>maxx || mousey<miny || mousey>maxy) return 0; return 1; }
//
int check_if_color() { int i=0; for(i=0;i<MAX_COLOR;i++) { if(check_mouse_on(colorbuttons[i].xmin,colorbuttons [i].ymin,colorbuttons[i].xmax,colorbuttons[i].ymax)) { Current_Color=colorbuttons[i].color; setfillstyle(SOLID_FILL,Current_Color); bar(MIN_X+20,MAX_Y+35,MIN_X+44,MAX_Y+50); setcolor(BLACK); rectangle(MIN_X+20,MAX_Y+35,MIN_X+44,MAX_Y+50); setcolor(Current_Color); return 1; } } return 0; } int check_if_button_pressed() { int ret_value=-1,color; int i; char ch; for(i=0;i<MAX_BUTTONS;++i) { if(check_mouse_on(buttons[i].xmin,buttons[i].ymin,b uttons[i].xmax,buttons[i].ymax)) { if(LeftButtonPressed && i!=Current_Button) //check which button { // if not current button ret_value=i; //change current button = i draw_button_border(Current_Button); Prev_Button=Current_Button; Current_Button=i; undraw_button_border(Current_Button); switch(Current_Button) { Department of Computer Science Engineering,U.V.C.E, 2011 47
Chapter 4
Source Code case NEW : hidemouse(); if(!saved) { ShowStatus("Save Changes (Y or N) ? "); ch=getch(); if(ch=='y'||ch=='Y') save(); } strcpy(filename,"Untitled"); dispfile(); clear(); draw_button_border(Current_Button); undraw_button_border(Prev_Button); Current_Button=Prev_Button; showmouse(); break; case CLEAR : hidemouse(); clear(); draw_button_border(Current_Button); undraw_button_border(Prev_Button); Current_Button=Prev_Button; showmouse(); break; case LOAD: hidemouse(); load(); draw_button_border(Current_Button); undraw_button_border(Prev_Button); Current_Button=Prev_Button; showmouse(); break; case SAVE: hidemouse(); save(); draw_button_border(Current_Button); undraw_button_border(Prev_Button); Current_Button=Prev_Button; showmouse(); break; case CLIP_OP: clear(); break; case TRANS_OP: clear(); }
}
Department of Computer Science Engineering,U.V.C.E, 2011
48
Chapter 4 if(prevx!=mousex||prevy!=mousey) ShowStatus(buttons[i].desc); return ret_value; }//check on which button }//for all button ClearStatus(); return ret_value; }
Source Code
void tools() { restrictmouse(MIN_X+2,MIN_Y+2,MAX_X-2,MAX_Y-2); hidemouse(); switch(Current_Button) { case 4 : case 5 : case 6 : case 7 : case 13: case 14: case 8 : rubberband(); break; case 9 : //freehand(); lineclipping(); break; case 10: //lineclipping(); rotate_line(); break; case 11: //drawtext(); Wheel(); break; case 12: //rotate_line(); seg(); break;
case 15: //restrictmouse(MIN_X+2,MIN_Y+2,MAX_X10,MAX_Y-10); //brush(); t3d(); break; case 17: //clearout(); fillcolor(); break; case 16:translate(); //clearin();
Department of Computer Science Engineering,U.V.C.E, 2011
49
Chapter 4 break; case 18: //seg(); scale(); break; case 19: rotate(); break; /* case 22:// t3d(); break; case 23: //fillcolor(); break; */ } showmouse(); restrictmouse(0,0,639,479); } void rubberband() { int x,y,xe,ye,tx,ty,b,r1,r2; R=1; showmouse(); getxy(); x=mousex;y=mousey; disp_coord(); if(LeftButtonPressed) { while(LeftButtonPressed) { getxy();disp_coord(); if(prevx==mousex&&prevy==mousey) continue; hidemouse(); putback(); showmouse(); getxy(); hidemouse(); switch(Current_Button) { case 4: bline(x,y,mousex,mousey); break; case 5: brectangle(x,y,mousex,mousey); break;
Source Code
50
bellipse(x,y,abs(x-mousex),abs(y-
case 8: spiral(x,y,abs(x-mousex)<abs(y-mousey)? abs(y-mousey):abs(x-mousex),1,50); break; case 13:hrcurve(x,y,mousex,mousey); break; case 14:bzcurve(x,y,mousex,mousey); break; } showmouse(); delay(10); }//while left button t=0; }//if left button } void Wheel() { char ch; int x,y,s; float theta=0; int i,j,f,b; // flushall(); clear(); ShowStatus("Press ESC to terminate"); getxy(); hidemouse(); while(!LeftButtonPressed) { getxy(); for(i=153;i<=573;i+=8) { if(kbhit()) if(getch()==27) { clear(); showmouse(); return; } setcolor(BLACK); myw(i,230,theta); delay(130); setcolor(WHITE); myw(i,230,theta); theta+=M_PI/10;
Department of Computer Science Engineering,U.V.C.E, 2011
51
Chapter 4 } for(i=573;i>=153;i-=8) { if(kbhit()) if(getch()==27) { clear(); showmouse(); return; } setcolor(BLACK); myw(i,230,theta); delay(130); setcolor(WHITE); myw(i,230,theta); theta-=M_PI/10; } } clear(); showmouse(); } void scale() { char *name; float sx,sy; setcolor(Current_Color); rectangle(MIN_X,MIN_Y,MAX_X,MAX_Y); ShowStatus("Draw rectangle to scale"); drawrectangle();
Source Code
name=readline("Enter the scaling factor sx: "); sx=atof(name); name=readline("Enter the scaling factor sy: "); sy=atof(name); setcolor(WHITE); setfillstyle(SOLID_FILL,WHITE); bar(a,b,c,d); c= (float)(c-a)*sx + (float)a; d= (float)(d-b)*sy + (float)b; if(c >=MAX_X) c=MAX_X-1; if(d >=MAX_Y) d=MAX_Y-1;
52
Chapter 4 void drawrectangle() { int color=15-Current_Color; int x,y; setcolor(color); setwritemode(XOR_PUT); x=mousex; y=mousey; while(LeftButtonPressed) { disp_coord(); rectangle(x,y,mousex,mousey); getxy(); rectangle(x,y,mousex,mousey); } setwritemode(COPY_PUT); setcolor(Current_Color); a=x, b=y, c=mousex, d=mousey;
Source Code
if(Current_Pattern==EMPTY_FILL) rectangle(x,y,mousex,mousey); else { setfillstyle(Current_Pattern,Current_Color); bar(x,y,mousex,mousey); } } void main() { int gd=DETECT,gm; initgraph(&gd,&gm,"C:\\tc\\bgi"); if(!initmouse()) { outtextxy(250,230,"Mouse not present"); getch(); exit(0); } wel(); cleardevice(); frame();// To create window startmouse((MIN_X+MAX_X)/2,(MIN_Y+MAX_Y)/2); showmouse(); init(); // To display all icons undraw_button_border(Current_Button); dispfile(); while(1) { tme();
Department of Computer Science Engineering,U.V.C.E, 2011
53
Chapter 4
Source Code
getxy(); if(!check_mouse_on(MIN_X+2,MIN_Y+2,MAX_X-2,MAX_Y2)) { setfillstyle(SOLID_FILL,LIGHTGRAY); bar(487,462,522,472); //refresh display bar(555,462,585,472); } else disp_coord(); if(LeftButtonPressed) { if(check_if_button_pressed()>=0) ; else if(check_if_color()) ClearStatus(); else if(check_mouse_on(MIN_X+2,MIN_Y+2,MAX_X2,MAX_Y-2)) { ClearStatus(); saved=0; tools(); } else check_if_exit(); } else check_if_button_pressed(); } } // to display exiting page void check_if_exit()//is mouse on exit area? { char ch; struct dosdate_t d; struct dostime_t t; if((check_mouse_on(MAX_X-15+1+8,4,MAX_X-1+8,153))&&LeftButtonPressed) { hidemouse(); icons(MAX_X-15+8,4,MAX_X-1+8,15-3,0); icons(MAX_X-14+8,4,MAX_X+8,15-3,0); ClearStatus(); ShowStatus("Save and exit(Y or N)?"); ch=getch(); if(ch=='y' || ch=='Y') { save(); } clearviewport(); cleardevice(); settextstyle(8,0,4); setcolor(5); outtextxy(50,100,"\n"); outtextxy(50,300,"\n"); setcolor(RED); outtextxy(100,25,"\n");
Department of Computer Science Engineering,U.V.C.E, 2011
54
Chapter 4 outtextxy(100,375,"\n"); rectangle(1,1,637,477); rectangle(3,3,635,475); setcolor(BLUE); outtextxy(190,200,"THANK YOU!!!!!"); setcolor(9); outtextxy(189,201,"THANK YOU!!!!!"); settextstyle(0,0,0); setcolor(12); _dos_getdate(&d); printf(" %d-%d-%d ", d.day,d.month,d.year);
Source Code
_dos_gettime(&t); printf(" %2d:%02d:%02d\n", t.hour, t.minute,t.second); outtextxy(430,450,"NOW PRESS ANY KEY TO EXIT"); settextstyle(DEFAULT_FONT,HORIZ_DIR,0); getch(); exit(0); } }
55
5. SAMPLE OUTPUT
56
CONCLUSION
We have attempted to design and implement a paint editor using C/C++, which supports enormous flexibility in the design and the use of graphics functions .The presence of many in-built classes and methods take care of many of the functionalities and reduce the job of coding as well as makes the implementation simpler. The project was started with the designing phase in which we figured the requirements needed, the layout design, then comes the detail designing of each function after which, was the testing and debugging stage. We have tried to implement the project making it as user-friendly and error free as possible. In future enhancement, the following features are addressed. The most obvious enhancement that we see is, support for the standard image formats such as BMP, JPEG, GIF etc. This would allow the editor to open image documents stored in these standard formats. We would also like to support saving of our documents in these formats so that the editor is compatible with all the standard graphics editors. Another feature we would like to incorporate is to provide a way for the user to store and open documents in directories other than the current directory. We would like to provide the user with a simple way to traverse the directory structure for file operations.
BIBLIOGRAPHY
Department of Computer Science Engineering,U.V.C.E, 2011
57
1. Yashwant Kanetkar, let us C, BPB Publications, 3rd editon 2. Yashwant Kanetkar, Graphics using c, BPB Publications, 2nd edtion 3. James D Foley, Andries Van Dam, Steven K Feiner, John F Hugies, Computer Graphics 4. Godse, Computer graphics, Technical Publications Pune, First edition
58