objective-c - 随机移动 - Windows Pipe Screensaver

标签 objective-c c algorithm

很多人可能知道the classic windows screen saver .有谁知道这是如何用 3D 或 2D 编程的?不需要真正的代码 - 只需对算法进行全面解释就可以了。

最佳答案

This是 Chrome 的屏幕截图。在 chrome 中,它的编程非常容易:

file_util::AppendToPath(&path, L"sspipes.scr");
  CreateProcess(NULL, ...

或者:打开一个 windows 管道屏幕保护程序文件,然后运行它。

xscreensaver 版本的来源是:xscreensaver-4.16.tar.bz2 中的 xscreensaver-4.16/hacks/glx/pipes.c(或同一包的其他版本)。 Online version of the file .

更新:它是如何工作的:它使用 OpenGL 使事物变得美丽

添加的每个 pipe 都绘制为圆柱体和球体:

    glBegin(GL_QUAD_STRIP);
    for (an = 0.0; an <= 2.0 * M_PI; an += M_PI / 12.0) {
            glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0);
            glVertex3f(COSan_3, SINan_3, one_third);
            glVertex3f(COSan_3, SINan_3, -one_third);
    }
    glEnd();

空间旋转由 glRotatefglBegin 之前完成。所有旋转仅为 90 度。

结束球体是 glu 对象:

    quadObj = gluNewQuadric();
    gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
    gluSphere(quadObj, radius, 16, 16);
    gluDeleteQuadric(quadObj);

对于折弯,用了很多代码来绘制(函数myElbow)。

为了不相交,3d 数组与标志“这个空间点包含一个管道”一起使用。所有管道都具有整数坐标并且平行于轴。透视校正来自 3d 库 (opengl/direct3d)。

主要的逻辑函数是draw_pipes

它绘制一个球体,随机选择一个方向并开始管道运行。在每一步都有一个随机的弯曲(有 20% 的概率)。此外,每一步都会检查邻居以防止碰撞。如果没有可用空间继续管道或管道足够长(也可能是随机的),它将停止并从随机点开始新管道。

关于objective-c - 随机移动 - Windows Pipe Screensaver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6964466/

相关文章:

ios - 从 ViewController 调用 nib 方法

ios - 从 navigationController 访问推送的 Controller

objective-c - 想在 iOS 应用中使用 sqlite3.h

algorithm - haskell NB : ‘Edge’ is a non-injective type family

ios - 根据JSON删除核心数据中的对象

c - 矩阵中的段错误 - C

c - 在C中,如何到达指定目录?

c - pthread和select()函数的作用是什么?

java - 如何设计实时警报系统?

python - 找到从一种状态到另一种状态的最少函数调用的最快方法