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. PHP模板引擎,Smarty定义

    PHP模板引擎:PHP是一种HTML内嵌式的在服务器端执行的脚本语言.初始的开发模板就是混合 层的数据编程,虽然通过MVC的设计模式可以实现将程序的应用逻辑与网页的呈现逻辑强制 分离,但也只是将程序的 ...

  2. Java 中的异常处理机制

    生活中的异常:  不能够完整而顺利的完成一些工作 根据不同的异常进行相应的处理,而不会就此终端我们的生活 引出:  异常处理: 方式:  1.选择结构(逻辑判断)避免 demo:if逻辑处理异常 im ...

  3. 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]

    请尊重原贴作者 与 本贴楼主.原作者把自己丰富的经验分享给了大家,本贴作者每个贴子平均花了3个小时翻译.      所以,转载请注明出处:原贴地址:http://www.tonymacx86.com/ ...

  4. [leetcode DP]91. Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  5. Django MiddleWare初识

    一.Django 中间件介绍 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定 ...

  6. SKLearn数据集API(一)

    注:本文是人工智能研究网的学习笔记 数据集一览 类型 获取方式 自带的小数据集 sklearn.datasets.load_ 在线下载的数据集 sklearn.datasets.fetch_ 计算机生 ...

  7. Centos 安装 Wireshark

    Wireshark是一款数据包识别软件,应用很广泛. yum install wireshark yum install wireshark-gnome

  8. QT学习笔记6:常见的 QGraphicsItem

    简述 QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类. 它提供了一个轻量级的基础,用于编写自定义 item.其中包括:定义 item 的几何形状.碰撞检测.绘 ...

  9. BZOJ3589动态树

    **错误改了一上午. 先做熟练泼粪 k<=5,因此我们可以模拟这个过程,在线段树上把标记建出来然后pushup时候更新就好了. By:大奕哥 #include<bits/stdc++.h& ...

  10. Siege(开源Web压力测试工具)——多线程编程最佳实例

    在英语中,"Siege"意为围攻.包围.同时Siege也是一款使用纯C语言编写的开源WEB压测工具,适合在GNU/Linux上运行,并且具有较强的可移植性.之所以说它是多线程编程的 ...