首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

实验3 OpenGL几何变换

核心库,每一种几何变换都有一个独立函数,所有变换都在三维空间中定义。...假设当前矩阵为单位矩阵,然后先乘以一个表示旋转矩阵R,再乘以一个表示移动矩阵T,最后得到矩阵再乘上每一个顶点坐标矩阵v。那么,经过变换得到顶点坐标就是((RT)v)。...即:实际变换顺序与代码顺序是相反。由于“先移动后旋转”和“先旋转后移动”得到结果很可能不同,初学时候需要特别注意这一点。...从“相对移动”观点来看,改变观察点位置与方向和改变物体本身位置与方向具有等效性。OpenGL,实现这两种功能甚至使用是同样函数。...当我们需要保存,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次保存,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。

1.2K20

7种你应该知道JavaScript常见错误

cat将返回“ cat”,而dog引发ReferenceError,因为环境记录找不到名为dog变量。...当在记录中找到环境值并提取并返回值,将以该变量名称作为关键字搜索环境记录。调用尚未定义函数。 现在,当我们创建或定义一个没有赋值变量。...将在env记录搜索该变量,当发现该初始未定义,该赋值将被覆盖。...当我们键入JS引擎难以理解代码,会出现此错误。解析期间,JS引擎捕获了此错误。 JS引擎,我们代码经历了不同阶段,然后才能在终端上看到运行结果。...JSURI(统一资源指示符)具有以下功能:decodeURI,decodeURIComponent等。 如果我们用错误参数调用其中任何一个,我们将得到一个URIError。

