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(i+1) = m(x(i+1))+b=mxi+m+b=yi+m;

         方法:就是每次都要获取前面的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, 如图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

          怎样推断下一个像素呢

         如果当前像素点(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。这就是我今天所学的。快一点了,该睡觉。明天生活更美好。

最新文章

  1. JAVA之IO流(字节流)
  2. centos7删除自带openjdk
  3. linux shell 常用指令
  4. iOS阶段学习第30天笔记( UIViewController—Delegate(代理) )
  5. [webgrid] &ndash; Ajax &ndash; (Reloading a Razor WebGrid after Ajax calls using a partial view)
  6. Get open Popups
  7. flex经验记录(转载)
  8. 用sharding技术来扩展你的数据库(一)sharding 介绍
  9. iPhone之Quartz 2D系列--编程指南(1)概览
  10. angularjs kindEditor 中content获得不到值
  11. oracle数据表误删恢复
  12. codechef Sums in a Triangle题解
  13. 详解Java动态代理机制
  14. HDU--1003 Max Sum(最大连续子序列和)
  15. Algorithm --&gt; DFS和BFS
  16. python实例二
  17. MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
  18. CY7C68013 USB接口相机开发记录 - 第二天:驱动修改
  19. python之管道, 事件, 信号量, 进程池
  20. Python3编写网络爬虫10-数据存储方式三-CSV文件存储

热门文章

  1. Tomcat7调试运行环境搭建与源代码分析入门
  2. 使用Navicat连接阿里云服务器上的MySQL数据库=======Linux 开放 /etc/hosts.allow
  3. 如果将一个类设置为abstract,则此类必须被继承使用
  4. Linux系统下修改MySQL密码(忘记密码)
  5. 输入一个long类型的整数,输出一个以金融格式表示的字符串
  6. Fiddler实现手机抓包——小白入门 - 做一个不动声色的大人
  7. zoj3696(泊松分布)
  8. 【BZOJ1855】[Scoi2010]股票交易 DP+单调队列
  9. List&lt;Integer&gt;.remove()的一个小细节
  10. absolute float 比较分析