2024年元旦了,回顾整理下Code::blocks相关信息。
Code::blocks目前是信奥指定的NOI Linux上的C++IDE。
信奥官网
以前NIO指定的IDE是Dev-CPP,但是那个Dev-CPP调试代码补全很弱,dev太老旧了。
目前code::blocks(简称cbks)在Linux环境下国内外开发者很多,有很多git的开源项目
也提供cbks环境下得cmakes。
Windows应用程序开发visual studio用起来方便傻瓜的很按linus说法,背着开发者做了很多事,显然开发者
对Computer的掌控力被Windows削弱了,WIN不是给程序员是给用户开发的OS,Linux下面常用的Code::Blocks,
Qt Creator没有VS方便,补全弱一些,甚至shell下面命令行g++,但是像C++在偏科研及底层系统和工业
硬件开源的库github上Linux基本是主流,很多Win版本其实是移植来的, 事实上Linux C++及相关IDE是Programmer
的母语环境。
code::blocks在win上开发要下载的20.03, 地址 https://www.codeblocks.org/downloads/binaries/
下载上面的codeblocks-20.03mingw-nosetup.zip,这个zip只有168M,解压后不用安装,自带mingw
code::blocks配置freeglut网上有很多博客,主要是设置include,lib路径,指定lib
打开下面的buid options…
link setting, 如下设置lib的名称
search directoreis->Compiler设置include的路径,由于freeglut放在代码目录,所以这里是相对路径
linker设置lib路径
freeglut.dll拷贝到exe同目录下,也可以设置到 setting->Compiler->ToolChain executable->Additional Path
下面设置freeglut.dll所在的路径
放在lanzou的代码地址:freeglut-exam00
一个是把网上国外博主的vboCube的例子代码移过来了,主要是展示怎么opengl扩展使用vbo
和shader的代码
另一个是曲柄摇杆机构的动画仿真,其实显示只是用到直线glBegin-glEnd对就是opengl2.0以前的老旧API
但是demo和测试用起来非常方便。
动画代码直接备份到CSDN上, vmath来自opengl red book
#include <GL/glut.h>
#include <iostream>
#include <vector>
#include "vmath.h"
//
// n1 n2
//
// n0 n3
class QBYG_Model
{
public:
std::vector<vmath::dvec2> nodes;
double g01;
double g12;
double g23;
void init();
void step(double si);
void draw();
};
namespace vmath
{
bool cir_cir_int(vmath::dvec2& a, double r, vmath::dvec2& b, double R,
vmath::dvec2& intv0, vmath::dvec2& intv1)
{
//
// v0
//
// a b
//
// v1
vmath::dvec2 xv = b - a;
double s = vmath::length(xv);
if (s > (r+R))
{
return false;
}
xv /= s;
vmath::dvec2 yv(-xv[1], xv[0]);
double cos_A = (r*r+s*s-R*R) / (2.0*r*s);
double m = cos_A*r;
double n = sqrt(r*r-m*m);
intv0 = a + xv*m + yv * n;
intv1 = a + xv*m - yv * n;
return true;
}
};
static QBYG_Model s_model;
void QBYG_Model::init()
{
nodes.push_back(vmath::dvec2(0,10));
nodes.push_back(vmath::dvec2(30,0));
nodes.push_back(vmath::dvec2(80,60));
nodes.push_back(vmath::dvec2(100,0));
g01 = vmath::length(nodes[1] - nodes[0]);
g12 = vmath::length(nodes[2] - nodes[1]);
g23 = vmath::length(nodes[3] - nodes[2]);
}
void QBYG_Model::step(double si)
{
//
// b:1 c:2
//
// a:0 d:3
double l_ab_x = g01 * cos(si);
double l_ab_y = g01 * sin(si);
vmath::dvec2 v_ab(l_ab_x, l_ab_y);
nodes[1] = nodes[0] + v_ab;
vmath::dvec2 p0, p1;
if (vmath::cir_cir_int(nodes[1], g12, nodes[3], g23, p0, p1))
{
nodes[2] = p0;
//std::cout << " g12 = " <<g12 <<"\n";
//double l_12 = vmath::length(nodes[2] - nodes[1]);
//std::cout << " l12 = " <<l_12 <<"\n";
}
}
void QBYG_Model::draw()
{
glColor3d(0.1, 0.1, 0.1);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < nodes.size(); i++)
{
glVertex2f(nodes[i][0], nodes[i][1]);
}
glEnd();
}
static void resize(int width, int height)
{
const float ar = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double rt = 0.05;
double l = -width*0.5;
double r = width*0.5;
double b = -height*0.5;
double t = height*0.5;
l*=rt;
r*=rt;
b*=rt;
t*=rt;
glFrustum(l,r,b,t, 5.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}
static void display(void)
{
static double si = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
si = si + 1.5;
if (si > 360.0)
{
si -= 360.0;
}
double si_grad = (si / 180.0) * M_PI;
//std::cout << "si = " << si << "\n";
glLoadIdentity();
glTranslated(-30, -20, -20.0);
// compute qubingyaogan nodes
s_model.step(si_grad);
// draw qubingyaogan
s_model.draw();
glutSwapBuffers();
}
static void idle()
{
glutPostRedisplay();
}
int main(int argc, char *argv[])
{
s_model.init();
glutInit(&argc, argv);
glutInitWindowSize(800, 600);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("freeglut demo");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutIdleFunc(idle);
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glutMainLoop();
return 0;
}