1. 程式人生 > >【OpenGL】中點圓、橢圓生成演算法

【OpenGL】中點圓、橢圓生成演算法

中點圓生成演算法

因為圓具有對稱性,一次性可以畫8個點

中點圓生成演算法-C++程式碼

#include<GL\glut.h>
#include<iostream>
#include<cmath>
using namespace std;

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);  // Set display-window color to white.
    glMatrixMode(GL_PROJECTION);       // Set projection parameters.
gluOrtho2D(0.0, 200.0, 0.0, 150.0); } /* 畫點 */ void setPixel(int x, int y) { glColor3f(0.0, 0.0, 1.0); // 藍色 glPointSize(2.0f); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); glFlush(); } /* 8路對稱 */ void Cirpot(int x0, int y0, int x, int y) { // 1 setPixel((x0 + x), (y0 + y)); // 2
setPixel((x0 + y), (y0 + x)); // 3 setPixel((x0 + y), (y0 - x)); // 4 setPixel((x0 + x), (y0 - y)); // 5 setPixel((x0 - x), (y0 - y)); // 6 setPixel((x0 - y), (y0 - x)); // 7 setPixel((x0 - y), (y0 + x)); // 8 setPixel((x0 - x), (y0 + y)); } /* 中點畫圓演算法 */ void MidPoint_Circle(int
x0, int y0, int r) { int x = 0; int y = r; int d = 1 - r; // d = 1.25-r的取整的結果 Cirpot(x0, y0, x, y); while (x < y) { if (d < 0) { d += 2 * x + 3; } else { d += 2 * (x - y) + 5; y--; } x++; Cirpot(x0, y0, x, y); } } // 視窗大小改變時呼叫的登記函式 void ChangeSize(GLsizei w, GLsizei h) { if (h == 0) h = 1; // 設定視區尺寸 glViewport(0, 0, w, h); // 重置座標系統 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 建立修剪空間的範圍 if (w <= h) glOrtho(0.0f, 250.0f, 0.0f, 250.0f*h / w, 1.0, -1.0); else glOrtho(0.0f, 250.0f*w / h, 0.0f, 250.0f, 1.0, -1.0); } /* */ void display(void) { // 用當前背景色填充視窗,如果不寫這句會殘留之前的影象 glClear(GL_COLOR_BUFFER_BIT); int x0 = 100, y0 = 100, r = 30; MidPoint_Circle(x0, y0, r); } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(200, 200); glutInitWindowSize(400, 400); glutCreateWindow("MidCircle"); glutDisplayFunc(display); glutReshapeFunc(ChangeSize); init(); glutMainLoop(); return 0; }

中點圓生成演算法-執行結果
中點圓生成演算法

中點橢圓生成演算法

中點橢圓生成演算法-C++程式碼

#include<GL\glut.h>
#include<iostream>
#include<cmath>
using namespace std;

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);  // Set display-window color to white.
    glMatrixMode(GL_PROJECTION);       // Set projection parameters.
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}

/*
    畫點
*/
void setPixel(int x, int y)
{
    glColor3f(0.0, 0.0, 1.0);       // 藍色
    glPointSize(2.0f);
    glBegin(GL_POINTS);
        glVertex2f(x, y);
    glEnd();
    glFlush();
}

/*
    橢圓4路對稱
*/
void Ellipsepot(int x0, int y0, int x, int y)
{
    // 1
    setPixel((x0 + x), (y0 + y));
    // 2
    setPixel((x0 + x), (y0 - y));
    // 3
    setPixel((x0 - x), (y0 - y));
    // 4
    setPixel((x0 - x), (y0 + y));
}

/*
    中點畫橢圓演算法
*/
void MidPoint_Ellipse(int x0, int y0, int a, int b)
{
    double sqa = a*a;
    double sqb = b*b;

    double d = sqb + sqa*(0.25 - b);
    int x = 0;
    int y = b;
    Ellipsepot(x0, y0, x, y);
    // 1
    while (sqb*(x + 1) < sqa*(y - 0.5))
    {
        if (d < 0)
        {
            d += sqb*(2 * x + 3);
        }
        else
        {
            d += (sqb*(2 * x + 3) + sqa*((-2)*y + 2));
            --y;
        }
        ++x;
        Ellipsepot(x0, y0, x, y);
    }
    d = (b * (x + 0.5)) * 2 + (a * (y - 1)) * 2 - (a * b) * 2;
    // 2
    while (y > 0)
    {
        if (d < 0)
        {
            d += sqb * (2 * x + 2) + sqa * ((-2) * y + 3);
            ++x;
        }
        else
        {
            d += sqa * ((-2) * y + 3);
        }
        --y;
        Ellipsepot(x0, y0, x, y);
    }
}

// 視窗大小改變時呼叫的登記函式
void ChangeSize(GLsizei w, GLsizei h)
{

    if (h == 0)     h = 1;

    // 設定視區尺寸
    glViewport(0, 0, w, h);

    // 重置座標系統
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 建立修剪空間的範圍
    if (w <= h)
        glOrtho(0.0f, 250.0f, 0.0f, 250.0f*h / w, 1.0, -1.0);
    else
        glOrtho(0.0f, 250.0f*w / h, 0.0f, 250.0f, 1.0, -1.0);

}

/*

*/
void display(void)
{
    // 用當前背景色填充視窗,如果不寫這句會殘留之前的影象
    glClear(GL_COLOR_BUFFER_BIT);

    int x0 = 120, y0 = 100, a = 100, b = 60;
    MidPoint_Ellipse(x0, y0, a, b);
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(200, 200);
    glutInitWindowSize(400, 400);
    glutCreateWindow("MidEllipse");
    glutDisplayFunc(display);
    glutReshapeFunc(ChangeSize);
    init();
    glutMainLoop();
    return 0;
}

中點橢圓生成演算法-執行結果
中點橢圓生成演算法