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. C#导出HTML到PDF组件Pechkin

    http://www.knowsky.com/898441.html C#导出PDF功能是开发中经常遇到的功能,我们采用第三方的组件,比如 iTextSharp, aspose等,还能搜到一些开源的类 ...

  2. React Native踩坑之FlatList组件中的onEndReached

    最近在做一个RN项目,有使用到FlatList这样一个RN封装的组件去做上拉加载更多功能,在iOS和Android平台上,总结了以下几个遇到的问题及解决方案 1. 进入页面onReached开始就被触 ...

  3. JAVA内存泄漏解决办法

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  4. leetcode 链表 两数相加

     两数相加     给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...

  5. java多线程技术之(callable和future)

    接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. Callable接口类似于Runnable,从名字就可以看出来了,但是Runnab ...

  6. 【洛谷】2120:[ZJOI2007]仓库建设【斜率优化DP】

    P2120 [ZJOI2007]仓库建设 题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工 ...

  7. [转]Android使用Application总结

        目录(?)[+]   Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里 ...

  8. HDU 4267 A Simple Problem with Integers 多个树状数组

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. js取float型小数点后x位数的方法

    js中取小数点后两位方法最常用的就是四舍五入函数了,前面我介绍过js中四舍五入一此常用函数,这里正好用上,下面我们一起来看取float型小数点后两位一些方法总结 以下我们将为大家介绍 JavaScri ...

  10. 【转 记录】python中的encode以及decode

    字符串编码常用类型:utf-8,gb2312,cp936,gbk等. python中,我们使用decode()和encode()来进行解码和编码 在python中,使用unicode类型作为编码的基础 ...