LineFlowerSP

小时候玩过一种画线圈的玩具,将一个圆形齿轮在一个大圈里转,会画出各种图形来.这个程序就是模仿它做的.算法原理:将一个圆围绕着另一个大圆公转,并且它还做自转运动.那么圆内一点的运动轨迹就能生成一个奇妙的图形.更奇妙的是,一个小小参数的改变,会使整个画面完全不同.
      程序启动后,会随机生成不同的图形,点击鼠标或按下键盘任意按键会自动退出.使用鼠标滚轮滚动进行图形切换.我的博客头像就是用这个软件生成的.

下载地址:

http://files.cnblogs.com/WhyEngine/LineFlower%E5%B1%8F%E4%BF%9D.zip

图形生成算法代码:

 void        CLineFlowerSPEntity::Reset()
{
m_nFinishTime = ;
m_nVerticesNum = ;
m_nPlayVertices = ; UINT width;
UINT height;
m_pDX9Render->GetBackBufferSize(width, height); Vector2 vScreenCenter(width*0.5f, height*0.5f); Yreal screenCircleRadius = width < height ? width*0.5f : height*0.5f;
if (screenCircleRadius < 10.0f)
{
return;
} Yreal rotateCircleRadius = yf_rand_real(screenCircleRadius - 128.0f);
Yreal fixCircleRadius = screenCircleRadius - rotateCircleRadius;
Yreal offset = yf_rand_real(64.0f, screenCircleRadius - 10.0f);
if (yf_rand_bool())
{
offset = -offset;
} Yreal stepScale0 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
stepScale0 = 1.0f / stepScale0;
}
Yreal stepScale180 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
stepScale180 = 1.0f / stepScale180;
} Yreal offsetScale0 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
offsetScale0 = 1.0f / offsetScale0;
}
Yreal offsetScale180 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
offsetScale180 = 1.0f / offsetScale180;
} Yreal maxOffset = (offsetScale180 > offsetScale0) ? offsetScale180 : offsetScale0;
maxOffset *= fabs(offset);
Yreal posScale = screenCircleRadius / (fixCircleRadius + maxOffset);
posScale *= 0.95f; Yreal scale0 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
scale0 = 1.0f / scale0;
}
Yreal scale180 = yf_rand_real(0.1f, 1.0f);
if (yf_rand_bool())
{
scale180 = 1.0f / scale0;
} Yreal step = screenCircleRadius / rotateCircleRadius;
if (step > 360.0f)
{
return;
} m_nCirclesCount = YD_MAX_CIRCLES_COUNT;
m_nVerticesNum = m_nCirclesCount * ; Vector2 vCenter;
Yreal degree = ; Vector2 vPos;
Vector2 vPos0;
Vector2 vPos1;
Yuint index;
Yreal r, a;
Yreal scale; RhwVertex* vb;
m_pVB->Lock(, , (void**)&vb, ); for (Yuint i = ; i < m_nCirclesCount; i++)
{
for (Yuint j = ; j < ; j++)
{
vCenter.x = vScreenCenter.x + fixCircleRadius*m_listSinValues[j];
vCenter.y = vScreenCenter.y + fixCircleRadius*m_listCosValues[j]; r = fabsf(degree - 180.0f) / 180.0f;
scale = yf_lerp(offsetScale0, offsetScale180, r); index = (Yint)degree;
vPos0.x = vCenter.x - offset*scale*m_listSinValues[index];
vPos0.y = vCenter.y - offset*scale*m_listCosValues[index]; vPos1.x = vCenter.x - offset*scale*m_listSinValues[index + ];
vPos1.y = vCenter.y - offset*scale*m_listCosValues[index + ]; a = degree - index;
vPos = vPos0*(1.0f - a) + vPos1*a;
vPos.x = posScale*(vScreenCenter.x - vPos.x) + vScreenCenter.x;
vPos.y = posScale*(vScreenCenter.y - vPos.y) + vScreenCenter.y; vb[i* + j].Set(vPos.x, vPos.y, 0.0f, 1.0f); scale = yf_lerp(stepScale0, stepScale180, r);
degree += step*scale;
degree = fmodf(degree, 360.0f);
} if (degree < YD_DEGREE_MAX_ERROR || degree > 360.0f - YD_DEGREE_MAX_ERROR)
{
m_nCirclesCount = i + ;
m_nVerticesNum = m_nCirclesCount * ;
vb[m_nVerticesNum] = vb[];
m_nVerticesNum++;
break;
}
} m_pVB->Unlock();
}

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

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

