屏保:画线圈LineFlower
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的更多相关文章
- WhyDemo: 画线圈LineFlower
画线圈LineFlower 刚发过画线圈的屏保程序,现在发一下它的可编辑版本.可以对线圈的相关参数进行设置. 小时候玩过一种画线圈的玩具,将一个圆形齿轮在一个大圈里转,会画出各种图形来.这个 ...
- 3D屏保: 线圈
LineFlower3DSP 一个3D屏保程序,算法的原理类似于圆内轮旋线的生成. 下载地址: http://files.cnblogs.com/WhyEngine/LineFlower3D_sp.z ...
- 一个仿windows泡泡屏保的实现
一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...
- python写的屏保程序
__author__ = 'ChenYan' from random import randint from tkinter import * class Randball(): def __init ...
- Tkinter 项目-屏保
参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...
- python实现屏保计时器
什么都不说先上图吧,Python 初学者实现屏保计时器 原理:利用 Python turtle 库实现快速画图,每隔一秒钟擦除屏幕,然后获得电脑实时时间,再次画图,呈现动态时间. 关于数字如果画,可以 ...
- Python---TKinter项目实战---屏保
### 项目分析 - 屏保可以自己启动,也可以手动启动 - 一旦敲击键盘或者移动鼠标后,或者其他的引发时间,则停止 - 如果屏保是一幅画的话,则没有画框 - 图像的动作是随机的,具有随机性,可能包括颜 ...
- C#制作简易屏保
前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...
- 仿W8屏保
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- STM32 串口通信
1. 中断说明 TXE(Tansmit Data Register empty interrupt) - 发送数据寄存器空,产生中断.当使能TXE后,只要Tx DR空了,就会产生中断.---写寄存器D ...
- 1006 Sign In and Sign Out (25)(25 point(s))
problem At the beginning of every day, the first person who signs in the computer room will unlock t ...
- 【BZOJ 3456】城市规划
http://www.lydsy.com/JudgeOnline/problem.php?id=3456 设\(f(n)\)表示n个点有标号无向连通图的数目. dp:\(f(n)=2^{n\choos ...
- [BZOJ1815&BZOJ1488]有色图/图的同构(Polya定理)
由于有很多本质相同的重复置换,我们先枚举各种长度的点循环分别有多少个,这个暴搜的复杂度不大,n=53时也只有3e5左右.对于每种搜索方案可以轻易求出它所代表的置换具体有多少个. 但我们搜索的是点置换组 ...
- 处理QMenu的triggered信号时遇到的一个问题
最近,在一个Qt程序中使用QMenu类时,遇到了一个小问题,特记录下.首先,我模仿一下问题出现的场景:假设我在做一个高大上的XX管理系统,比如说:学生信息管理系统.在这个系统中,学生的各项信息(比如: ...
- spring boot2集成ES详解
一:运行环境 JDK:1.8 ES:5.6.4 二:学习内容 如何构建spring-data-elasticsearch环境? 如何实现常用的增删改查? 如何实现对象嵌套也就是1对多这种关系? 三:J ...
- Codeforces Round #222 (Div. 1) B. Preparing for the Contest 二分+线段树
B. Preparing for the Contest 题目连接: http://codeforces.com/contest/377/problem/B Description Soon ther ...
- Codecademy python
#1 print "Welcome to Python!" #2 my_variable = #3 # Set the variables to the values listed ...
- centos 6.5安装rvm 配置 Ruby开发环境
我是用ruby写测试脚本用 安装rvm也是费了好大劲 英文不易看懂 ,是个硬伤! rvm是ruby的版本管理工具 还可对ruby进行 安装 卸载 等 1.安装 curl # sudo yum ...
- Android WebView H5开发拾遗
上篇介绍了一些WebView的设置,本篇为一些补充项. 首先加载HTML5的页面时,会出现页面空白的现象,原因是需要开启 DOM storage API 功能: webSettings.setDomS ...