code::blocks代码及信息回顾
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//// v1vmath::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:3double 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 nodess_model.step(si_grad);// draw qubingyaogans_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;
}