3D屏保: 线圈
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屏保: 线圈的更多相关文章
- 3D屏保:排色榜
3D屏保:排色榜 排色榜,是一个针对图形学中的色彩进行排序的DEMO,这里的色是色彩的意思,看成别的点进来的同学请自觉面壁.该DEMO可以按RGB,GBR,BRG,灰度值四种方式进行排序.排序算法为冒 ...
- 3D屏保:N皇后
前几天园子里有人发表关于8皇后的算法.只有代码,没有能运行的DEMO多枯燥.于是我这两天抽时间写了个N皇后的屏保程序.程序启动后会从4皇后到14皇后显示其所有排列,每隔0.5秒自动切换一次.按下空格键 ...
- 3D屏保: 彩色盘子
一个彩色盘子的屏保 记得小时候在电视上看过一个科普节目,由多个颜色组成的盘子,如果快速旋转起来,会看上去是白色的.于是我就写了这个屏保程序,但发现在计算机上模拟并不是这样的. "RollPl ...
- 3D屏保:魔方2.0版本
一个三维魔方的屏保软件,可支持2级到72级的魔方.启动后魔方会自动旋转,并最终回到初始状态.有很多人问我这是怎么做到的,用的什么解魔方的算法,其实我自己根本就不会玩魔方,别人用技巧解魔方,我这程序中用 ...
- 3D屏保程序:汉诺塔
学过程序的人一定记得汉诺塔.我们学的第一个程序是HelloWorld,而碰到的第一个坑就是汉诺塔,短短十几行代码,不知花费了多少时间精力去理解.我记得当年的开发环境还是蓝屏的,汉诺塔程序的输出还是一行 ...
- html5 canvas 3d屏保 源码
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- 屏保:画线圈LineFlower
LineFlowerSP 小时候玩过一种画线圈的玩具,将一个圆形齿轮在一个大圈里转,会画出各种图形来.这个程序就是模仿它做的.算法原理:将一个圆围绕着另一个大圆公转,并且它还做自转运动.那么圆内一点的 ...
- C#制作简易屏保
前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...
- 一个仿windows泡泡屏保的实现
一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...
随机推荐
- Servlet的一点小结
1.什么是servlet servlet是一个Java applet,一个帮助程序.用于帮助浏览器从服务器中获取资源.浏览器-servlet-服务器三者的关系如图所示. 2.servlet的生命周期 ...
- kafka和springboot整合应用
加载依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>s ...
- python 与 mongodb的交互
- 02-c#基础之01-基础语法(一)
1.注释符 1)注销 2) 解释 2.C#中的3种注释符 1)单行注释// 2)多行注释/*要注释的内容*/ 3)文档注释///多用来解释类或者方法 2.VS中的快捷键
- 【推导】The 16th UESTC Programming Contest Preliminary L - Foxtrot
题意:有n瓶药剂,其中只有一瓶药剂有毒.让你用最少的小白鼠试出哪瓶有毒.你只有一次给任意只小白鼠各喂食任意种类药剂的机会. m只老鼠就能对应2^m种“生死状态”的组合,给每种状态分配一个种类的药剂,然 ...
- Mac OS下不产生.DS_Store 隐藏文件和清理.DS_Store的方法
一.清理.DS_Store的方法 1. 打开终端 (Macintosh HD > Applications > Utilities > Terminal)2. 输入命令: " ...
- 每一个JavaScript开发者应该了解的浮点知识
在JavaScript开发者的开发生涯中的某些点,总会遇到奇怪的BUG——看似基础的数学问题,但却又觉得有些不对劲.总有一天,你会被告知JavaScript中的数字实际上是浮点数.试图了解浮点数和为什 ...
- .NET面试宝典-高级2
http://blog.csdn.net/shanyongxu/article/category/6023593 对于 Web 性能优化,您有哪些了解和经验吗? 1.前端优化 (1)减少 HTTP 请 ...
- Android App的签名
Andriod应用程序如果要在手机或模拟器上安装,必须要有签名! 签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序, 我 ...
- 预装Windows 8系统机型如何进行一键恢复
http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20131119141246845.html