Merhaba arkadaşlar bu yazımda sizlere opengl ile çember türevleri olan limacon,cardioid,threeLeaf, fourLeaf, spiral in nasıl çizileceğini anlatacağım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
#include <GL/glut.h> #include <stdlib.h> #include <math.h> using namespace std; #include <iostream> struct screenPt { GLint x; GLint y; }; typedef enum { limacon = 1, cardioid, threeLeaf, fourLeaf, spiral } curveName; GLsizei winWidth = 600, winHeight = 500; // Initial display window size. void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 200.0, 0.0, 150.0); } void lineSegment(screenPt pt1, screenPt pt2) { glBegin(GL_LINES); glVertex2i(pt1.x, pt1.y); glVertex2i(pt2.x, pt2.y); glEnd(); } void drawCurve(GLint curveNum) { /* The limacon of Pascal is a modification of the circle equation * with the radius varying as r = a * cos (theta) + b, where a * and b are constants. A cardioid is a limacon with a = b. * Three-leaf and four-leaf curves are generated when * r = a * cos (n * theta), with n = 3 and n = 2, respectively. * A spiral is displayed when r is a multiple of theta. */ const GLdouble twoPi = 6.283185; const GLint a = 175, b = 60; GLfloat r, theta, dtheta = 1.0 / float(a); GLint x0 = 200, y0 = 250; // Set an initial screen position. screenPt curvePt[2]; glColor3f(0.0, 0.0, 0.0); // Set curve color to black. curvePt[0].x = x0; // Initialize curve position. curvePt[0].y = y0; switch (curveNum) { case limacon: curvePt[0].x += a + b; break; case cardioid: curvePt[0].x += a + a; break; case threeLeaf: curvePt[0].x += a; break; case fourLeaf: curvePt[0].x += a; break; case spiral: break; default: break; } theta = dtheta; while (theta < twoPi) { switch (curveNum) { case limacon: r = a * cos(theta) + b; break; case cardioid: r = a * (1 + cos(theta)); break; case threeLeaf: r = a * cos(3 * theta); break; case fourLeaf: r = a * cos(2 * theta); break; case spiral: r = (a / 4.0) * theta; break; default: break; } curvePt[1].x = x0 + r * cos(theta); curvePt[1].y = y0 + r * sin(theta); lineSegment(curvePt[0], curvePt[1]); curvePt[0].x = curvePt[1].x; curvePt[0].y = curvePt[1].y; theta += dtheta; } } void displayFcn(void) { GLint curveNum; glClear(GL_COLOR_BUFFER_BIT); // Clear display window. cout << "\nEnter the integer value corresponding to\n"; cout << "one of the following curve names.\n"; cout << "Press any other key to exit.\n"; cout << "\n1-limacon, 2-cardioid, 3-threeLeaf, 4-fourLeaf, 5-spiral: "; cin >> curveNum; if (curveNum == 1 || curveNum == 2 || curveNum == 3 || curveNum == 4 || curveNum == 5) drawCurve(curveNum); else exit(0); glFlush(); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)newWidth, 0.0, (GLdouble)newHeight); glClear(GL_COLOR_BUFFER_BIT); } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100, 100); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("Draw Curves"); init(); glutDisplayFunc(displayFcn); glutReshapeFunc(winReshapeFcn); glutMainLoop(); } |
Programı çalıştırdıktan sonra arkadaki konsol ekranından çizdirilmesi gereken şekli seçip ekrana bastırabiliriz.
1-Limacon
2-
3-threeLeaf
4-fourLeaf
5-spiral:
5 farklı türde çember türevleri yukarıdaki gibidir.