立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广州大学城网业务调整

[OpenGL] [OpenGL特效]层叠变幻的三角形 [复制链接] qrcode

查看: 10904 | 回复: 4

523066680
发表于: 2010-3-7 23:16:52 | 显示全部楼层

哈 算是模仿屏保吧~ 不过都是自己思考哦。窗口 没有全屏……



随机种子没有设定,所以每次打开都是一个“随机”路线(真是随机中的不随机啊……)
然后是代码没有考虑效率,没有考虑易读性,没有考虑代码体积Q2¥#@……


#include <GL/glut.h>
#include <time.h>
#include <stdlib.h>
#define xpix 500
#define ypix 300
#define dotsize 2
#define NDOT 3
#define RCD 8
#define ATOB 5
/* ATOB 是为了使点与点之间的距离明显,所以把坐标实际放大,导致点显示范围缩小,
   而建立的一个比率,实际500个点的坐标,0-99 代表了总长,0-1里实际包括了5个像素 
*/
int winid;

struct {
  int x;
  int y;
} source[NDOT];

struct dots {
  float x,y;
  float xadd,yadd;
} dot[NDOT];

struct {
   struct {float x,y;} dot[NDOT];
} record[RCD];

float xadd,yadd;
void display(void)
{
   int i;
   static int rcd=0,clear=0;
   _sleep(30);
   if (clear==0) {glClear(GL_COLOR_BUFFER_BIT);clear+=1;}
   if (rcd<(RCD-1)) {rcd++;} else {rcd=0;}
   glBegin(GL_LINE_STRIP);
      if (record[rcd].dot[0].x!=-1) {
         glColor3f(0.0,0.0,0.0);
         for (i=0;i<NDOT;i++) {
          glVertex3f(record[rcd].dot.x,record[rcd].dot.y,0.0);
         }
         glVertex3f(record[rcd].dot[0].x,record[rcd].dot[0].y,0.0);
      }
      for (i=0;i<NDOT;i++) {
          glColor3f(dot.x/xpix*ATOB,dot.y/ypix*ATOB,0.6);
          glVertex3f(dot.x,dot.y,0.0);
          record[rcd].dot.x=dot.x;
          record[rcd].dot.y=dot.y;
      }
      glVertex3f(dot[0].x,dot[0].y,0.0);
   glEnd();
   glFlush();
}

void todo(void)
{
    int i;
    void set_xadd_yadd(int i);
    for (i=0;i<NDOT;i++)
    {
      if (source.x!=(int)dot.x) {
        dot.x+=dot.xadd;
      } else {
        if (source.y==(int)dot.y) {
           source.x=rand()%(xpix/ATOB);
           source.y=rand()%(ypix/ATOB);
           set_xadd_yadd(i);
        }
      }
      if (source.y!=(int)dot.y) {
        dot.y+=dot.yadd;
      }
    }
    glutPostRedisplay();
}

void set_xadd_yadd(int i)
{
     float deltax,deltay;
     deltax=source.x-dot.x;
     deltay=source.y-dot.y;
     if ((deltax*deltax)>(deltay*deltay)) {
        if (source.x>dot.x) {dot.xadd=1.0;} else {dot.xadd=-1.0;}
        dot.yadd=deltay/deltax*dot.xadd;
     } else {
        if (source.y>dot.y) {dot.yadd=1.0;} else {dot.yadd=-1.0;}
        dot.xadd=deltax/deltay*dot.yadd;
     }
}

void init(void)
{
     int i;
     glOrtho(0.0,xpix/ATOB,0.0,ypix/ATOB,0.0,1.0);
     glClearColor(0.0,0.0,0.0,0.0);
     glPointSize(dotsize);
     for (i=0;i<NDOT;i++) {
          source.x=xpix/2/ATOB;
          source.y=ypix/2/ATOB;
          dot.x=source.x;
          dot.y=source.y;
          record[0].dot.x=source.x;
          record[0].dot.y=source.y;
     }
     for (i=1;i<RCD;i++) {
         record.dot[0].x=-1;
     }
}

void hitkey(unsigned char key,int mousex,int mousey)
{
     switch (key)
     {
      case 'q':
           glutDestroyWindow(winid);
           exit(0);
     }
}

int main(int argc,char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
    glutInitWindowSize(xpix,ypix);
    glutInitWindowPosition(0,0);
    winid=glutCreateWindow("IF_STRIP_TRIANGLE");
    init();
    glClear(GL_COLOR_BUFFER_BIT);
    glutDisplayFunc(display);
    glutIdleFunc(todo);
    glutKeyboardFunc(hitkey);
    glutMainLoop();
    return 0;
}



STRIP_Triangle01.rar

71 KB, 下载次数: 11

评分

1

查看全部评分

跳转到指定楼层
523066680
发表于: 2010-3-7 23:20:30 | 显示全部楼层

