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#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...
随机推荐
- linux中shell,awk,sed截取字符串方法总结
转自:http://www.cnblogs.com/kinga/p/5772566.html Shell 第一种: ${parameter%word} 最小限度从后面截掉word${parameter ...
- JAVAEE——宜立方商城09:Activemq整合spring的应用场景、添加商品同步索引库、商品详情页面动态展示与使用缓存
1. 学习计划 1.Activemq整合spring的应用场景 2.添加商品同步索引库 3.商品详情页面动态展示 4.展示详情页面使用缓存 2. Activemq整合spring 2.1. 使用方法 ...
- 让Xcode8.0支持iOS11.2设备真机测试
最新支持11.2 (15C5097c)! 11.1 全版本! Xcode只可以支持iPhone手机对应iOS系统以下的真机测试.一般想要支持最新的iPhone手机系统,有两个方法. 第一.就需要更新X ...
- python2和python3同时安装
现在很多项目用python2完成的,很多情况下2和3是同时存在的 大多人都是先安装了python2 安装python3: 下一步: 然后安装完成以后,去cmd控制台输入python看看安装成功了吗(用 ...
- gpfs 内核错误
centos7.3安装旧的GPFS引发内核错误 没有关闭之前是可以查看到smap cat /proc/cpuinfo | grep smap 系统层关闭,也可以正常使用gpfs grubby --up ...
- python opencv3 cornerHarris 角点检测
git:https://github.com/linyi0604/Computer-Vision 角点也是处在一个无论框框往哪边移动 框框内像素值都会变化很大的情况而定下来的点 如果框框水平方向上移动 ...
- 安卓手机安装 Charles 证书
1: 在 Charles 工具栏里点击 Help --- SSL Proxying --- Save Charles Root Certificate,生成 后缀名是 .cer 的文件, 然后上传到 ...
- HDU 4641 K-string 后缀自动机 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4641 https://blog.csdn.net/asdfgh0308/article/details/4096 ...
- BZOJ 1975: [Sdoi2010]魔法猪学院 大水题 第k短路 spfa
https://www.lydsy.com/JudgeOnline/problem.php?id=1975 我好像到现在了第k短路都不会写,mdzz. 先spfa求出最短路,然后扫点存各种前置路径已经 ...
- vijos p1883
题意: 有些东西就如同月光的魔法一般. Luke是爱着vijos的.他想为自己心爱的东西画些什么. 就画N个圆吧.把它们的圆心都固定在x轴上. 圆与圆.为了爱,两两不能相交.为了爱,它们可以互相贴在一 ...