屏保:画线圈LineFlower的更多相关文章

  1. WhyDemo: 画线圈LineFlower

    画线圈LineFlower 刚发过画线圈的屏保程序,现在发一下它的可编辑版本.可以对线圈的相关参数进行设置.      小时候玩过一种画线圈的玩具,将一个圆形齿轮在一个大圈里转,会画出各种图形来.这个 ...

  2. 3D屏保: 线圈

    LineFlower3DSP 一个3D屏保程序,算法的原理类似于圆内轮旋线的生成. 下载地址: http://files.cnblogs.com/WhyEngine/LineFlower3D_sp.z ...

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

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

  4. python写的屏保程序

    __author__ = 'ChenYan' from random import randint from tkinter import * class Randball(): def __init ...

  5. Tkinter 项目-屏保

    参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...

  6. python实现屏保计时器

    什么都不说先上图吧,Python 初学者实现屏保计时器 原理:利用 Python turtle 库实现快速画图,每隔一秒钟擦除屏幕,然后获得电脑实时时间,再次画图,呈现动态时间. 关于数字如果画,可以 ...

  7. Python---TKinter项目实战---屏保

    ### 项目分析 - 屏保可以自己启动,也可以手动启动 - 一旦敲击键盘或者移动鼠标后,或者其他的引发时间,则停止 - 如果屏保是一幅画的话,则没有画框 - 图像的动作是随机的,具有随机性,可能包括颜 ...

  8. C#制作简易屏保

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

  9. 仿W8屏保

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. 【知了堂学习笔记】java 编写几种常见排序算法2

    排序的分类: 1.直接选择排序 它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~ ...

  2. Linux安装系统选择 日报 18/06/23

    Linux安装系统选择 Centos7 程序体积7个G,如果是学习伊始, 注意不要选择那个体积小的,因为我装过之后进去发现这个wifie还要自己进行一些烈的命令才能连接成功.很麻烦的. 安装比较顺利但 ...

  3. 01-学前入门VS各个组成部分

    1)快捷打开运行窗口(Windows+R) 里面输入devenv命令快捷打开VS 2)解决方案,项目及类之间的关系(解决方案包含项目-项目包含-类) 例如可以这样比喻: 解决方案:相当于公司 项目:相 ...

  4. Git 初学者使用指南及Git 资源整理

    Git 资源整理 Git is a free and open source distributed version control system designed to handle everyth ...

  5. 洛谷P2657 Loj10165 SCOI2009 windy数

    题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输 ...

  6. UVALive 5058 Counting BST 数学

    B - Counting BST Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit S ...

  7. Java_JSP自定义标签的开发与应用

    在JSTL提供了四个标签库(核心标签库.国际化标签库.数据库标签库和XML标签库),涉及到了几十个标签.虽然这些标签可以完成比较复杂的工作,但它们仍然无法满足程序中的特殊需求.因此,就需要用户根据自己 ...

  8. 三个实例演示 Java Thread Dump 日志分析(转)

    原文链接:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html 转来当笔记^_^ jstack Dump ...

  9. CentOS 7挂载磁盘提示: mount: unknown filesystem type 'LVM2_member'

    说明:CentOS 7采用新的分区格式xfs以及LVM的模式,造成挂载硬盘的方式有变化. 解决: 使用lvdisplay命令查看LVM最终的卷路径,然后再进行挂载. 比如: mount /dev/Vo ...

  10. [Dynamic Language] Python非子包引用

    Python非子包引用 python的搜索路径其实是一个列表(sys.path) 导入模块时python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功. 在项目中如果要引用 ...