情人节红攻瑰--Delphi版本
在oschina上看到了用c写的红玫瑰, 以前只见过用js写的, 就随手用delphi翻译了c的代码, 效果还不错哈....
原c作者jokeym贴子 http://www.oschina.net/code/snippet_2373787_48760
我的改版贴子 http://www.oschina.net/code/snippet_212659_48907
以下为代码:
- unit Unit1;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
- Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
- type
- TForm1 = class(TForm)
- btn1: TButton;
- procedure btn1Click(Sender: TObject);
- private
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- uses
- System.Math;
- // 原作者贴子,
- // http://www.oschina.net/code/snippet_2373787_48760
- // delphi版本
- // ying32
- const
- RAND_MAX = $7FFF;
- urosesize: Integer = 500;
- uh: Integer = -250;
- type
- // 定义结构体
- TDOT = record
- x: Double;
- y: Double;
- z: Double;
- r: Double; // 红色
- g: double; // 绿色
- // b(蓝色) 通过 r 计算
- end;
- function calc(a, b, c: Double; var d: TDOT): Boolean;
- var
- j, n, o, w, z: Double;
- _A, _B: Double;
- begin
- Result := False;
- if c > 60 then // 花柄
- begin
- d.x := sin(a * 7) * (13 + 5 / (0.2 + power(b * 4, 4))) - sin(b) * 50;
- d.y := b * urosesize + 50;
- d.z := 625 + cos(a * 7) * (13 + 5 / (0.2 + power(b * 4, 4))) + b * 400;
- d.r := a * 1 - b / 2;
- d.g := a;
- Exit(True);
- end;
- _A := a * 2 - 1;
- _B := b * 2 - 1;
- if _A * _A + _B * _B < 1 then
- begin
- if c > 37 then // 叶
- begin
- j := Trunc(c) and 1;
- n := IfThen(j <> 0, 6, 4);
- o := 0.5 / (a + 0.01) + cos(b * 125) * 3 - a * 300;
- w := b * uh;
- d.x := o * cos(n) + w * sin(n) + j * 610 - 390;
- d.y := o * sin(n) - w * cos(n) + 550 - j * 350;
- d.z := 1180 + cos(_B + _A) * 99 - j * 300;
- d.r := 0.4 - a * 0.1 + power(1 - _B * _B, -uh * 6) * 0.15 - a * b * 0.4 + cos(a + b) / 5 + power(cos((o * (a + 1) + IfThen(_B > 0, w, -w)) / 25), 30) * 0.1 * (1 - _B * _B);
- d.g := o / 1000 + 0.7 - o * w * 0.000003;
- Exit(True);
- end;
- if c > 32 then // 花萼
- begin
- c := c * 1.16 - 0.15;
- o := a * 45 - 20;
- w := b * b * uh;
- z := o * sin(c) + w * cos(c) + 620;
- d.x := o * cos(c) - w * sin(c);
- d.y := 28 + cos(_B * 0.5) * 99 - b * b * b * 60 - z / 2 - uh;
- d.z := z;
- d.r := (b * b * 0.3 + power((1 - (_A * _A)), 7) * 0.15 + 0.3) * b;
- d.g := b * 0.7;
- Exit(True);
- end;
- // 花
- o := _A * (2 - b) * (80 - c * 2);
- w := 99 - cos(_A) * 120 - cos(b) * (-uh - c * 4.9) + cos(power(1 - b, 7)) * 50 + c * 2;
- z := o * sin(c) + w * cos(c) + 700;
- d.x := o * cos(c) - w * sin(c);
- d.y := _B * 99 - cos(power(b, 7)) * 50 - c / 3 - z / 1.35 + 450;
- d.z := z;
- d.r := (1 - b / 1.2) * 0.9 + a * 0.1;
- d.g := power((1 - b), 20) / 4 + 0.05;
- Exit(True);
- end;
- end;
- procedure TForm1.btn1Click(Sender: TObject);
- var
- zBuffer: array of Smallint;
- i, j: Integer;
- x, y, z, zBufferIndex: Integer;
- dot: TDOT;
- r, g, b: Integer;
- begin
- SetLength(zBuffer, urosesize * urosesize);
- Canvas.Brush.Color := clWhite;
- Canvas.FillRect(Rect(0, 0, Width, Height));
- Randomize;
- for j := 0 to 1999 do
- begin
- for i := 0 to 9999 do
- begin
- if calc(Random(RAND_MAX) / RAND_MAX, Random(RAND_MAX) / RAND_MAX, (Random(RAND_MAX) mod 46) / 0.74, dot) then
- begin
- z := Trunc(dot.z + 0.5);
- x := Trunc(dot.x * urosesize / z - uh + 0.5);
- y := Trunc(dot.y * urosesize / z - uh + 0.5);
- if y >= urosesize then
- Continue;
- zBufferIndex := y * urosesize + x;
- if (not (zBuffer[zBufferIndex] <> 0)) or (zBuffer[zBufferIndex] > z) then
- begin
- zBuffer[zBufferIndex] := z;
- // 画点
- r := not Trunc(dot.r * uh);
- if r < 0 then
- r := 0;
- if r > 255 then
- r := 255;
- g := not Trunc(dot.g * uh);
- if g < 0 then
- g := 0;
- if g > 255 then
- g := 255;
- b := not Trunc(dot.r * dot.r * - 80);
- if b < 0 then
- b := 0;
- if b > 255 then
- b := 255;
- Canvas.Pixels[x + 50, y - 20] := RGB(r, g, b);
- end;
- end;
- Application.ProcessMessages;
- end;
- Sleep(1);
- end;
- end;
- end.
http://blog.csdn.net/zyjying520/article/details/46592831
情人节红攻瑰--Delphi版本的更多相关文章
- "如何用70行Java代码实现深度神经网络算法" 的delphi版本
http://blog.csdn.net/hustjoyboy/article/details/50721535 "如何用70行Java代码实现深度神经网络算法" 的delphi ...
- 我所改造的JSocket适用于任何DELPHI版本
JSOCKET是异步选择模式的通信控件,简单而强大,传奇的早期版本就是使用它作通信. { ******************************************************* ...
- delphi版本修改PE头源码
//VC++6外衣 1 OEPCODEFIVE: THEAD = ($55, $8B, $EC, $6A, $FF, $68, $00, $00, $00, $00, $68, $00, $00, $ ...
- Delphi 版本信息获取函数 GetFileVersionInfo、GetFileVersionInfoSize、VerFindFile、VerInstallFile和VerQueryValue
一.版本信息获取函数简介和作用 获取文件版本信息的作用: 1. 避免在新版本的组件上安装旧版本的相同组件: 2. 在多语言系统环境中,操作系统根据文件版本信息里提供的语言信息在启动程序时决定使用的正确 ...
- Delphi版本顺序
1.02.03.04.05.06.07.08.0200520062007 现在应该又出新的版本了
- 以前的 Delphi版本
Delphi 1 Delphi 2 Delphi 3 Delphi 4 Delphi 5 Delphi 6 Delphi 7 Delphi 8 Delphi 2005
- delphi版本对应
delphi 7 delphi 8delphi 2005 ----- 9delphi 2006 ----- 10 delphi 2007 ----- 11delphi 2009 ----- 12 de ...
- 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)
很幽默的讲解六种Socket IO模型(转)本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...
- Delphi Xe2 后的版本如何让Delphi程序启动自动“以管理员身份运行"
由于Vista以后win中加入的UAC安全机制,采用Delphi开发的程序如果不右键点击“以管理员身份运行”,则会报错. 在XE2以上的Delphi版本处理这个问题已经非常简单了. 右建点击工程,选择 ...
随机推荐
- spring @Resource和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- Emit
http://www.cnblogs.com/zhuweisky/archive/2008/09/20/1294666.html http://www.cnblogs.com/xiaoxiangfei ...
- 初试集群虚拟化搭建(二)—— Xen, kvm, OpenStack, VMware ESXi, Citrix XenServer等种种选择
小伙伴们找到了一些主流方案的资料,最终选择了XenServer6.5作为平台搭建. Xen 特点: 功能强大,支持Linux的各种发行版本 通常是在现有Linux操作系统上安装,是一种半虚拟化的安装方 ...
- Winform ComboBox控件高亮显示
//重绘下拉表单窗口,需要在窗口设计代码中加入下面这一句 this.cmdChannelName.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawF ...
- angular $q服务的用法
Promise是一种和callback有类似功能却更强大的异步处理模式,有多种实现模式方式,比如著名的Q还有JQuery的Deffered. 什么是Promise 以前了解过Ajax的都能体会到回调的 ...
- CentOS-6.5安装配置JDK-7|Tomcat-8
安装说明 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-x64.rpm 下载地址:http://www.oracle.com/technetwork/java/j ...
- 开始学习python
刚刚离开学校,到公司实习,发现所有的技术都是崭新的,所有的工具都是熟悉中带着陌生. 就像是孤身一人到了一个曾经只闻其名的偌大城市,看什么都觉得新鲜,做什么都心有畏惧.幸好 搞软件并没有那么多人情世故, ...
- 长安铃木经销商爬取(解析xml、post提交、python中使用js代码)
1.通过火狐浏览器,查找大长安铃木官网中关于经销商的信息主要在两个网页中 http://www.changansuzuki.com/khfw/xml/pro.xml 地域信息 http://www. ...
- 【转】perl如何避免脚本在windows中闪一下就关闭
写好了perl程序,运行后,准备等待结果输出时,结果双击后,看到屏幕闪了一下,然后什么都没有了,根本没有机会然你看到输出的结果 当你刚开始学习perl的时候,写好了程序,准备兴高采烈的等待结果输出时, ...
- OFBiz进阶之HelloWorld(二)创建热部署模块
参考文档 https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Tutorial+-+A+Beginners+Development+Guid ...