??xml version="1.0" encoding="utf-8" standalone="yes"?>波多野结衣久久精品,午夜肉伦伦影院久久精品免费看国产一区二区三区 ,久久精品麻豆日日躁夜夜躁http://www.shnenglu.com/percyph/zh-cnTue, 06 May 2025 23:25:43 GMTTue, 06 May 2025 23:25:43 GMT60Z四叉树LOD?D地Ş实现(OpenGL)http://www.shnenglu.com/percyph/archive/2010/10/07/128962.html虫?/dc:creator>虫?/author>Thu, 07 Oct 2010 15:26:00 GMThttp://www.shnenglu.com/percyph/archive/2010/10/07/128962.htmlhttp://www.shnenglu.com/percyph/comments/128962.htmlhttp://www.shnenglu.com/percyph/archive/2010/10/07/128962.html#Feedback4http://www.shnenglu.com/percyph/comments/commentRss/128962.htmlhttp://www.shnenglu.com/percyph/services/trackbacks/128962.html

]]>
Q{Q质数算法大全,及CE序实现优化详解 (? {选法http://www.shnenglu.com/percyph/archive/2009/05/14/82963.html虫?/dc:creator>虫?/author>Thu, 14 May 2009 07:48:00 GMThttp://www.shnenglu.com/percyph/archive/2009/05/14/82963.htmlhttp://www.shnenglu.com/percyph/comments/82963.htmlhttp://www.shnenglu.com/percyph/archive/2009/05/14/82963.html#Feedback0http://www.shnenglu.com/percyph/comments/commentRss/82963.htmlhttp://www.shnenglu.com/percyph/services/trackbacks/82963.html质数的定?/strong>

一个数Q如果只?和它本n两个因数Q这L数叫做质敎ͼ又称素数?/p>

在上??a target=_blank>素数法大全Q及CE序实现优化详解 (一) 试除?/a>》中我们已经探讨了求解素数的一cȝ法,q且试除法从最初的低效版本优化的高效的V2。那么,q有没有其它更佳法呢?q就是下面三藏要和大家探讨的内容

合数qo{选法

法描述Q我们知道,素数N不能?~(N-1)间的M数整除;反过来看Q只要能?~(N-1)间的M数整除的NQ都不是素数。所以我们可以采用一个简单的排除法:是对N以内的所有数Q只要逐个去除gؓ2~(N-1)的倍数的数Q剩下的是素数?/p>

C语言实现

// 合数qo{选法 Ver1 
// 参数Qn 求解n以内(包括n)的素?br>// q回|n以内素数个数
int CompositeNumFilterV1(int n)
{
 int i, j;
 // 素数数量l计
 int count = 0;
 // 分配素数标记I间Q结合后文思考ؓ?1
 char* flag = (char*)malloc( n+1 );
 
 // 初始化素数标?
 for (i=2; i<=n; i++)
 {
  // Z?(p+i)要写成flag[i]呢?可读性更佛_
  flag[i] = 1;
 }
 
 // 写程序要注意排版和留I,方便阅读Q也可减出错几?br> // ?~(N-1)为因子过滤合?
 for (i=2; i < n; i++)
 {
  for (j=2; i*j <= n; j++)
  {
   // i*j是由i,j两整数相乘而得Q显然不是素?br>   flag[i*j] = 0;
  }
 }
 
 // l计素数个数
 for (i=2; i<=n; i++)
 {
  // 其实if(flag)其同样作用了,但这么写是有留言?
  // 请参阅《C语言E序设计常见错误剖析及解决之道》一?
  if (1 == flag[i]) count++;
 }
  
 // 因输Ӟ且和法核心相关不大Q故?br> 
 // 释放内存Q别忘了传说中的内存泄漏
 free(flag);
 
 return count;
}

在上文给出的main函数中以不同参数调用CompositeNumFilterV1函数Q得到执行结果如下:

[100000]以内素数个数Q?592, 计算用时Q?5毫秒
[1000000]以内素数个数Q?8498, 计算用时Q?25毫秒
[5000000]以内素数个数Q?48513, 计算用时Q?578毫秒
[10000000]以内素数个数Q?64579, 计算用时Q?281毫秒

注:因程序是非独占性运行的Q所以时间不是完全精的Q但基本能反映实?/p>

昄Q比上文中的试除法要快,而且谁都可以看到上例是一个未l优化的_陋版本Q好多地Ҏ三藏故意采用比较低效做法Qؓ了与后文的优化版比较Q凸显优化之重要Q也Z初学者记住别采用cM低效做法Q下面我们开始优化之?/p>

优化分析

上面CompositeNumFilterV1函数存在的问题有Q?/p>

  1. 在外层@环,需要一直执行到n-1吗?不要Q因为n/2~n-1间的数显然不能整出n
  2. 在内层@环中重复使用i*j昄是低效的Q考虑到计机中加减运速度比乘除快Q可以考虑变乘法ؓ加法
  3. 在@环修改flagq程中,其实有很多数会被重复计算若干ơ,比如6=2*3=3*2Q会被重复置0Q类似操作很多,所以我们得设法避免或减flag重复|?

据上q分析,我们可将E序优化如下Q?/p>

// 合数qo{选法 Ver2 
// 参数Qn 求解n以内(包括n)的素?br>// q回|n以内素数个数
int CompositeNumFilterV2(int n)
{
 int i, j;
 // 素数数量l计
 int count = 0;
 // 分配素数标记I间Q明?1原因了吧Q因为浪费了一个flag[0]
 char* flag = (char*)malloc( n+1 );
 
 // 初始化素数标讎ͼ要高效点?br> flag[2] = 1;
 // 注意是i<n不是上例中的i<=n了,理由自?
 for (i=3; i<n; i++)
 {
  flag[i++] = 1;
  // 偶数自然不是素数Q直接置0好了
  flag[i] = 0;
 }
 // n为奇?
 if (n%2 != 0)
 {
  flag[n] = 1;
 }
 
 // ?开始filterQ因?的倍数早在初始化时代就q掉?br> // 到n/2止的理由q要说吗
 for (i=3; i <= n/2; i++)
 {
  // i是合敎ͼh着吧,因ؓ您的工作早有您的质因子代劳了
  if (0 == flag[i]) continue;
  
  // 从i?倍开始过滤,变乘法ؓ加法 
  for (j=i+i; j <= n; j+=i)
  {
   flag[j] = 0;
  }
 }
 
 // l计素数个数
 for (i=2; i<=n; i++)
 {
  if (flag[i]) count++;
 }
  
 // 因输Ӟ且和法核心相关不大Q故?br> 
 // 释放内存Q别忘了传说中的内存泄漏
 free(flag);
 
 return count;
}

再来调用CompositeNumFilterV2得到执行l果Q?/p>

[100000]以内素数个数Q?592, 计算用时Qn太小Q时间精度不?br>[1000000]以内素数个数Q?8498, 计算用时Q?1毫秒
[5000000]以内素数个数Q?48513, 计算用时Q?53毫秒
[10000000]以内素数个数Q?64579, 计算用时Q?062毫秒
[100000000]以内素数个数Q?761455, 计算用时Q?2973毫秒

哇哇Q比昨天的试除发快了好多倍,可见法的威力,值得好好学习Q别说学法没用咯?/p>

上例着那个计算一亿以内的素数只要U?3U,应该不错了Q今天是否可以休息了呢?NoQ我们要q求极限Q?/p>

int CompositeNumFilterV3(int n)
{
 int i, j;
 // 素数数量l计
 int count = 0;
 // 分配素数标记I间Q明?1原因了吧Q因为浪费了一个flag[0]
 char* flag = (char*)malloc( n+1 );
 // q嘛用的Q请仔细研究下文
 int mpLen = 2*3*5*7*11*13;
 char magicPattern[mpLen];
 // 奇怪的代码QwhyQ思考无法代劻I惻I
 for (i=0; i<mpLen; i++)
 {
  magicPattern[i++] = 1;
  magicPattern[i++] = 0;
  magicPattern[i++] = 0;
  magicPattern[i++] = 0;
  magicPattern[i++] = 1;
  magicPattern[i] = 0;
 }
 for (i=4; i<=mpLen; i+=5)
  magicPattern[i] = 0;
 for (i=6; i<=mpLen; i+=7)
  magicPattern[i] = 0;
 for (i=10; i<=mpLen; i+=11)
  magicPattern[i] = 0;
 for (i=12; i<=mpLen; i+=13)
  magicPattern[i] = 0;
 
 // 新的初始化方??,3,5,7,11,13的倍数全干?br> // 而且采用memcpy以mpLen长的magicPattern来批量处?
 int remainder = n%mpLen;
 char* p = flag+1;
 char* pstop = p+n-remainder;
 while (p < pstop)
 {
  memcpy(p, magicPattern, mpLen);
  p += mpLen;
 }
 if (remainder > 0)
 {
  memcpy(p, magicPattern, remainder);
 }
 flag[2] = 1;
 flag[3] = 1;
 flag[5] = 1;
 flag[7] = 1;
 flag[11] = 1;
 flag[13] = 1;
 
 // ?7开始filterQ因?,3,5,7,11,13的倍数早被kill?
 // 到n/13止的Q哈哈,了好多?br> int stop = n/13;
 for (i=17; i <= stop; i++)
 {
  // i是合敎ͼh着吧,因ؓ您的工作早有您的质因子代劳了
  if (0 == flag[i]) continue;
  
  // 从i?7倍开始过?br>  int step = i*2;
  for (j=i*17; j <= n; j+=step)
  {
   flag[j] = 0;
  }
 }
 
 // l计素数个数
 for (i=2; i<=n; i++)
 {
  if (flag[i]) count++;
 }
  
 // 因输Ӟ且和法核心相关不大Q故?br> 
 // 释放内存Q别忘了传说中的内存泄漏
 free(flag);
 
 return count;
}

再看CompositeNumFilterV3执行l果Q?/p>

[1000000]以内素数个数Q?8498, 计算用时Q?5毫秒
[5000000]以内素数个数Q?48513, 计算用时Q?03毫秒
[10000000]以内素数个数Q?64579, 计算用时Q?15毫秒
[100000000]以内素数个数Q?761455, 计算用时Q?421毫秒

再次优化后速度提升了又一倍左叻I三藏不禁有点满了,睡觉也!



]]>
(?素数法大全Q及CE序实现优化详解 (一) 试除?/title><link>http://www.shnenglu.com/percyph/archive/2009/05/14/82961.html</link><dc:creator>虫?/dc:creator><author>虫?/author><pubDate>Thu, 14 May 2009 07:46:00 GMT</pubDate><guid>http://www.shnenglu.com/percyph/archive/2009/05/14/82961.html</guid><wfw:comment>http://www.shnenglu.com/percyph/comments/82961.html</wfw:comment><comments>http://www.shnenglu.com/percyph/archive/2009/05/14/82961.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/percyph/comments/commentRss/82961.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/percyph/services/trackbacks/82961.html</trackback:ping><description><![CDATA[<p>转自Q?a ><a >http://www.doforfun.net/article/20090504/543.htm</a><br></a>l常有初学者询问求解N内所有素敎ͼ质数Q的问题Q对此,|上的解{也很多Q但很多要么不够专业Q要么只有程序没有算法解析,所以三藏大厦对此问题做个小l,探讨一下求解素数的常见法Q同时给出相应的C语言E序及其解析。ؓ了方便初学者理解,本文从易到NqC同算法,高手可以直接看后面的高效法</p> <p><strong>质数的定?/strong></p> <p>一个数Q如果只?和它本n两个因数Q这L数叫做质敎ͼ又称素数?nbsp;<br></p> <p><strong>试除判断?/strong></p> <p><strong>法描述</strong>Q从上述定义可知Q素C能被1和它本n之外的数整除Q所以,判断一个数x是否素数只要看它是否能被2~sqrt(x)间的数整除即可;而求N内所有素数则是@环重复上q过E?/p> <p><strong>C语言实现</strong>Q?/p> <pre>#include <time.h><br>#include <malloc.h> <br>#define N 100000<br>// 单试除判断法 Ver1 <br>int SimpleDivisionV1(int n)<br>{<br> int i,j;<br> // 素数数量l计 <br> int count = 0;<br> // 分配存放l果的空?<br> int* primes = (int*)malloc( sizeof(int)*n ); <br> <br> // 2是素数谁都知道,不算?<br> primes[count++] = 2;<br> // 循环计算3~n间的?<br> for (i=3; i<=n; i++)<br> {<br>  // Z么是sqrt(i)Q思考一?<br>  for (j=2; j<=sqrt(i); j++)<br>  {<br>   // i被j整除Q显然不是素C <br>   if (i%j == 0) break;<br>  }<br>  // i不能?~sqrt(i)间的数整?素数?<br>  if (j > sqrt(i))<br>  {<br>   primes[count++] = i;<br>  }<br> }<br> <br> // 因输Ӟ且和法核心相关不大Q故?br>  <br> // 释放内存Q别忘了传说中的内存泄漏 <br> free(primes);<br> <br> return count;<br>} <br><br>void main()<br>{<br> int count;<br> clock_t start, end;<br> // time函数不够_Q用clock凑合一下吧 <br> start = clock(); <br> count = SimpleDivisionV1(N);<br> <br> end = clock();<br> printf("[%d]以内素数个数Q?d, 计算用时Q?d毫秒\n", N, count, end-start);<br> getch(); <br>}</pre> <p>计算l果Q?br>[100000]以内素数个数Q?592, 计算用时Q?68毫秒<br>[1000000]以内素数个数Q?8498, 计算用时Q?0859毫秒<br>[5000000]以内素数个数Q?48513, 计算用时Q?03560毫秒</p> <p>噢噢Q算十万还行,百万?0U多了,而且旉增长很快Q这不行Q得优化一下!</p> <p><strong>优化分析</strong>Q?/p> <p>仔细研究一下SimpleDivisionV1我们可以发现以下几个问题Q?/p> <ol> <li>在@环条件中重复调用sqrt(i)昄是比较浪Ҏ间的 <li>判断素数Q真的需要拿2~sqrt(i)间的所有整数去除吗Q我们知道,合数都可以分解成若干质数Q所以只?~sqrt(i)间的质数不能整除i卛_</li> </ol> <p>Ҏ上面两点Q我们可SimpleDivisionV1升为SimpleDivisionV2Q如?/p> <pre> // 单试除判断法 Ver2 <br>int SimpleDivisionV2(int n)<br>{<br> int i, j, k, stop;<br> // 素数数量l计 <br> int count = 0;<br> // 分配存放l果的空?<br> int* primes = (int*)malloc( sizeof(int)*n ); <br> <br> // 2是素数谁都知道,不算?<br> primes[count++] = 2;<br> stop = count;<br> // 循环计算3~n间的?<br> for (i=3; i<=n; i++)<br> {<br>  k = sqrt(i);<br>  // 在@环条件中重复调用sqrt是低效做法,故引入k <br>  while (primes[stop] <= k && stop < count)<br>   stop++;<br>  // stopq什么用Q思考一?br>  for (j=0; j<stop; j++)<br>  {<br>   if (i%primes[j] == 0) break;<br>  }<br>  // i不能?~sqrt(i)间的素数整除Q自然也不能被其他数整除,素数?<br>  if (j == stop)<br>  {<br>   primes[count++] = i;<br>  }<br> }<br> <br> // 因输Ӟ且和法核心相关不大Q故?br>  <br> // 释放内存Q别忘了传说中的内存泄漏 <br> free(primes);<br> <br> return count;<br>} </pre> <p>然后main中调用的函数替换为SimpleDivisionV2Q在看一下执行结果:</p> <p>[100000]以内素数个数Q?592, 计算用时Q?6毫秒<br>[1000000]以内素数个数Q?8498, 计算用时Q?46毫秒<br>[5000000]以内素数个数Q?48513, 计算用时Q?515毫秒<br>[10000000]以内素数个数Q?64579, 计算用时Q?000毫秒</p> <p>很开心的看到Q经q优化,速度提高了几十倍,其是时间增长曲U的坡度变小了,ND大,V2函数比V1的效率就高</p> <p>对于试除判断q种质数法来说Q三藏认为SimpleDivisionV2基本已经接近极限Q不大可能有量上的H破了,有兴的朋友可以自己q一步优化。初学者除了参看上qC子外Q可以尝试做各种修改及细节优化,也可以将除法变乘法,多加l习是学习编E的好方法?/p> <p>虽然Q上例中V2已经比V1快了很多了,但随着N的增大,耗时q是不少Q那么我们还有更好的Ҏ吗?</p> <img src ="http://www.shnenglu.com/percyph/aggbug/82961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/percyph/" target="_blank">虫?/a> 2009-05-14 15:46 <a href="http://www.shnenglu.com/percyph/archive/2009/05/14/82961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Q{QgluPerspective和gluLookAt的关p?/title><link>http://www.shnenglu.com/percyph/archive/2009/04/01/78537.html</link><dc:creator>虫?/dc:creator><author>虫?/author><pubDate>Wed, 01 Apr 2009 03:03:00 GMT</pubDate><guid>http://www.shnenglu.com/percyph/archive/2009/04/01/78537.html</guid><wfw:comment>http://www.shnenglu.com/percyph/comments/78537.html</wfw:comment><comments>http://www.shnenglu.com/percyph/archive/2009/04/01/78537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/percyph/comments/commentRss/78537.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/percyph/services/trackbacks/78537.html</trackback:ping><description><![CDATA[转自Q?<a >http://hi.baidu.com/sunguangran/blog/item/ded90ced94779dd2b31cb11c.html</a><br><br>l于搞明白gluPerspective和gluLookAt的关pM<br><br>函数原型<br>gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);<br><br>gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)<br><br>一个一个来,首先得设|gluPerspective,来看看它的参数都表示什么意?br>fovy,q个最隄?我的理解?眼睛睁开的角??视角的大?如果讄?,相当你闭上眼睛了,所以什么也看不?如果?80,那么可以认ؓ你的视界很广?<br>aspect,q个好理?是实际H口的纵横比,即x/y<br>zNear,q个?表示你近?的裁?<br>zFar表示q处的裁?<br><br>如果q没有理解就l箋?<br>我们知道,q处的东西看h要小一?q处的东西看h会大一?q就是透视原理<br>如下图所C?br> <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/kkun/pic/item/6d203a299bf5aef799250a2d.jpg" border=0 small="0"><br> <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/kkun/pic/item/493835fae74b34809e5146aa.jpg" border=0 small="0"></div> <br><br>假设那两条线表示公\,理论上讲,它们的两条边是^行的,<br>但现实情况中,它们在远?可以无限q?总要怺于一?<br>实际U段AB的长?CD的长?只是在此例中使用了透视?故会有如上的效果,是不是很接近现实的情?<br><br>l合我们刚才q两个函?br>zNear,眼睛距离q处的距?假设?0c,请不要设|ؓ负?OpenGl傻?不知道怎么了,<br>zFar表示q处的裁?假设?000c,<br>是q两个参数的意义?<br><br>再解释下那个"眼睛睁开的角?是什么意?<br>首先假设我们现在距离物体?0个单位距远的位|?<br>在眼睛睁开角度讄?5?L大屏q?<br> <div forimg="1"><a target=_blank> <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/kkun/pic/item/746f352ab97c5e315343c10d.jpg" border=0 small="0"></div> </a><br><br>我们可以看到,在远处一个球,,很好玩哈,<br>现在我们眼睛再张开点看,?眼睛睁开的角?讄?78<br>(180度表C^?那时候我们将什么也看不?眼睛睁太大了,眼大无神)<br> <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/kkun/pic/item/102f01e9a22b6f36b80e2d17.jpg" border=0 small="0"></div> <br><br>我们只看C个点,,,,,,,,,,,,,,,,,,,,,,,,,,,<br>因ؓ我们看的范围太大?q个球本w大没有改?但是它在我们?视界"内太了,<br><br><br>反之,我们眼睛闭些,改ؓ1度看看会出现什么情况呢?<br> <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/kkun/pic/item/ab45dab464dc607a8bd4b21e.jpg" border=0 small="0"><br><br>在我们距该物体3000距离q?"眼睛睁开的角???我们g走进了这个球?q个是不是类g相机的焦?<br><br>当我们将"透视?讄??我们相当于闭上双?q个世界清静?<br><br>我们什么也看不?,,,,,,,,</div> </div> <br><br><br>现在来看gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);<br><br>它共接受三对坐标,<br>分别为eye,center,up<br>故名思义,eye表示我们眼睛?世界坐标p?中的位置,<br>center表示眼睛"?的那个点的坐?<br>最后那个up坐标表示观察者本w的方向,如果观察点比喻成我们的眼睛,那么q个up则表C我们是正立q是倒立异或某一个角度在?所看的影像大不相同,故此旉要指明我们现在正?那么X,Z轴ؓ0,Y轴ؓ正即?通常其讄?,只要表示一个向上的向量(方向)卛_<br>球是d世界坐标pȝ原点上的,即O(0,0,0)坐标?我们的眼睛位于观察点A(0,0,100),Z轴向屏幕里看ȝ方向,屏幕外我们的位置,Z轴ؓ正?其实很好理解,x们距d点的距离,讄100,观察到如下图所C的影像<br><a target=_blank> <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/kkun/pic/item/746f352ab97c5e315343c10d.jpg" border=0 small="0"></div> </a><br>如果我们向前或向后移?则相应的囑փ会变大或变小,q里其实是q用了透视原理,q处的物体大,q处的物体小,实际物体的大是不变?<br><br>同理改变center坐标(眼睛看去的那个点,可简单理解ؓ视线的终?也会影响球的大小,同样可以认ؓ是改变了物体与观察点的距L?<br><br>最后那个up坐标表示观察者本w的方向,如果观察点比喻成我们的眼睛,那么q个up则表C我们是正立q是倒立异或某一个角度在?所看的影像大不相同,故此旉要指明我们现在正?那么X,Z轴ؓ0,Y轴ؓ正即?通常其讄?,只要表示一个向上的向量(方向)卛_,我们指定0.1f?.00001f异或1000.0f,效果是一L,只要能表C方向即?<br><br><br><br><br>以上理解了之?来做一个测?br>透视图不?最q处仍ؓ3000,q处?.1<br><br><em>gluPerspective                            // 讄透视?br>        (45,                            // 透视角设|ؓ 45 ?在Y方向上以角度为单位的视野<br>        (GLfloat)x/(GLfloat)y,    // H口的宽与高?br>        0.1f,                                // 视野透视深度:q点1.0f<br>        3000.0f                            // 视野透视深度:始点0.1fq点1000.0f<br>        );</em><br><br>我们的观察点置于A(0,10,0),<br>观察位|?视线l点)坐标|于(0,0,0)<br>然后在原点开始绘?M个V字Ş,q将Z轴的g-1000递增加到+1000,增量?0,<br>代码如下<br><em><br>    glColor3f(0.5f, 0.7f, 1.0f);<br><br>    glBegin(GL_LINES);<br>        for(int i=-1000;i<=1000;i+=10)<br>        {<br>            glVertex3f(0,0,i);<br>            glVertex3f(10,10,i);<br><br>            glVertex3f(0,0,i);<br>            glVertex3f(-10,10,i);<br>        }<br>    glEnd();<br></em><br>F5q行效果如下?br> <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/kkun/pic/item/f1be800ad3acf337b1351dd9.jpg" border=0 small="0"><br><br>上图证实了我们的推测</div> <br><br><br><br><br><br><br><br><br><br><br>//---------------------------------------------<br>    //生成|络<br>    glColor3f(0.5f, 0.7f, 1.0f);<br>    int x=(int)(40*2);<br>    <br>    glBegin(GL_LINES);<br>            for(int i=-x;i<=x;i+=4)<br>            {<br>                glVertex3i(-x,0,i);<br>                glVertex3i(x,0,i);<br><br>                glVertex3i(i,0,x);<br>                glVertex3i(i,0,-x);<br>            }<br>    glEnd();<br><br>//生成球体<br>    GLUquadricObj * pObj;<br>    pObj = gluNewQuadric();<br>    gluQuadricDrawStyle(pObj,GLU_LINE);<br>    gluQuadricNormals(pObj,GLU_SMOOTH);<br><br>=============================================================<br>以下是个ȝQ?br>1、模视矩阵(ModelView MatrixQ的作用是将模型从局部坐标系变换C界坐标系Qƈ最l变换到视点坐标pM。它由模型变换矩阵和视点变换矩阵l成?br>2、gluLookAt影响的是视点矩阵Q它昑ּ的标明了视点坐标pM世界坐标pȝ关系Q即视点被安|在世界坐标pȝ哪个位置Q视U的方向朝向何处?br>3、gluPerspective用于规定视景体范_与模视矩阉|养I它媄响的是投q阵和规一化矩c投q늚作用是模型产生q大q小的效果,规一化矩阉|模型的zD一化到0~1之间?br>4、在~程的时候,需要glMatrixMode来指定矩阵堆栈的cdQ然后对该矩阵进行修攏V?br>   glMatrixMode(GL_MODELVIEW);<br>   glLoadIdentity();<br>   的作用是初始化模视矩阵,坐标原炚w新设|在世界坐标pȝ原点。之后的glTranslate、glScale、glRotate都会改变模视矩阵中的模型变换矩阵。而glLookAt则设|视点变换矩c它们共同作用,使得模型能在世界坐标pM正确安放Qƈ能从合适的角度去观察?br><br></div> <img src ="http://www.shnenglu.com/percyph/aggbug/78537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/percyph/" target="_blank">虫?/a> 2009-04-01 11:03 <a href="http://www.shnenglu.com/percyph/archive/2009/04/01/78537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于初始化列表的初始化顺?/title><link>http://www.shnenglu.com/percyph/archive/2009/03/31/78444.html</link><dc:creator>虫?/dc:creator><author>虫?/author><pubDate>Tue, 31 Mar 2009 02:33:00 GMT</pubDate><guid>http://www.shnenglu.com/percyph/archive/2009/03/31/78444.html</guid><wfw:comment>http://www.shnenglu.com/percyph/comments/78444.html</wfw:comment><comments>http://www.shnenglu.com/percyph/archive/2009/03/31/78444.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/percyph/comments/commentRss/78444.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/percyph/services/trackbacks/78444.html</trackback:ping><description><![CDATA[      一个Vector模板c?开始的时候是q样写的Q?br>template <class T><br>class Vector<br>{<br>public:<br>    Vector(unsigned n=8):_size(n),_data(new T[_size]){}<br>   //.........<br>protected:<br>    T*       _data;<br>    unsigned _size;<br>};<br>l果一q行Q机子就慢了Q打开d理器,占内存超大。后来想h初始化列表是按照成员变量的声明顺序初始化的,所以在构造函数里_data数组先被初始化,q时_size没被初始化,即_sizeq是个随机|估计随机的很大,呵呵Q比方说_size?234567Q于是就甌?234567的内存。。。?br>于是修改如下OK了:<br>template <class T><br>class Vector<br>{<br>public:<br>    Vector(unsigned n=8):_size(n),_data(new T[_size]){}<br>   //.........<br>protected:<br>    unsigned _size;//先声明_sizeQ先初始化它<br>    T*       _data;<br>}; <img src ="http://www.shnenglu.com/percyph/aggbug/78444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/percyph/" target="_blank">虫?/a> 2009-03-31 10:33 <a href="http://www.shnenglu.com/percyph/archive/2009/03/31/78444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>到命名I间的问?/title><link>http://www.shnenglu.com/percyph/archive/2009/03/31/78442.html</link><dc:creator>虫?/dc:creator><author>虫?/author><pubDate>Tue, 31 Mar 2009 02:25:00 GMT</pubDate><guid>http://www.shnenglu.com/percyph/archive/2009/03/31/78442.html</guid><wfw:comment>http://www.shnenglu.com/percyph/comments/78442.html</wfw:comment><comments>http://www.shnenglu.com/percyph/archive/2009/03/31/78442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/percyph/comments/commentRss/78442.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/percyph/services/trackbacks/78442.html</trackback:ping><description><![CDATA[       昨天写个c,到个问题,我这里用单的例子说明Q比方说写个学生c,性别用枚举来表示Q然后有个获得性别的函数GetGender(),q回值类型ؓGender?br>class Student<br>{<br>enum Gender{MALE,FEMALE};<br>//...<br>Gender GetGender();<br>};<br>函数的实现如?br>Gender Student::GetGender<br>{//...<br>}<br>l果出错。感觉挺莫名其妙的,呵呵。后来一琢磨Q改成了<br>Student::Gender Student::GetGender<br>{//...<br>}<br>成功Q!Q!q个写法有意?^_^     <img src ="http://www.shnenglu.com/percyph/aggbug/78442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/percyph/" target="_blank">虫?/a> 2009-03-31 10:25 <a href="http://www.shnenglu.com/percyph/archive/2009/03/31/78442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>资料分n声明http://www.shnenglu.com/percyph/archive/2009/03/06/75763.html虫?/dc:creator>虫?/author>Fri, 06 Mar 2009 10:32:00 GMThttp://www.shnenglu.com/percyph/archive/2009/03/06/75763.htmlhttp://www.shnenglu.com/percyph/comments/75763.htmlhttp://www.shnenglu.com/percyph/archive/2009/03/06/75763.html#Feedback4http://www.shnenglu.com/percyph/comments/commentRss/75763.htmlhttp://www.shnenglu.com/percyph/services/trackbacks/75763.html账号Qpercyph1@163.com
密码Qxcc123456
如果大家有c++QopenGLQ密码学{等计算机方面的好资料,也可以发l我Q我的邮是 percyph@163.com
大家也可以回帖要资料Q如果有的话我会W一旉发上?br>怿来我q儿的朋友都是有素质的,请不要删除和Ud邮箱里的文gQ谢谢!

目前已经上传的资料有Q(以后会陆l更斎ͼ

   VC~程助手Q小软gVC++ assistantQ能使编E更方便Q?br>   C++Primer3Q电子书Q?br>   glut函数说明Q电子书Q?br>   C++技能百l(l典法Q?rar 
   ROAM地Ş法演示E序.rar 
   OpenGL 参考手?br>   c&c++深层探烦 
   C++必知必会 
   VC6.0~程实例_解 
   高质量C++~程指南&~程新手真言&MFCcd详解 
   WindowsE序设计 
   MFCcd详解.chm 
   C++ 数据l构W三?nbsp;
   C++ 数据l构W三?nbsp;
   E序员面试宝?amp;E序员超U开发宝?nbsp;
   c++和OpenGL函数手册 
   Essential C++中文?pdf 
   Effective C++(电子? 
   C++~程思想Q电子书Q?

3.11号上传(kuafoo发的Q?/span>
   Windows环境?2位汇~语a.chm(2.78M)
   深入出MFC
   深入出MFCW二?br>  
另外最q几个月写的数据l构的程序也传上MQ有兴趣的朋友可以看看!

里面包括Q?/p>

U性表——静态链?009.7.30
U性表——链表的内部cd?008.8
U性表——链表的友元cd?008.8
U性表——双向链?009.8.11
U性表——顺序表2009.8.3
U性表——友元模板类2009.8

U瑟夫问题——四U解?009.8.11Q数l,链表Q@环链表等Q?br>队列——队列的序表示循环队列2009.8.11
队列——链队列2009.8.11
栈——汉诺塔2009.8.6
栈——进制{?009.8.6
栈——括号匹?009.8.6
栈——模杉K?009.8.3
栈——模杉K序栈2009.7
栈——顺序栈2009.8.6
栈——算术表辑ּ求?009.7.13
栈——行~辑2009.8.6
二叉树——二叉树的常见操?009.9.3

2010.3.9 更新

树的应用—仿DOS文g夹管理程?/p>

200位大C?rar

200位大数加?rar

q连看单机程序MFC



]]>
struct和typedef struct http://www.shnenglu.com/percyph/archive/2009/03/06/75742.html虫?/dc:creator>虫?/author>Fri, 06 Mar 2009 06:20:00 GMThttp://www.shnenglu.com/percyph/archive/2009/03/06/75742.htmlhttp://www.shnenglu.com/percyph/comments/75742.htmlhttp://www.shnenglu.com/percyph/archive/2009/03/06/75742.html#Feedback20http://www.shnenglu.com/percyph/comments/commentRss/75742.htmlhttp://www.shnenglu.com/percyph/services/trackbacks/75742.html1 首先Q?/span>
      在C中定义一个结构体cd要用typedef:
        typedef struct Student
        {
            int a;
        }Stu;
于是在声明变量的时候就可:Stu stu1;
如果没有typedef必ȝstruct Student stu1;来声?br>q里的Stu实际上就是struct Student的别名?br>另外q里也可以不写StudentQ于是也不能struct Student stu1;了)
        typedef struct
        {
            int a;
        }Stu;
但在c++里很单,直接
        struct Student
        {
           int a;
        };
于是定义了l构体类型StudentQ声明变量时直接Student stu2Q?br>===========================================
2其次Q?/span>
在c++中如果用typedef的话Q又会造成区别Q?br>       struct   Student  
       {  
          int   a;  
       }stu1;//stu1是一个变?nbsp; 
       typedef   struct   Student2  
       {  
          int   a;  
        }stu2;//stu2是一个结构体cd  
使用时可以直接访问stu1.a
但是stu2则必d   stu2 s2;
然后               s2.a=10;
===========================================
3 掌握上面两条可以了Q不q最后我们探讨个没多大关pȝ问题
如果在cE序中我们写Q?br>       typedef struct  
       {
           int num;
           int age;
       }aaa,bbb,ccc;
q算什么呢Q?br>我个察编译器QVC6Q的理解Q这相当?br>       typedef struct  
       {
           int num;
           int age;
       }aaaQ?br>       typedef aaa bbb;
       typedef aaa ccc;
也就是说aaa,bbb,ccc三者都是结构体cd。声明变量时用Q何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaaQbbbQccc是截然不同的三个对象?img src ="http://www.shnenglu.com/percyph/aggbug/75742.html" width = "1" height = "1" />

]]>
Q{Qglut函数详解(13)--视频大小调整APIhttp://www.shnenglu.com/percyph/archive/2009/03/03/75427.html虫?/dc:creator>虫?/author>Tue, 03 Mar 2009 07:41:00 GMThttp://www.shnenglu.com/percyph/archive/2009/03/03/75427.htmlhttp://www.shnenglu.com/percyph/comments/75427.htmlhttp://www.shnenglu.com/percyph/archive/2009/03/03/75427.html#Feedback0http://www.shnenglu.com/percyph/comments/commentRss/75427.htmlhttp://www.shnenglu.com/percyph/services/trackbacks/75427.html阿杰Q-江南暖冬
int glutVideoResizeGet(GLenum param);
q回glut视频大小调整的信?
参数:
param:
  GLUT_VIDEO_RESIZE_POSSIBLE:如果底层支持视频大小调整,则返回非0?否则q回0.如果q回0,则其他视频大调整函数的调用不起作?
  GLUT_VIDEO_RESIZE_IN_USE
  GLUT_VIDEO_RESIZE_X_DELTA
  GLUT_VIDEO_RESIZE_Y_DELTA
  GLUT_VIDEO_RESIZE_WIDTH_DELTA
  GLUT_VIDEO_RESIZE_HEIGHT_DELTA
  GLUT_VIDEO_RESIZE_X
  GLUT_VIDEO_RESIZE_Y
  GLUT_VIDEO_RESIZE_WIDTH
  GLUT_VIDEO_RESIZE_HEIGHT
 
后面几个帔R值在|上没有搜到解释.

//*******************************************************************************************
void glutSetupVideoResizing(void);
 
void glutStopVideoResizing(void);
 
void glutVideoResize(int x, int y, int width, int height);
 
void glutVideoPan(int x, int y, int width, int height);

我把glut的头文g中的所有函数都整理了一?只可?video resize sub-API中的几个函数|上都没有具体的介绍,本菜鸟也无能为力,q好q些函数都不是常用的,我想一般用不着.除了和视频有关的API,前面几个帖子的内容已l基本把glut的所有函数都q了一?本专题也q是完成了,以后如果扑ֈ相关资料,会把q里的补?也希望达够指点一?

]]>
Q{Qglut函数详解(12)--游戏模式APIhttp://www.shnenglu.com/percyph/archive/2009/03/03/75426.html虫?/dc:creator>虫?/author>Tue, 03 Mar 2009 07:38:00 GMThttp://www.shnenglu.com/percyph/archive/2009/03/03/75426.htmlhttp://www.shnenglu.com/percyph/comments/75426.htmlhttp://www.shnenglu.com/percyph/archive/2009/03/03/75426.html#Feedback0http://www.shnenglu.com/percyph/comments/commentRss/75426.htmlhttp://www.shnenglu.com/percyph/services/trackbacks/75426.html 
//*******************************************************************************************
void glutGameModeString(const char *string);
通过一个字W串对game mode(游戏模式,也即全屏模式)q行讄,卛_屏幕q行讄.
参数:
string:一个指向字W串的指?字符串的内容x对屏q的讄.字符串的格式如下所C?
  "W*H"
  "W*H:Bpp"
  "W*H@Rr"
  "W*H:Bpp@Rr"
  "@Rr"
  ":Bpp"
  "Bpp:@Rr"
(?W:屏幕宽度,以像素单?H:屏幕高度,以像素ؓ单位;Bpp:每个像素的内存大?位数);Rr:屏幕的刷新率.)
例子:
1.如果我们只关心屏q大?800*600)而不兛_每个像素的内存占用和h频率,可以写成:
    glutGameModeString("800*600");
2.如果只想把每个像素的内存占用讄?2?可以写成:
    glutGameModeString(":32");
3.如果只想把刷新率讄?5赫兹,可以写成:
    glutGameModeString("@75");
4.如果前三U情况都考虑,可以写成:
    glutGameModeString("800*600:32@75");
其他情况按照上面l出的字W串格式写出卛_.
?
  1.q个函数只是对硬件的h,如果讄不合?则将被忽?
  2.q个函数q不q回错误?如果要获得错误信?则要用glutGameModeGet()函数.

//*******************************************************************************************
int glutEnterGameMode(void);

q入相应的game mode,卌glutGameModeString()的设|生?

//*******************************************************************************************
void glutLeaveGameMode(void);

dglutGameModeString()讄的game mode.

//*******************************************************************************************

int glutGameModeGet(GLenum mode);

设|的模式是否有效

参数:
mode:
  GLUT_GAME_MODE_ACTIVE:如果E序q行在game mode,则返回非0?如果q行在窗口模?则返?.
  GLUT_GAME_MODE_POSSIBLE:判断glutAameModeString()的设|是否有?如果有效则返回非0?否则q回0.但是glut手册中有一个警?即ɘq个讄是有效的,也不能保证屏q设|可以一定成功生?
  GLUT_GAME_MODE_WIDTH:q回屏幕的宽?
  GLUT_GAME_MODE_HEIGHT:q回屏幕的高?
  GLUT_GAME_MODE_PIXEL_DEPTH:q回当前模式下每个像素所占用的内存空?位数).
  GLUT_GAME_MODE_REFRESH_RATE:q回实际的刷新率(单位赫兹).
  GLUT_GAME_MODE_DISPLAY_CHANGED:正如前面所?不能保证屏幕昄模式一定根据设|发生改?q个帔R可以用来试是否真的q入了game mode(先前是窗口模式下的情况下),如果先前已经是game mode,则可以用来测试设|是否发生改?q回?DC入了game mode或设|已l发生改?否则q回0.


]]>
þùƷHDAV| þǿdŮվ| ҹþþþƷӰԺ| ƷۺϾþ| þѿaëƬ| þþƷѿ| һۺϾþù| Ʒþþþ| Ʒþþþþר| ƷžžþƵ| 99þþƷѿһ| վþþ| ɫۺϾþ| ھƷþþþ| պþþþþ| Ʒþþþþ| ޾þþһ | ˾þۺӰԺ| ŮHҳþþ| ĻþþƷ| 99þùѸ| Ʒþþþþר| ŷһþ| þþþӰԺС| þ99ֻƵƷ8| ˾þþƷavһ| þɫۺһ| Ӱһþþþó˾Ʒۺ | þþþþƵ| þþ޾Ʒһ| þþž޾Ʒ| þþþĻ| þþþþþ99Ʒѹۿ| þþƷ޾Ʒ2020 | þݹֻƬ| 99þùѸ| þþƷ޾Ʒɫ| þۺϳDž | Ʒһþ㽶߿ۿ| Ʒþþһ| ݺɫþþһ|