LineFlower3DSP

一个3D屏保程序,算法的原理类似于圆内轮旋线的生成.

下载地址:

http://files.cnblogs.com/WhyEngine/LineFlower3D_sp.zip

切图:

双击"LineFlower3DSP.scr"可运行程序

屏保设置方式
XP:
将目录下的所有文件拷贝到WINDOWS系统目录下如"C:\WINDOWS\system32"
在设置屏保的对话框中,选择"LineFlowerSP"

WIN7,WIN8
将目录下的所有文件拷贝到"C:\WINDOWS\SysWOW64"或"C:\WINDOWS\SysWOW32"目录下
在设置屏保的对话框中,选择"LineFlowerSP"

程序启动后,点击鼠标或按下键盘任意按键会自动退出
使用鼠标滚轮滚动进行切换

代码也贴出来.其实这代码写得麻烦了,如果对数学了解得深一些的话,可以使用更简单的算法生成.

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

   File name   :  LineFlower.h
Author :
Version : 1.0a
Create Date : 2014/06/09
Description : *****************************************************************/ // -------------------------------------------------------------------------------------- #ifndef _LineFlower_H_
#define _LineFlower_H_ // -------------------------------------------------------------------------------------- #define MAX_CIRCLES_COUNT 200 struct LfVertex
{
float x;
float y;
float z;
}; // -------------------------------------------------------------------------------------- class CLineFlower
{
public:
CLineFlower(); void Reset(); void AutoSize(float width, float height); const LfVertex& GetVertex(unsigned int index)
{
return m_listVertices[index % m_nVerticesNum];
} public:
float m_listSinValues[];
float m_listCosValues[]; float m_fOutCircleRadius;
float m_fInCircleRadius;
float m_fScreenCircleRadius;
float m_fOffset;
float m_fStepScale0;
float m_fStepScale180;
float m_fOffsetScale0;
float m_fOffsetScale180; unsigned int m_zParam; float m_fHalfExtendXY;
float m_fHalfExtendZ;
float m_fHalfExtendXYZ; LfVertex m_listVertices[MAX_CIRCLES_COUNT * + ]; unsigned int m_nVerticesNum;
unsigned int m_nCirclesCount; bool m_enableZ;
}; // -------------------------------------------------------------------------------------- #endif
 /****************************************************************

   File name   :  LineFlower.cpp
Author :
Version : 1.0a
Create Date : 2014/06/09
Description : *****************************************************************/ // -------------------------------------------------------------------------------------- #include "LineFlower.h"
#include <float.h>
#include <math.h>
#include <stdlib.h>
#include <string.h> // -------------------------------------------------------------------------------------- #define DEGREE_MAX_ERROR 3.0f // -------------------------------------------------------------------------------------- inline int yf_rand(int a)
{
return (int)(::rand() % a);
} inline int yf_rand(int a, int b)
{
return a + (int)(::rand() % (b-a));
} inline float yf_rand_real(float a)
{
return a * (float)(::rand() / ((float)RAND_MAX + ));
} inline float yf_rand_real(float a, float b)
{
const float r = (float)(::rand() / ((float)RAND_MAX + ));
return r*(b-a) + a;
} inline bool yf_rand_bool()
{
return (::rand() % == );
} inline float yf_lerp(float a, float b, float r)
{
return a + (b - a) * r;
} // -------------------------------------------------------------------------------------- CLineFlower::CLineFlower()
{
const float d2r = 0.01745329251994f;
float r;
for (unsigned int i = ; i < ; i++)
{
r = i * d2r;
m_listSinValues[i] = sinf(r);
m_listCosValues[i] = cosf(r);
} m_nVerticesNum = ;
m_nCirclesCount = ; memset(m_listVertices, , sizeof(m_listVertices)); m_enableZ = true;
} void CLineFlower::Reset()
{
m_fOutCircleRadius = yf_rand_real(8.0f, 64.0f);
m_fInCircleRadius = yf_rand_real(4.0f, 64.0f);
m_fOffset = yf_rand_real(2.0f, m_fInCircleRadius);
if (yf_rand_bool())
{
m_fOffset = -m_fOffset;
} m_fStepScale0 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
m_fStepScale0 = 1.0f / m_fStepScale0;
}
m_fStepScale180 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
m_fStepScale180 = 1.0f / m_fStepScale180;
} m_fOffsetScale0 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
m_fOffsetScale0 = 1.0f / m_fOffsetScale0;
}
m_fOffsetScale180 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
m_fOffsetScale180 = 1.0f / m_fOffsetScale180;
} m_fScreenCircleRadius = m_fOutCircleRadius + m_fInCircleRadius;
float step = m_fScreenCircleRadius / m_fInCircleRadius;
if (step > 360.0f)
{
return;
} float maxOffset = (m_fOffsetScale180 > m_fOffsetScale0) ? m_fOffsetScale180 : m_fOffsetScale0;
maxOffset *= fabs(m_fOffset);
m_fHalfExtendXY = m_fOutCircleRadius + maxOffset;
if (m_enableZ)
{
m_fHalfExtendZ = yf_rand_real(0.0f, 64.0f);
m_fHalfExtendXYZ = sqrtf(m_fHalfExtendXY*m_fHalfExtendXY + m_fHalfExtendZ*m_fHalfExtendZ);
}
else
{
m_fHalfExtendZ = 0.0f;
m_fHalfExtendXYZ = m_fHalfExtendXY;
} m_zParam = yf_rand(, ); m_nCirclesCount = MAX_CIRCLES_COUNT;
m_nVerticesNum = m_nCirclesCount * ; LfVertex vCenter;
float degree = ; LfVertex vPos0;
LfVertex vPos1;
unsigned int index;
float r, a;
float scale; for (unsigned int i = ; i < m_nCirclesCount; i++)
{
for (unsigned int j = ; j < ; j++)
{
vCenter.x = m_fOutCircleRadius*m_listSinValues[j];
vCenter.y = m_fOutCircleRadius*m_listCosValues[j];
if (m_enableZ)
{
vCenter.z = m_fHalfExtendZ*m_listSinValues[j*m_zParam % ];
}
else
{
vCenter.z = 0.0f;
} r = fabsf(degree - 180.0f) / 180.0f;
scale = yf_lerp(m_fOffsetScale0, m_fOffsetScale180, r); index = (unsigned int)degree;
vPos0.x = vCenter.x - m_fOffset*scale*m_listSinValues[index];
vPos0.y = vCenter.y - m_fOffset*scale*m_listCosValues[index]; vPos1.x = vCenter.x - m_fOffset*scale*m_listSinValues[index + ];
vPos1.y = vCenter.y - m_fOffset*scale*m_listCosValues[index + ]; a = degree - index;
LfVertex& v = m_listVertices[i* + j];
v.x = vPos0.x*(1.0f - a) + vPos1.x*a;
v.y = vPos0.y*(1.0f - a) + vPos1.y*a;
if (m_enableZ)
{
float dis = sqrtf(v.x*v.x + v.y*v.y);
v.z = vCenter.z * (1.0f - dis / m_fScreenCircleRadius);
}
else
{
v.z = 0.0f;
} scale = yf_lerp(m_fStepScale0, m_fStepScale180, r);
degree += step*scale;
degree = fmodf(degree, 360.0f);
} if (degree < DEGREE_MAX_ERROR || degree > 360.0f - DEGREE_MAX_ERROR)
{
m_nCirclesCount = i + ;
m_nVerticesNum = m_nCirclesCount * ;
m_listVertices[m_nVerticesNum] = m_listVertices[];
m_nVerticesNum++;
break;
}
}
} void CLineFlower::AutoSize(float width, float height)
{
float fMinX = FLT_MAX;
float fMaxX = -FLT_MAX;
float fMinY = FLT_MAX;
float fMaxY = -FLT_MAX; for (unsigned int i = ; i < m_nVerticesNum; i++)
{
if (fMinX > m_listVertices[i].x)
{
fMinX = m_listVertices[i].x;
}
if (fMaxX < m_listVertices[i].x)
{
fMaxX = m_listVertices[i].x;
} if (fMinY > m_listVertices[i].y)
{
fMinY = m_listVertices[i].y;
}
if (fMaxY < m_listVertices[i].y)
{
fMaxY = m_listVertices[i].y;
}
} float ox = fMaxX - fMinX;
float oy = fMaxY - fMinY; float halfWidth = width*0.5f;
float halfHeight = height*0.5f; for (unsigned int i = ; i < m_nVerticesNum; i++)
{
m_listVertices[i].x = -halfWidth + (m_listVertices[i].x - fMinX)*width/ox;
m_listVertices[i].y = -halfHeight + (m_listVertices[i].y - fMinY)*height/ox;
}
}