程序文件看1喽附件, 按q 退出程序
523066680
发表于: 2010-4-4 22:55:34 | 显示全部楼层

感谢wind斑竹支持啊~      

今天跟进,上面的代码算式中有个错误。
即设置循环中 坐标x,y 的变化量时,使用到一个除法,该除数可能为零
而除数为0会导致式子提示出错,可能造成中途退出的。
================================================

做了一个 粒子聚集效果

#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>

#define xpix 500
#define ypix 500
#define dotsize 3
#define NDOT 100

int winid;
float xabs(float x)
{
   if (x<0.0) {return -x;} else {return x;}
}

struct {
  int x;
  int y;
} dest={xpix-20,ypix-20};

struct {
  float x,y;
  float xadd,yadd;
} dot[NDOT];

float xadd,yadd;
void display(void)
{
   int i;
   _sleep(15);
   glClear(GL_COLOR_BUFFER_BIT);
   glBegin(GL_POINTS);
      for (i=0;i<NDOT;i++) {
          glColor3f(dot.x/xpix,dot.y/ypix,i/20.0);
          glVertex3f(dot.x,dot.y,0.0);
      }
   glEnd();
   glFlush();
}

void todo(void)
{
    int i;
    static int xi=1;
    void set_xadd_yadd(int i);
    for (i=0;i<xi;i++)
    {
      if (dest.x!=(int)dot.x) {
        dot.x+=dot.xadd;
      } else {
        if (dest.y==(int)dot.y) {
           /*dot.x=rand()%xpix;
           dot.y=rand()%ypix;*/
           dot.x=sin(rand()%628/100.0)*200+100;
           dot.y=cos(rand()%628/100.0)*200+100;
           set_xadd_yadd(i);
        }
      }
      if (dest.y!=(int)dot.y) {
        dot.y+=dot.yadd;
      }
    }
    if (xi<NDOT) {xi++;}
    glutPostRedisplay();

}
/* About set_xadd_yadd , ah....
Attention: N=A/B , B can't be zero.
1.dtx!=0
1-1.abs(dtx)>abs(dty) : xadd=1 or -1 ; yadd=dty/abs(dtx); (OK,dtx!=0)
1-2-1. abs(dtx)<abs(dty): yadd=1 or -1 ; xadd=dtx/abs(dty); (OK,abs(dty)>abs(dtx)>0)
1-2-2. abs(dtx)==abs(dty):yadd=1 or -1 ; xadd=dtx/abs(dty); (OK,abs(dty)!=0)

2.dtx==0
  2-1. abs(dtx)>abs(dty) :  Impossable!  
  2-2. abs(dtx)<abs(dty) : yadd=1 or -1; xadd=0;
  2-3. dtx==dty : xadd=yadd=0;
*/

void set_xadd_yadd(int i)
{
     float deltax,deltay,xadd,yadd;
     deltax=dest.x-dot.x;
     deltay=dest.y-dot.y;
     if (xabs!=0) {
       if (xabs(deltax)>xabs(deltay)) {
          if (dest.x>dot.x) {xadd=1.0;} else {xadd=-1.0;}
          yadd=deltay/xabs(deltax);
       } else {
          if (dest.y>dot.y) {yadd=1.0;} else {yadd=-1.0;}
          xadd=deltax/xabs(deltay);
       }
     } else {
       xadd=0;
        if (xabs(deltax)<xabs(deltay)) {
           yadd=dest.y>dot.y ? 1:-1;
        } else {
           xadd=yadd=0;
        }
     }
     dot.xadd=xadd;
     dot.yadd=yadd;
}

void init(void)
{
     int i;
     glOrtho(0.0,xpix,0.0,xpix,0.0,1.0);
     glClearColor(0.0,0.0,0.0,0.0);
     glPointSize(dotsize);
     for (i=0;i<NDOT;i++) {
          dot.x=dest.x;
          dot.y=dest.y;
     }
     dot[0].x=0.0;
     dot[0].x=0.0;
}

void hitkey(unsigned char key,int mousex,int mousey)
{
     switch (key)
     {
      case 'q':
           glutDestroyWindow(winid);
           exit(0);
     }
}

int main(int argc,char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
    glutInitWindowSize(xpix,ypix);
    glutInitWindowPosition(0,0);
    winid=glutCreateWindow("hit");
    init();
    glutDisplayFunc(display);
    glutIdleFunc(todo);
    glutKeyboardFunc(hitkey);
    glutMainLoop();
    return 0;
}



聚集02.rar

66 KB, 下载次数: 1

523066680
发表于: 2010-4-4 23:02:14 | 显示全部楼层

附件里的程序还是按q退出~
laopo1
发表于: 2012-12-24 21:58:53 | 显示全部楼层

谢谢分享,学习一下
快速回复 返回顶部 返回列表