图形学渲染器 随笔

来源:互联网 发布:淘宝童学少年儿童家具 编辑:程序博客网 时间:2024/04/30 09:16

1.glutInit(int *argc, char **argv)

初始化GLUT库(glut.lib),应在其它GLUT函数和OpenGL函数之前进行调用。glutInit()接收来自main函数的参数,程序可以具体实现相关的方式来使用这些参数。

argc int*

一个指针,指向从main()函数传递过来的没更改的argc变量。argc记录的是命令行中输入参数的数目。

argv char**

一个指针,指向从main()函数传递过来的没更改的argv变量。argv是一个拥有argc个元素的字符串数组,每个元素保存一个命令行中输入的参数。

2.main函数

假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的提示符下键入:   PROG ABCDEFGH  IJKL<回车>则输出结果为:
main(int argc,char *argv[])
{while(--argc>0)
printf("%s",argv[argc]);
printf("\n");}
各句程序什么意思?
输出结果是什么?
请帮忙解决,谢谢
回答求助:
这段代码不长,但要说清楚你的要求还需要比较长的一段话。首先,说一下main(int argc,char *argv[])函数的两个形参,第一个int argc,是记录你输入在命令行(你题目中说的操作就是命令行输入)上的字符串个数;第二个*argv[]是个指针数组,存放输入在命令行上的命令(字符串)。当命令行输入PROG ABCDEFGH IJKL时,记录了3个字符串(以间隔为界,不含间隔,这是约定),*argv[0]中放的是"PROG",*argv[1]中放的是"ABCDEFGH",*argv[2]中放的是"IJKL",这样argc就是3了。while(--argc>0)是条件循环,argc>0时继续;argc初值是3,前置--先减1为2,所以后面的输出语句打出*argv[2]中的内容IJKL;再执行while(--argc>0),argc再减1为1,打出*argv[1]中的内容ABCDEFGH;再循环,argc减1为0,条件破坏,不再执行while(--argc>0)的循环体。所以最后显示的是IJKLABCDEFGH。不知给你说清楚了没有?希望有帮助。
3.一些gl函数
glutInitDisplayMode函数原型void glutInitDisplayMode(unsigned int mode),函数功能为设置初始显示模式
glClearColor来自OPENGL,其中它是通过glClear使用红,绿,蓝以及AFA值来清除颜色缓冲区的,并且都被归一化在(0,1)之间的值,其实就是清空当前的所有颜色。
glMatrixMode指定哪一个矩阵是当前矩阵,设置当前矩阵模式: GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
glLoadIdentity:将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
glOrtho设置或修改修剪空间的范围, 可以将当前的可视空间设置为正投影空间,这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)
glColor3f()  在OpenGl中设置颜色。从函数名字就可以看出,它的参数应该有三个,类型是float型的。另外一点是它的参数值的范围是[0.0,1.0]一般的,可以将这三个参数值视为颜色的成分。

0.0  -- >  不使用颜色成分;

1.0  -- >  使用颜色的最大值


glBegin是OpenGL里使用的函数。而OpenGL是一种高性能图形算法行业标准,是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。glBegin是和glEnd结合起来使用的。
glFlush()
就是强制刷新,OpenGL是使用一条渲染管线[3] 线性处理命令的,一般情况下,我们提交给OpenGL的指令并不是马上送到驱动程序[4] 里执行的,而是放到一个缓冲区里面,等这个缓冲区满了再一次过发到驱动程序里执行;很多时候只有几条指令是填充不满那个缓冲区的,就是说这些指令根本没有被发送到驱动里,所以我们要调用glFlush来强制把这些指令送到驱动里进行处理。
glutPostRedisplay 标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板。多次调用glutPostRedisplay,在下一个显示回调只产生单一的重新显示回调。

vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.

     用法: 2.变量声明:

               2.1 例:声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。

               2.2 例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector <int *> a.同理想用向量代替三维数组也是一样,vector <int**>a;再往上面依此类推. 

          3.具体的用法以及函数调用:

          3.1 如何得到向量中的元素?其用法和数组一样: 

          vector <int *> a

          int b = 5;

          a.push_back(b);//该函数下面有详解

          cout<<a[0];       //输出结果为5

1.push_back   在数组的最后添加一个数据
2.pop_back    去掉数组的最后一个数据 
3.at                得到编号位置的数据
4.begin           得到数组头的指针
5.end             得到数组的最后一个单元+1的指针
6.front        得到数组头的引用
7.back            得到数组的最后一个单元的引用
8.max_size     得到vector最大可以是多大
9.capacity       当前vector分配的大小
10.size           当前使用数据的大小
11.resize         改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve      改变当前vecotr所分配空间的大小
13.erase         删除指针指向的数据项
14.clear          清空当前的vector
15.rbegin        将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend          将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty        判断vector是否为空
18.swap         与另一个vector交换数据

    3.2  详细的函数实现功能:其中vector<int> c.

                             c.clear()         移除容器中所有数据。

                             c.empty()         判断容器是否为空。

                             c.erase(pos)        删除pos位置的数据

                             c.erase(beg,end) 删除[beg,end)区间的数据

                             c.front()         传回第一个数据。

                             c.insert(pos,elem)  在pos位置插入一个elem拷贝

                             c.pop_back()     删除最后一个数据。

                             c.push_back(elem) 在尾部加入一个数据。

                             c.resize(num)     重新设置该容器的大小

                             c.size()         回容器中实际数据的个数。

                             c.begin()           返回指向容器第一个元素的迭代器

                             c.end()             返回指向容器最后一个元素的迭代器

List将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.


assign() 给list赋值 
back() 返回最后一个元素 
begin() 返回指向第一个元素的迭代器 
clear() 删除所有元素 
empty() 如果list是空的则返回true 
end() 返回末尾的迭代器 
erase() 删除一个元素 
front() 返回第一个元素 
get_allocator() 返回list的配置器 
insert() 插入一个元素到list中 
max_size() 返回list能容纳的最大元素数量 
merge() 合并两个list 
pop_back() 删除最后一个元素 
pop_front() 删除第一个元素 
push_back() 在list的末尾添加一个元素 
push_front() 在list的头部添加一个元素 
rbegin() 返回指向第一个元素的逆向迭代器 
remove() 从list删除元素 
remove_if() 按指定条件删除元素 
rend() 指向list末尾的逆向迭代器 
resize() 改变list的大小 
reverse() 把list的元素倒转 
size() 返回list中的元素个数 
sort() 给list排序 
splice() 合并两个list 
swap() 交换两个list 
unique() 删除list中重复的元素




fgetc 意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。

feof 检测流上的文件结束符

fscanf 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。

strstr 函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回NULL。

sprintf字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数

fscanf从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。




错误 1 error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. g:\计算机图形学\project1\project1\source.cpp 9 1 Project1

FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能 
  fopen() 打开流 
  fclose() 关闭流 
  fputc() 写一个字符到流中 
  fgetc() 从流中读一个字符 
  fseek() 在流中定位到指定的字符 
  fputs() 写字符串到流 
  fgets() 从流中读一行或指定个字符 
  fprintf() 按格式输出到流 
  fscanf() 从流中按格式读取 
  feof() 到达文件尾时返回真值 
  ferror() 发生错误时返回其值 
  rewind() 复位文件定位器到文件开始处 
  remove() 删除文件 
  fread() 从流中读指定个数的字符 
  fwrite() 向流中写指定个数的字符 
  tmpfile() 生成一个临时文件流 
  tmpnam() 生成一个唯一的文件名

0 0
原创粉丝点击