3D屏保: 线圈的更多相关文章

  1. 3D屏保:排色榜

    3D屏保:排色榜 排色榜,是一个针对图形学中的色彩进行排序的DEMO,这里的色是色彩的意思,看成别的点进来的同学请自觉面壁.该DEMO可以按RGB,GBR,BRG,灰度值四种方式进行排序.排序算法为冒 ...

  2. 3D屏保:N皇后

    前几天园子里有人发表关于8皇后的算法.只有代码,没有能运行的DEMO多枯燥.于是我这两天抽时间写了个N皇后的屏保程序.程序启动后会从4皇后到14皇后显示其所有排列,每隔0.5秒自动切换一次.按下空格键 ...

  3. 3D屏保: 彩色盘子

    一个彩色盘子的屏保 记得小时候在电视上看过一个科普节目,由多个颜色组成的盘子,如果快速旋转起来,会看上去是白色的.于是我就写了这个屏保程序,但发现在计算机上模拟并不是这样的. "RollPl ...

  4. 3D屏保:魔方2.0版本

    一个三维魔方的屏保软件,可支持2级到72级的魔方.启动后魔方会自动旋转,并最终回到初始状态.有很多人问我这是怎么做到的,用的什么解魔方的算法,其实我自己根本就不会玩魔方,别人用技巧解魔方,我这程序中用 ...

  5. 3D屏保程序:汉诺塔

    学过程序的人一定记得汉诺塔.我们学的第一个程序是HelloWorld,而碰到的第一个坑就是汉诺塔,短短十几行代码,不知花费了多少时间精力去理解.我记得当年的开发环境还是蓝屏的,汉诺塔程序的输出还是一行 ...

  6. html5 canvas 3d屏保 源码

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  7. 屏保:画线圈LineFlower

    LineFlowerSP 小时候玩过一种画线圈的玩具,将一个圆形齿轮在一个大圈里转,会画出各种图形来.这个程序就是模仿它做的.算法原理:将一个圆围绕着另一个大圆公转,并且它还做自转运动.那么圆内一点的 ...

  8. C#制作简易屏保

    前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...

  9. 一个仿windows泡泡屏保的实现

    一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...

