摘要:
显示列表:想知道如何加速你的OpenGL程序么?这一课将告诉你如何使用OpenGL的显示列表,它通过预编译OpenGL命令来加速你的程序,并可以为你省去很多重复的代码。这次我将教你如何使用显示列表,显示列表将加快程序的速度,而且可以减少代码的长度。当你在制作游戏里的小行星场景时,每一层上至少需要两个... 阅读全文
摘要:
飘动的旗帜:这一课从第六课的代码开始,创建一个飘动的旗帜。我相信在这课结束的时候,你可以掌握纹理映射和混合操作。大家好!对那些想知道我在这里作了些什么的朋友,您可以先按文章的末尾所列出的链接,下载我那毫无意义的演示(Demo)看看先!我是bosco,我将尽我所能教您来实现一个以正弦波方式运动的图象。... 阅读全文
摘要:
加载3D世界,并在其中漫游:在这一课中,你将学会如何加载3D世界,并在3D世界中漫游。这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码。这一课是由Lionel Brits (βtelgeuse)所写的。在本课中我们只对增加的代码做解释。当然只添加课程中所写的代码,程序是不会运行的。如果您有... 阅读全文
摘要:
3D空间中移动图像:你想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画。这一课将教会你所有的一切。前面的课程涵盖了基础的OpenGL,每一课都是在前一课的基础上创建的。这一课是前面几课知识的综合,当你学习这课时,请确保你已经掌握了前面... 阅读全文
摘要:
混合:在这一课里,我们在纹理的基础上加上了混合,它看起具有透明的效果,当然解释它不是那么容易,当希望你喜欢它。简单的透明OpenGL中的绝大多数特效都与某些类型的(色彩)混合有关。混色的定义为,将某个象素的颜色和已绘制在屏幕上与其对应的象素颜色相互结合。至于如何结合这两个颜色则依赖于颜色的alpha... 阅读全文
摘要:
下一段代码绘制贴图立方体。我只对新增的代码进行注解。如果您对没有注解的代码有疑问,回头看看第六课。int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制{ glClear(GL_COLOR_BUFFER_BI... 阅读全文
摘要:
光照和键盘控制:在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观。这一课我会教您如何使用三种不同的纹理滤波方式。教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的光照。这一课包含了很多内容,如果您对前面的课程有疑问的话,先回头复习一下。进入后面的代码之前,很好的理解... 阅读全文
摘要:
纹理映射:在这一课里,我将教会你如何把纹理映射到立方体的六个面。学习 texture map 纹理映射(贴图)有很多好处。比方说您想让一颗导弹飞过屏幕。根据前几课的知识,我们最可行的办法可能是很多个多边形来构建导弹的轮廓并加上有趣的颜色。使用纹理映射,您可以使用真实的导弹图像并让它飞过屏幕。您觉得哪... 阅读全文
摘要:
3D空间:我们使用多边形和四边形创建3D物体,在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体。在上节课的内容上作些扩展,我们现在开始生成真正的3D对象,而不是象前两节课中那样3D世界中的2D对象。我们给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。给正方形... 阅读全文
摘要:
旋转:在这一课里,我将教会你如何旋转三角形和四边形。左图中的三角形沿Y轴旋转,四边形沿着X轴旋转。上一课中我教给您三角形和四边形的着色。这一课我将教您如何将这些彩色对象绕着坐标轴旋转。其实只需在上节课的代码上增加几行就可以了。下面我将整个例程重写一遍。方便您知道增加了什么,修改了什么。我们增加两个变... 阅读全文
摘要:
添加颜色:作为第二课的扩展,我将叫你如何使用颜色。你将理解两种着色模式,在下图中,三角形用的是光滑着色,四边形用的是平面着色上一课中我教给您三角形和四边形的绘制方法。这一课我将教您给三角形和四边形添加2种不同类型的着色方法。使用Flat coloring(单调着色)给四边形涂上固定的一种颜色。使用S... 阅读全文
摘要:
你的第一个多边形:在第一个教程的基础上,我们添加了一个三角形和一个四边形。也许你认为这很简单,但你已经迈出了一大步,要知道任何在OpenGL中绘制的模型都会被分解为这两种简单的图形。读完了这一课,你会学到如何在空间放置模型,并且会知道深度缓存的概念。第一课中,我教您如何创建一个OpenGL窗口。这一... 阅读全文
摘要:
题意:N个点,形成一棵树,边有长度。M个询问,每个询问(a,b),询问a和b的距离思路:模板题,看代码。DFS预处理算出每个结点离根结点的距离。注意:qhead[maxn],而不是qhead[maxm]。输出用%I64d,不要用%lld。C++ RE后 尝试用 G++交。代码:struct node... 阅读全文
摘要:
题意:N个点,构成一棵树。给出这棵树的结构。M条边,(a1,b1)...(am,bm),代表给树的这些点对连上边。这样就形成了有很多环的一个新”树“。现在要求你在原树中断一条边,在M条边中断一条边,使得新”树“被分成两个部分。问有多少种方案。思路:连上某条新边(a,b),则必定形成一个环。环的路径是... 阅读全文
摘要:
/* *算法引入: *树上两点的最近公共祖先; *对于有根树的两个结点u,v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u,v的祖先且x的深度尽可能大; *对于x来说,从u到v的路径一定经过点x; * *算法思想: *Tarjan_LCA离线算法; *Tarjan算法基... 阅读全文
摘要:
题意:给出一棵树的结构。给出两个点X和Y,求它俩的LCA。思路:只需求两个点的LCA,用了两种方法,一种离线tarjan,一种直接搞。看代码。代码:方法一:直接搞。int const maxn = 10005;int T,n,a,b;int fa[maxn];int X,Y;int main(){ ... 阅读全文
摘要:
题意:n堆石头,每堆石头个数:s[1]...s[n]。每人每次可以选择在一堆中取若干个(不能不取),或者把一堆石头分成两堆(两堆要都有石头)。无法操作者负。数据范围:(1 ≤ N ≤ 10^6, 1 ≤ S[i] ≤ 2^31 - 1)思路:S[i]太大了,直接求SG铁定TLE,所以先把SG打出来看... 阅读全文
摘要:
题意:一排石头,个数是K。有n个数,a1...an。每人每次取石子只能取连续的x个。x属于a1...an的一个。没法取者负。思路:简单的SG。但是TLE!后面加了一个优化~这个优化不好想到吧,看了别人的代码才发现的。就是把a1...an中重复的去掉!。。。直接看代码。代码:int sg[1005];... 阅读全文
摘要:
题意:3堆石头,个数分别是m,n,p。两个轮流走,每走一步可以选择任意一堆石子,然后取走f个。f只能是菲波那契中的数(即1,2,3,5,8.....)取光所有石子的人胜。判断先手胜还是后手胜。思路:简单SG。看代码。代码:int sg[1005];int dfs(int x){ if(sg[x... 阅读全文
摘要:
题意:有一张W*H的纸片。每人每次可以横着撕或者竖着撕,先撕出1*1那一方胜。数据范围:W and H (2 <= W, H <= 200)思路:很好抽象出游戏图的模型,用SG解决。直接看代码。代码:int dp[maxn][maxn];int sg(int w,int h){ if(dp[w... 阅读全文
摘要:
题意:给一个由N个点组成的一张有向图,不存在环。点的编号是0~N-1。然后给出M个棋子所在的位置(点的编号)【一个点上可同时有多个棋子】。每人每次可移动M个棋子中的一个棋子一步,移动方向是有向边指向的方向。最后无法移动棋子的人输。思路:一眼就可看出的裸的SG,直接看代码吧。代码:int sg[100... 阅读全文
摘要:
题意:1 ×n 个格子,每人每次选一个格子打上叉(不得重复),如果一个人画完叉后出现了连续的三个叉,则此人胜。给n,判断先手胜还是先手败。思路:假设选择画叉的位置是i,则对方只能在前[1,i-3]中或[i+3,n]中选择画叉。子问题出现。根据SG的定义,即可求出SG(N)。看代码。代码:int sg... 阅读全文
摘要:
题意:K个数,s1...sk。m个状态,对于某一个状态,有L堆石子,每人每次取的石子个数只能是s1...sk的一个,且只能在一堆中取。输出m个状态是先手胜还是先手败,先手胜输出W,否则输出L。输入格式及数据范围:For each test case: The first line contains ... 阅读全文
摘要:
题意:N个棋子,位置分别是p[1]...p[N]。Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边【位置1】且不能不移)Georgia先手,问谁赢。思路:将棋子按位置从右到左两个两个作为一对。若棋子总个数是奇数,将第一个棋子和【位置0】作为... 阅读全文
摘要:
1.游戏有两个人参与,二者轮流做出决策。且这两个人的决策都对自己有利。2.当有一人无法做出决策时游戏结束,无法做出决策的人输。无论二者如何做出决策,游戏可以在有限步内结束。3.游戏中的同一个状态不可能多次抵达。且游戏不会有平局出现。4.任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关... 阅读全文
摘要:
题意:m堆石头,每堆石头个数:a[1]....a[m]。每次只能在一堆里取,至少取一个。最后没石子取者负。先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法。如果从有a个石子的堆中取若干个后剩下b个后会胜就输出a b思路:裸的NIM。单看一堆石子,没有石头sg[0]=0,一个石... 阅读全文
摘要:
题意:n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边。无法移动硬币的人负。给出n和m,问,先手胜还是后手胜。数据范围:n, m (0=1 && b1>=1 && go(a1,b1)==1) return f[n][m] = 0; if(a2>=1... 阅读全文
摘要:
题意:N=4时规则:双方每次可以连接自己颜色的两个点(相邻,长度为1),线和线不能交叉重叠。蓝方要连接左右,红方要连接上下。蓝方先。问谁先连接?思路:经过观察。。。。蓝方胜。。。。。。。(无语)【我不知道如何证明!】代码:就不贴了。。。 阅读全文
摘要:
题意:n张牌,双方轮流抓取。每人每次抓取的牌数必须是2的幂次(1,2,4,8...)。最后抓完的人胜。思路 :考虑剩3张牌,后手胜。考虑3的倍数。假设先抓者当轮抓2x 张,2x %3等于1或2。故先手不管怎么取,后手取1或2则可凑成3的倍数。故若总牌数是3的倍数,先手败。否则先手胜。代码:int n... 阅读全文