OpenGL1.0 线段

OpenGL1.0线段

DionysosLai2014-06-16

本篇作为我学习Opengl第一篇文档。希望自己能在图形学路上走得远一点,达到能够渲染游戏画质目的,现阶段是Box2D对物理世界模拟很好,但自己无法做到材质渲染很好,致使许多效果差强人意。

谈到,画线,相信很多游戏引擎都很好的完美支持了,只需要给出起点和终点,就能够很好的帮你实现画线问题。我们今天来分析底层是如何实现的。(ps:知识是网上视频学到,这里只是起到一个学习记录作用,顺便分享出来,没有盗取他人成果意思)。这里先做两点假设:1. 起始点x0 < x1; 2. 线段斜率0~1之间。

1.      直线方程方法

基本思想:利用直线方程几何方程y=mx+b,确定路径上的像素点位置。

方法:逐点增加x的值,求出对应y的值,在进行取整运算;

主要运算:乘法+加法+取整---->这些是浮点运算

2.      DDA(Digital DifferentialAnalyzer,数字差分分析法)方法

基本思想:

方法:就是每次都要获取前面的y值

主要运算:加法+取整---->取整是浮点运算

代码如下:

void lineDDA(int x0, int y0, int x1, int y1)
{
	/* x0 <= x1, 0 < m < 1*/
	int x;
	float m, dx, dy, y;
	dx = x1 - x0;
	dy = y1 - y0;
	m = dy / dx;
	y = y0;

	for(x = 0; x <= x1, ++x)
	{
		int iy = (int)(y + 0.5);
		SetPixel(x, iy);		///< 画点
		y = y + m;
	}
}

3.      中点运算方法

目标:消除DDA中的浮点运算。浮点取整运算,不利于硬件实现。

直线的一般方程:F(x,y) = ax + by + c = 0; 其中 a=y0-y1=-dy;b=x1-x0=dx; c=x0y1-x1y0

方法:根据所取点间的中点(xi+1,yi+0.5)在直线的位置

根据中点坐标(xi+1,yi+0.5),构造方程d=F(M)=F(xi+1,yi+0.5)的值,根据d的值,判断M在线段位置:d>=0,中点M在线段上方,取E, d<0, 中点在线段下方,取NE, 如图所示:

如何判断下一个像素呢

如果当前像素点(x+1, y+0.5)的d值,参考上面计算:

1).d>=0, 则取像素点E,那么下一个像素点的d值为:

d=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c=d+a;----->明显可以看到d的增量为a;

2).d<0, 则取像素点NE,那么下一个像素点的d值为:

d=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c=d+a+b,------>明显d的增量为a+b;

既然d的增量公式知道了,下面就是要知道d的初始值。根据构造方程d0=F(x0+1,y0+0.5)=F(x0,y0)+a+0.5b=a+0.5b; 在这里d0的运算结果有存在个0.5,即除法运算,也就是浮点运算,由于我们并不需要d的值,关系的是d与0的大小关系,因此,两边同时乘以2,消除浮点运算。

OK,至此我们可以得到下面的递推关系:

那么,最终结果就是如下所示:

主要运算:加法-->没有浮点运算

代码如下:

void lineMidPoint(int x0, int y0, int x1, int y1)
{
	/* x0 <= x1, 0 < m < 1*/
	int a, b, d1, d2, d, x, y;
	a = y0 - y1;
	b = x1 - x0;
	d = a + a + b;
	d1 = a + a;
	d2 = (a+b) + (a+b);
	x = x0;
	y = y0;
	SetPixel(x,y);				///< 画点
	while(x < x1)
	{
		if(d<0)
		{
			++y;
			d += d2;
		}
		else
		d += d1;
		x++;
		SetPixel(x,y);				///< 画点
	}
}

Ok,这就是我今天所学的。快一点了,该睡觉。明天生活更美好。

OpenGL1.0 线段

时间: 2024-10-14 01:46:20

OpenGL1.0 线段的相关文章

Curious Robin Hood(树状数组+线段树)

1112 - Curious Robin Hood    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 MB Robin Hood likes to loot rich people since he helps the poor people with this money. Instead of keeping all the money together he does another tri

HDU 3911 Black And White(线段树区间合并)

Problem Description There are a bunch of stones on the beach; Stone color is white or black. Little Sheep has a magic brush, she can change the color of a continuous stone, black to white, white to black. Little Sheep like black very much, so she wan

POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]

Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of

HDU 5700 优先队列(或者multiset) 或 线段树

题目大意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大.数列的数字均>=0 优先队列思路: 按照左端点sort,然后枚举左端点,假设他被覆盖过k次,然后用优先队列来维护最右端即可. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace std; #pragma comment(linker,"/STACK:102400000,102400000&qu

hihoCode 1078 : 线段树的区间修改

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段

POJ 2155 2维线段树 || 2维BIT

#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <map> #include <set> #include <stack> #define mp make_pair #define pa pair<int,int> #define pb p

poj 3264(RMQ或者线段树)

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 42929   Accepted: 20184 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

士兵杀敌(四)(树状数组+线段树)

士兵杀敌(四) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧. 假设起始时所有人的军功都是0. 输入

【HDU 1754】I Hate It —— 线段树(数组和指针实现)

原题链接 I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 45627    Accepted Submission(s): 17904 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就