随机推荐

  1. 使用linux mysql客户端建立表时遇到格式解析的问题

    发现在notepad++写好的建表脚本,粘贴到linux客户端后,执行时总是报我的脚本有问题. 我看了又看,发现建表脚本本身是没有问题,问题出在"Tab"键上和注释上边了. 解决办 ...

  2. vue 单向数据流 & 双向绑定

    在react中是单向数据绑定,而在vue中的特色是双向数据绑定.但是其实就我个人的理解是: 其实无论是vue还是react其实还是提倡单向数据流去管理状态,这一点在vuex和redux状态管理器上体现 ...

  3. ubuntu16.04(64位)建立交叉编译环境,并配置编译内核

    安装步骤 1.准备工具安装目录 将压缩包gcc-linaro-arm-linux-bnueabihf-4.9-2014.07_linux.tar存放在一个目录下,这个目录就是你等会解压缩的目录,以后这 ...

  4. VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(上)

    <[原]关于VC运行时关闭极域电子教室的改进方法> 本文将讲资料和方法,具体实现和破解联想硬盘保护系统密码在(下)中,有关破解联想硬盘保护系统(删除它)的方法很简单,用硬盘保护卡克星就可以 ...

  5. Java基础(1)JDK的安装与环境变量配置

    最近在复习Java基础,第一课就是JDK的安装配置以及环境变量的配置,不多废话,直接开始吧 (1)去Oracle官方网站下载JDK 1.8 Java的历史想必大家也清楚,Sun公司开发的一门面向对象的 ...

  6. 解决请求参数的中文乱码问题(get、post)

    2018-11-28 在web请求与响应中,会遇到乱码问题,比如填写表单数据时,难免会输入中文,姓名.公司名称等.由于HTML设置了浏览器在传递请求参数时,采用的编码方式是UTF-8,但在解码时采用的 ...

  7. hdu 2121

    朱刘算法求无根最小树形图 可以任意选一个根,求最小的权和以及当时的根. 先建一个超级根,它连向所有点,边权为所有边的边权和加1(即sumw+1),然后求以它为根的最小树形图,再根据树形图权和与2*(s ...

  8. BZOJ2716 KD-Tree

    好久没写博客了 回去赶了好久文化课 颓欲见长 突然翻到fc爷的KD-Tree板子 来切了到裸题 对于一开始的数据我们可以先预处理 具体的排序方式见板子 其实就是我们对每次选定的一块选一个维度来排序啦 ...

  9. BZOJ 1008 [HNOI2008]越狱 排列组合

    1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4788  Solved: 2060[Submit][Status] ...

  10. C#高级编程9-第7章 运算符和类型强制转换

    运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...