其实是图形学作业,顺便使用Xcode试试OpenGL的基本绘图。由于是计算机图形学基础算法,所以实现专注于算法层次,所以使用OpenGL的接口实现了一个类似Turbo C的图形函数库。

新建Xcode项目,Command Application,然后设置这里添加如下两个库(听闻GLUT在OS X 10.9以后就弃用了,也没好好检索下Google,索性先这么用吧,看一堆Warnings...),点击能够看大图:

后就可以使用OpenGL的函数了,如图Demo:

下面是我的代码,直接贴了,不编辑了0.0:

CommonGL.h:

/**
        Author: SpringHack - springhack@live.cn
        Last modified: 2016-03-21 16:39:40
        Filename: CommonGL.h
        Description: Created by SpringHack using vim automatically.
**/

#ifndef CommonGL_h
#define CommonGL_h

#define MAXX 512
#define MAXY 512

#define RED 0
#define GREEN 1
#define BLUE 2
#define WHITE 3
#define BLACK 4
#define ORANGE 5

float Color[][3] = {
        {1.0f, 0.0f, 0.0f},
        {0.0f, 1.0f, 0.0f},
        {0.0f, 0.0f, 1.0f},
        {1.0f, 1.0f, 1.0f},
        {0.0f, 0.0f, 0.0f},
        {1.0f, 0.647f, 0.0f},
    };

#include <GLUT/GLUT.h>

void setScreen();

void draw()
{
    //设置清屏色
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    //设置绘图图时的坐标系统
    glOrtho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
    //开始渲染
    glBegin(GL_POINTS);
    setScreen();
    glEnd();
    glFlush();
}

void initGL(int argc, const char *argv[])
{
    //初始化GLUT库
    glutInit(&argc, (char**)argv);
    //创建一个窗口并制定窗口名
    glutCreateWindow("SpringHack OpenGL Demo");
    //注册一个绘图图函数,操作系统在必要时刻就会对窗体进行重新��制操作
    glutDisplayFunc(draw);
    //进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环(永生循环)
    glutMainLoop();
}

void putpixel(int x, int y, int c)
{
    float xx = (float)(x)/MAXX;
    float yy = (float)(y)/MAXY;
    glColor3f(Color[c][0], Color[c][1], Color[c][2]);
    glVertex3f(xx, yy, 0.0f);
}

int main(int argc, const char* argv[])
{
    initGL(argc, argv);
    return 0;
}

#endif /* CommonGL_h */

main.cpp:


/**
        Author: SpringHack - springhack@live.cn
        Last modified: 2016-03-21 16:39:33
        Filename: main.cpp
        Description: Created by SpringHack using vim automatically.
**/

#include <iostream>
#include "CommonGL.h"


//直线生成算法
void DDALine (int x0,int y0,int x1,int y1,int color)
{
    int x;
    float dx, dy, y, k;
    dx = x1 - x0,  dy = y1 - y0;
    k = dy/dx, y = y0;
    for (x=x0;x<=x1;x++)
    {
        putpixel (x, int(y+0.5), color);
        y = y + k;
    }
}

void MidpointLine (int x0,int y0,int x1, int y1,int color)
{
    int a, b, d1, d2, d, x, y;
    a = y0 - y1, b = x1 - x0, d = 2 * a + b;
    d1 = 2 * a, d2 = 2 * (a + b);
    x = x0, y = y0;
    putpixel(x, y, color);
    while (x<x1)
    {
        if (d<0)
        {
            x++, y++, d += d2;
        } else {
            x++, d+=d1;
        }
        putpixel(x, y, color);
    }
}

void Bresenhamline(int x0,int y0,int x1, int y1,int color)
{
    int x, y, dx, dy;
    float k, e;
    dx = x1 - x0, dy = y1 - y0, k = dy/dx;
    e = -0.5, x = x0, y = y0;
    for (int i=0;i<=dx;++i)
    {
        putpixel(x, y, color);
        x = x + 1;
        e = e + k;
        if (e>=0)
        {
            y++, e = e - 1;
        }
    }
}


//圆生成算法
void CirclePoints(int x, int y, int color)
{
    putpixel(x,y,color);
    putpixel(y,x,color);
    putpixel(-x,y,color);
    putpixel(y,-x,color);
    putpixel(x,-y,color);
    putpixel(-y,x,color);
    putpixel(-x,-y,color);
    putpixel(-y,-x,color);
}

void MidPointCircle(int r, int color)
{
    int x, y;
    float d;
    x = 0;
    y = r;
    d = 1.25 - r;
    CirclePoints(x, y, color); //显示圆弧上的八个对称点
    while(x <= y)
    {
        if(d<0)
            d += 2 * x + 3;
        else{
            d += 2 * (x - y) + 5;
            y--;
        }
        x++;
        CirclePoints(x, y, color);
    }
}


//程序入口函数
void setScreen()
{
    //画直线
    DDALine(0, 0, 100, 100, RED);
    MidpointLine(100, 100, 200, 200, WHITE);
    Bresenhamline(200, 200, 300, 300, BLUE);
    //画圆
    MidPointCircle(141, GREEN);
}

直接建立两个文件粘贴代码就OK了0.0