CG/Assignment A-3a (Pattern using DDA Line and Bresenham Circle Algorithm).cpp

111 lines
2.6 KiB
C++

/*
Problem Statement: a) Write C++ program to draw the following pattern. Use DDA line and Bresenham's circle drawing algorithm. Apply the concept of encapsulation.
Code from Computer Graphics (SPPU - Second Year - Computer Engineering - Content) repository on KSKA Git: https://git.kska.io/sppu-se-comp-codes/CG
*/
// BEGINNING OF CODE
#include <iostream>
#include <graphics.h>
#include <math.h>
using namespace std;
void bresenhamCircle(int xcord, int ycord, int rad) {
// function to create circle using Bresenham algorithm
int dec, x, y;
dec = 3-2*rad; // dec is the decision parameter
x = 0;
y = rad; // set y equals to radius
while (y >= x) {
putpixel(xcord+x, ycord+y, 15); // bottom right
putpixel(xcord+y, ycord+x, 15); // right side
putpixel(xcord+y, ycord-x, 15); // right up
putpixel(xcord+x, ycord-y, 15); // top
putpixel(xcord-x, ycord-y, 15); // left top
putpixel(xcord-y, ycord-x, 15); // left side
putpixel(xcord-y, ycord+x, 15); // left bottom
putpixel(xcord-x, ycord+y, 15); // bottom
x++;
// note: 15 is the colour, instead you can also put WHITE, RED, GREEN, etc.
// decision paramter
if (dec > 0 ) {
y--;
dec = dec+4*(x-y)+10;
}
else {
dec = dec+4*x+6;
}
// delay(10); // optional delay to watch the circle being made
}
}
void ddaLine(float x1, float y1, float x2, float y2) {
// DDA line drawing algorithm (will be used for triangle)
float dx, dy, steps, xinc, yinc, x, y;
dx = abs(x2-x1);
dy = abs(y2-y1);
if (dx>dy) {
steps = dx;
}
else {
steps = dy;
}
xinc = (x2-x1)/steps;
yinc = (y2-y1)/steps;
x = x1;
y = y1;
putpixel(round(x), round(y), 15);
for (int i=0; i<steps; i++) {
x = x + xinc;
y = y + yinc;
putpixel(round(x), round(y), 15);
}
}
int main() {
float x1, y1, x2, y2, x3; // variables to store line coordinates
int x, y, r; // variables to store circle coordinates
cout<<endl<<"Enter coordinates:";
cout<<endl<<"Enter value for X1:\t";
cin>>x1;
cout<<endl<<"Enter value for Y1:\t";
cin>>y1;
cout<<endl<<"Enter value for X2:\t";
cin>>x2;
// calculating values for x3 and y2 for triangle
x3 = (x2+x1)/2;
y2 = y1 - sqrt(pow((x2-x1), 2) - pow((x2-x1)/2, 2));
// initializing graphics window
int gd=DETECT, gm;
initgraph(&gd, &gm, NULL);
// make triangle
ddaLine(x1, y1, x2, y1);
ddaLine(x2, y1, x3, y2);
ddaLine(x3, y2, x1, y1);
// make inner circle
x = x3;
y = y2+2*(y1-y2)/3;
r = (y1-y2)/3;
bresenhamCircle(x,y,r);
// make outer circle
r = 2*(y1-y2)/3; // instead you can also use "r=2*r", it's the same
bresenhamCircle(x,y,r);
delay(50000);
closegraph();
return 0;
}
// END OF CODE