其实是图形学作业,顺便使用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