2.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    低级工具——C语言C++

    有些读者应该是不懂C语言/C++,所以这篇文章我就来讲一下C语言/C++为什么可以作为低级工具,为什么它们速度非常快?...特殊符号 特殊符号,预编译程序可以识别一些特殊符号。例如在源程序中出现LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译C源程序名称。...预编译程序对于源程序中出现这些串将用合适值进行替换。 预编译程序所完成基本上是对源程序“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号输出文件。...例如,某个源文件函数可能引用了另一个源文件定义某个符号(如变量或者函数调用等);程序可能调用了某个库文件函数,等等。所有的这些问题,都需要经链接程序处理方能得以解决。...链接程序主要工作就是将有关目标文件彼此相连接,也即将在一个文件引用符号同该符号另外一个文件定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行统一整体。

    2.1K10

    CC++面试常问题集(1)

    C++支持函数重载,C不支持函数重载 C++中有引用C不存在引用概念 面向过程和面向对象区别 (1)面向过程:面向过程编程就是分析出解决问题步骤,然后把这些步骤一步一步实现,使用时候一个一个依次调用就可以了...例如,某个源文件函数可能引用了另一个源文件定义某个符号(如变量或者函数调用等);程序可能调用了某个库文件函数,等等。所有的这些问题,都需要经链接程序处理方能得以解决。...链接程序主要工作就是将有关目标文件彼此相连接,也即将在一个文件引用符号同该符号另外一个文件定义连接起来,使得所有的这些目标文件成为一个能够装入执行统一整体。...堆:堆是从低向高地址扩展数据结构,是不连续内存区域;关于堆上内存空间分配过程,首先应该知道操作系统有一个记录空闲内存地址链表,当系统收到程序申请遍历该链表,寻找第一个空间大于所申请空间堆结点...当对一个已知对象进行拷贝,编译系统自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。

    71540

    C++:16---强制类型转换和类型转换

    旧式强制类型转换 早期C/C++,显式地进行强制类型转换有以下两种形式: type (expr) ; //函数形式强制类型转换 (type) expr; //...*>(pc); 当我们去掉某个对象const性质之后,编译器就不再阻止我们对该对象进行写操作了,因此写操作产生未定义后果 演示案例 const_cast只能改变表达式常量属性,而不能改变表达式数据类型...运算符:用于返回表达式类型 dynamic_cast运算符:用于将基类指针或引用安全地转换成派生类指针或引用 当我们将这两个运算符用于某种类型指针或引用,并且该类含有虚函数,运算符将使用指针或引用所绑定对象动态类型...: 可以一个操作同时完成类型转换和条件检查两项任务 而且,指针dpif语句外部是不可访问。...指针类型dynamic_cast在出错返回0 当对引用类型转换失败,程序抛出一个名为std::bad_cast异常,该异常定义typeinfo头文件 例如: class Base { public

    2K20

    头文件是必须吗?跟一跟编译过程~~~

    这里目标代码是汇编代码,所以g++ -S产生一个汇编文件。...上面的ld是链接器,是一个可执行程序,它输入是一个或多个目标文件,如上面指令main.o。 也就是说,目标文件main.o引用了func(),但链接器找不到它定义。...显然,main.o引用未定义func()被链接器func.o中找到了。...即,链接器面对一个目标文件,如果碰到里面有未定义引用,会在其他目标文件查找,如果找不到,则报错“undefined reference to”。如果找到有且仅有一个,则pass。...本文只是就着这个问题,跟了下编译过程,看看平常开发过程遇到编译报错“未定义引用”、“未声明变量”这些错误来源是哪原因是什么。

    2K10

    十个 PHP 开发者最容易犯错误

    如果你在想遍历数组操作数组每个元素, foreach 循环中使用引用十分方便,例如 $arr = array(1, 2, 3, 4); foreach ($arr as &$value)...你要记住 foreach 并不会产生一个块级作用域。因此,在上面例子 $value 是一个全局引用变量。 foreach 遍历,每一次迭代都会形成一个对 $arr 下一个元素引用。...(这就是为什么我们会得到未定义索引」 消息)。...一个我们平时常常能见到查询效率低下地方 (例如循环中)是使用一个数组值 (比如说很多 ID )向表发起请求。...PHP 没有 char 数据类型; 只能用 string 类型。记住一点, PHP 增加 string 类型 z 得到是 aa: php> $c = 'z'; echo ++$c .

    2.6K50

    十个 PHP 开发者最容易犯错误

    如果你在想遍历数组操作数组每个元素, foreach 循环中使用引用十分方便,例如 $arr = array(1, 2, 3, 4); foreach ($arr as &$value)...你要记住 foreach 并不会产生一个块级作用域。因此,在上面例子 $value 是一个全局引用变量。 foreach 遍历,每一次迭代都会形成一个对 $arr 下一个元素引用。...(这就是为什么我们会得到未定义索引」 消息)。...一个我们平时常常能见到查询效率低下地方 (例如循环中)是使用一个数组值 (比如说很多 ID )向表发起请求。...PHP 没有 char 数据类型; 只能用 string 类型。记住一点, PHP 增加 string 类型 z 得到是 aa: php> $c = 'z'; echo ++$c .

    3K90

    易犯错误 | 十个 PHP 开发者最容易犯错误

    如果你在想遍历数组操作数组每个元素, foreach 循环中使用引用十分方便,例如 $arr = array(1, 2, 3, 4); foreach ($arr as &$value)...你要记住 foreach 并不会产生一个块级作用域。因此,在上面例子 value 是一个全局引用变量。 foreach 遍历,每一次迭代都会形成一个对 arr 下一个元素引用。...元素(这就是为什么我们会得到未定义索引」 消息)。...一个我们平时常常能见到查询效率低下地方 (例如循环中)是使用一个数组值 (比如说很多 ID )向表发起请求。...PHP 没有 char 数据类型;只能用 string 类型。记住一点, PHP 增加 string 类型 z 得到是 aa: php> $c = 'z'; echo ++$c .

    4.5K20

    Python遇见C++碰出编译火花

    有些读者应该是不懂C语言/C++,所以这篇文章我就来讲一下C语言/C++为什么可以作为低级工具,为什么它们速度非常快?...特殊符号 特殊符号,预编译程序可以识别一些特殊符号。例如在源程序中出现LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译C源程序名称。...预编译程序对于源程序中出现这些串将用合适值进行替换。 预编译程序所完成基本上是对源程序“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号输出文件。...例如,某个源文件函数可能引用了另一个源文件定义某个符号(如变量或者函数调用等);程序可能调用了某个库文件函数,等等。所有的这些问题,都需要经链接程序处理方能得以解决。...链接程序主要工作就是将有关目标文件彼此相连接,也即将在一个文件引用符号同该符号另外一个文件定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行统一整体。

    98510

    实验5 OpenGL二维几何变换

    3.实验原理: (1) OpenGL下几何变换 OpenGL核心库,每一种几何变换都有一个独立函数,所有变换都在三维空间中定义。...假设当前矩阵为单位矩阵,然后先乘以一个表示旋转矩阵R,再乘以一个表示移动矩阵T,最后得到矩阵再乘上每一个顶点坐标矩阵v。那么,经过变换得到顶点坐标就是((RT)v)。...即:实际变换顺序与代码顺序是相反。由于“先移动后旋转”和“先旋转后移动”得到结果很可能不同,初学时候需要特别注意这一点。...设置方法是以GL_MODELVIEW为参数调用glMatrixMode函数,例如: glMatrixMode(GL_MODELVIEW); 该语句指定一个4×4建模矩阵作为当前矩阵。...当我们需要保存,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次保存,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。

    2.4K10

    java实现 所有 DNA 都由一系列缩写为 A,C,G 和 T 核苷酸组成,例如:“ACGAATTCCG”。研究 DNA ,识别 DNA 重复序列有时会对研究非常有帮助。 编写一个函数来

    所有 DNA 都由一系列缩写为 A,C,G 和 T 核苷酸组成,例如:“ACGAATTCCG”。研究 DNA ,识别 DNA 重复序列有时会对研究非常有帮助。...编写一个函数来查找目标子串,目标子串长度为 10,且 DNA 字符串 s 中出现次数超过一次。...AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC", "CCCCCAAAAA"] 解法相当简单: 1 开两个set集合 然后存储字符串 2 字符串每一个都截...10是个长度 3 判断存储里面是否已经含有 ,已经含有 放到输出集合里面(判断好条件 s.length()-Max+1 ) 4 注意: set可以自动转换为List ,因为set不含重复...,list里面含有重复 ,所以可以new ArrayList( set); class Solution { public List findRepeatedDnaSequences

    70820

    你必须掌握 7 种 JavaScript 错误类型

    dog ^ ReferenceError: dog is not defined 每当我们创建或定义变量,变量名称都会写入环境记录。...此环境记录就像键值存储一样, +-------------+ | Key | Value | --------------- | cat | "cat" | +-------------+ 每当我引用变量...当在记录中找到环境值并提取并返回值,将以该变量名称作为关键字搜索环境记录。 调用尚未定义函数。 现在,当我们创建或定义一个没有赋值变量。...将在env记录搜索该变量,当找到初始未定义,该赋值将被覆盖。...如果我们使用错误参数调用它们任何一个,我们将得到URIErro decodeURI("%") ^ URIError: URI malformed encodeURI,获取URI未编码版本。

    4K10

    C++奇迹之旅:值和引用本质效率与性能比较

    这里使用了引用挺好,不用担心指针引用,地址相关操作,但是,前面我们知道,引用一旦指向一个实体,就无法改变指向,例如,有关链表操作,当我们要删除一个节点,是不是要改变前面节点指针,让他指向后面节点...一个示例: int& Add(int a, int b) { int c = a + b; return c; } 这里函数返回了局部变量c引用,但c函数返回后就已经被销毁了...main函数又调用了一次Add函数,这时第一次调用返回引用ret已经指向了一个不存在对象,所以输出结果也是未定义。...函数返回引用时必须确保返回对象调用者作用域内仍然存在,否则就会产生未定义行为。这是C++函数返回引用需要特别注意地方。...之所以会出现这种情况,是因为Visual Studio编译器处理这种未定义行为时可能会做一些特殊优化或处理,导致某些环境下能够得到一个看似合理结果。

    16110

    go常见错误总结

    1 误用短声明:=导致变量覆盖 例如,下列代码remember变量if语句之外永远都是false,因为if语句中误用了短声明:=。重新定义了一个remember,自动覆盖外面的remember。...go语言中字符串也是不可变,比如当连接2个字符串:a+=b,尤其一个循环中进行类似操作,因为源字符串不可变,导致大量内存拷贝,造成内存开销过大。...所以当我们需要将切片作为一个参数传递给函数,实际就是传递了一个指针变量,并且函数内部可以改变该变量,而不是传递一个值拷贝,所以当切片作为参数传递是,不需要解引用切片,即: 正确做法: func findBiggest...但是如果传递一个指针类型,go编译器很多情况下认为需要创建一个对象,并将对象存入堆,导致额外内存分配。所以,如果想要方法改变接收者数据,就在接收者指针类型上定义该方法。...当使用break、return或者panic跳出一个循环,很有可能导致内存溢出,因为此时协程正在处理某事务而被阻塞。

    66050

    50道JavaScript详解面试题,你需要了解一下

    答案是输出为10,因为将对象传递给函数对象相似,仅传递其值,而不传递对内存位置实际引用。这就是为什么更改仅影响函数范围内参数原因。 3、控制台输出是什么?...Line2,我们使用===运算符来检查两个字符串基元而不是字符串对象,因此我们得到True。 5、控制台输出是什么,为什么? 与之前问题类似,我们比较了两个唯一对象。...答案是C当我们需要等待执行直到所有的都被解决,Promise.all()非常有用。 13、控制台输出是什么,为什么? 在这种情况下,我们有&运算符,它与&&运算符完全不同。...17、JavaScript中使用事件委托 例如当我们必须侦听页面加载期间可能不存在事件,可以使用事件委托,并在父元素上提供事件处理程序并查看event.target。...是的,例如if语句中,需要在评估返回一个布尔值,例如if(a!== b)。 50、JavaScript哪个ES6函数返回一个新数组? map()和filter()。

    3.5K40

    你应该知道7 个 JavaScript 原生错误类型

    例如 1const l=console.logconst cat = "cat" 2cat 3dog 有一个变量 cat 被初始化为 “cat”。接下来引用了 cat 变量和 dog 变量。...cat 将返回 “cat”,而 dog 将引发引用错误,因为环境记录找不到名称 dog。...当在记录中找到环境值并提取并返回值,将以该变量名称作为关键字环境记录进行搜索。调用尚未定义函数。 现在,当我们创建或定义一个没有赋值变量。...将在环境记录搜索该变量,当发现它未定义,该赋值将被覆盖。...当我们输入 JS 引擎不能理解代码,就会发生这个错误。 JS 引擎解析期间捕获了这个错误。 JS 引擎,我们代码经历了不同阶段,然后才能在终端上看到结果。

    2.7K20

    「转自 InfoQ」Rust:一个不再有 CC++ ,实现安全实时软件未来

    C++ 所有权 C++11 发布之后得到了极大提升,但是它也为向后兼容性问题付出了不小代价。对于作者来说,C++ 所有权非常多余,以前简单值分类被吊打。...C++ 类型系统不会对对象模型生命周期进行建模,因此在运行时是无法检查释放后重引用问题。C++ 智能指针只是加在旧系统上一个库,而这个库以 Rust 不被允许方式滥用和误用。...后续使用这个空指针时会导致未定义行为,作者运行之后得到一个空指针错误,大多数托管系统空指针解引用都会报这种错误,因为零内存页面通常会被保留。...之后 map 函数就会需求一个可以重复调用并且处于可变状态可调用函数,这就是为什么编译器失败原因。...它地位与 Python Pipenv 和 Poetry 类似。官方安装包自带 Cargo,它好用到让人遗憾为什么 C/C++ 没有类似的工具。 ? 我们难道都要转向 Rust 吗?

    1.2K20

    译文:开发人员面临 10个最常见JavaScript 问题

    传统,与旧浏览器兼容解决方案是简单地将你对this引用保存在变量,然后可以通过闭包继承,例如: 或者,较新浏览器,可以使用bind()方法传入正确引用: JavaScript 问题#2...为什么大多数其他语言中,上面的代码导致错误,因为变量i“生命”(即范围)将被限制for块。...每秒钟,当我们调用replaceThing,它都会保留对theThingpriorThing对象引用。...所以现在我们得到了: JavaScript 问题#8:创建对实例方法错误引用 让我们定义一个简单对象,并创建它一个实例,如下所示: 现在,为了方便起见,让我们创建一个对whoAmI方法引用,...如果没有严格模式,对空或未定义this值引用自动强制到全局。这可能导致许多令人沮丧错误。严格模式下,引用this值为null或未定义引发错误。 ·禁止重复属性名称或参数值。

    1.2K20

    C++常见面试知识点

    2,当对一个对象调用成员函数编译程序先将对象地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员。都隐式使用this指针。...3,this 并不是一个常规变量,而是个右值,所以不能取得 this 地址(不能 &this) 4,以下场景,经常需要显式引用 this 指针: 为实现对象链式引用; 为避免对同一对象进行赋值操作...内联函数相比宏函数来说,代码展开,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。声明同时定义成员函数,自动转化为内联函数,因此内联函数可以访问类成员变量,宏定义则不能。...C++ struct 和 class 总的来说,struct 更适合看成是一个数据结构实现体,class 更适合看成是一个对象实现体。 区别 最本质一个区别就是默认访问控制。...union 联合 联合(union)是一种节省空间特殊类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。

    76221
    领券