在oschina上看到了用c写的红玫瑰, 以前只见过用js写的, 就随手用delphi翻译了c的代码, 效果还不错哈....

原c作者jokeym贴子 http://www.oschina.net/code/snippet_2373787_48760

我的改版贴子 http://www.oschina.net/code/snippet_212659_48907

以下为代码:

  1. unit Unit1;
  2. interface
  3. uses
  4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  5. Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
  6. type
  7. TForm1 = class(TForm)
  8. btn1: TButton;
  9. procedure btn1Click(Sender: TObject);
  10. private
  11. public
  12. { Public declarations }
  13. end;
  14. var
  15. Form1: TForm1;
  16. implementation
  17. {$R *.dfm}
  18. uses
  19. System.Math;
  20. // 原作者贴子,
  21. // http://www.oschina.net/code/snippet_2373787_48760
  22. // delphi版本
  23. // ying32
  24. const
  25. RAND_MAX = $7FFF;
  26. urosesize: Integer = 500;
  27. uh: Integer = -250;
  28. type
  29. // 定义结构体
  30. TDOT = record
  31. x: Double;
  32. y: Double;
  33. z: Double;
  34. r: Double;  // 红色
  35. g: double;  // 绿色
  36. // b(蓝色) 通过 r 计算
  37. end;
  38. function calc(a, b, c: Double; var d: TDOT): Boolean;
  39. var
  40. j, n, o, w, z: Double;
  41. _A, _B: Double;
  42. begin
  43. Result := False;
  44. if c > 60 then // 花柄
  45. begin
  46. d.x := sin(a * 7) * (13 + 5 / (0.2 + power(b * 4, 4))) - sin(b) * 50;
  47. d.y := b * urosesize + 50;
  48. d.z := 625 + cos(a * 7) * (13 + 5 / (0.2 + power(b * 4, 4))) + b * 400;
  49. d.r := a * 1 - b / 2;
  50. d.g := a;
  51. Exit(True);
  52. end;
  53. _A := a * 2 - 1;
  54. _B := b * 2 - 1;
  55. if _A * _A + _B * _B < 1 then
  56. begin
  57. if c > 37 then           // 叶
  58. begin
  59. j := Trunc(c) and 1;
  60. n := IfThen(j <> 0, 6, 4);
  61. o := 0.5 / (a + 0.01) + cos(b * 125) * 3 - a * 300;
  62. w := b * uh;
  63. d.x := o * cos(n) + w * sin(n) + j * 610 - 390;
  64. d.y := o * sin(n) - w * cos(n) + 550 - j * 350;
  65. d.z := 1180 + cos(_B + _A) * 99 - j * 300;
  66. 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);
  67. d.g := o / 1000 + 0.7 - o * w * 0.000003;
  68. Exit(True);
  69. end;
  70. if c > 32 then           // 花萼
  71. begin
  72. c := c * 1.16 - 0.15;
  73. o := a * 45 - 20;
  74. w := b * b * uh;
  75. z := o * sin(c) + w * cos(c) + 620;
  76. d.x := o * cos(c) - w * sin(c);
  77. d.y := 28 + cos(_B * 0.5) * 99 - b * b * b * 60 - z / 2 - uh;
  78. d.z := z;
  79. d.r := (b * b * 0.3 + power((1 - (_A * _A)), 7) * 0.15 + 0.3) * b;
  80. d.g := b * 0.7;
  81. Exit(True);
  82. end;
  83. // 花
  84. o := _A * (2 - b) * (80 - c * 2);
  85. w := 99 - cos(_A) * 120 - cos(b) * (-uh - c * 4.9) + cos(power(1 - b, 7)) * 50 + c * 2;
  86. z := o * sin(c) + w * cos(c) + 700;
  87. d.x := o * cos(c) - w * sin(c);
  88. d.y := _B * 99 - cos(power(b, 7)) * 50 - c / 3 - z / 1.35 + 450;
  89. d.z := z;
  90. d.r := (1 - b / 1.2) * 0.9 + a * 0.1;
  91. d.g := power((1 - b), 20) / 4 + 0.05;
  92. Exit(True);
  93. end;
  94. end;
  95. procedure TForm1.btn1Click(Sender: TObject);
  96. var
  97. zBuffer: array of Smallint;
  98. i, j: Integer;
  99. x, y, z, zBufferIndex: Integer;
  100. dot: TDOT;
  101. r, g, b: Integer;
  102. begin
  103. SetLength(zBuffer, urosesize * urosesize);
  104. Canvas.Brush.Color := clWhite;
  105. Canvas.FillRect(Rect(0, 0, Width, Height));
  106. Randomize;
  107. for j := 0 to 1999 do
  108. begin
  109. for i := 0 to 9999 do
  110. begin
  111. if calc(Random(RAND_MAX) / RAND_MAX, Random(RAND_MAX) / RAND_MAX, (Random(RAND_MAX) mod 46) / 0.74, dot) then
  112. begin
  113. z := Trunc(dot.z + 0.5);
  114. x := Trunc(dot.x * urosesize / z - uh + 0.5);
  115. y := Trunc(dot.y * urosesize / z - uh + 0.5);
  116. if y >= urosesize then
  117. Continue;
  118. zBufferIndex := y * urosesize + x;
  119. if (not (zBuffer[zBufferIndex] <> 0)) or (zBuffer[zBufferIndex] > z) then
  120. begin
  121. zBuffer[zBufferIndex] := z;
  122. // 画点
  123. r := not Trunc(dot.r * uh);
  124. if r < 0 then
  125. r := 0;
  126. if r > 255 then
  127. r := 255;
  128. g := not Trunc(dot.g * uh);
  129. if g < 0 then
  130. g := 0;
  131. if g > 255 then
  132. g := 255;
  133. b := not Trunc(dot.r * dot.r *  - 80);
  134. if b < 0 then
  135. b := 0;
  136. if b > 255 then
  137. b := 255;
  138. Canvas.Pixels[x + 50, y - 20] := RGB(r, g, b);
  139. end;
  140. end;
  141. Application.ProcessMessages;
  142. end;
  143. Sleep(1);
  144. end;
  145. end;
  146. end.

http://blog.csdn.net/zyjying520/article/details/46592831

情人节红攻瑰--Delphi版本的更多相关文章

  1. "如何用70行Java代码实现深度神经网络算法" 的delphi版本

     http://blog.csdn.net/hustjoyboy/article/details/50721535 "如何用70行Java代码实现深度神经网络算法" 的delphi ...

  2. 我所改造的JSocket适用于任何DELPHI版本

    JSOCKET是异步选择模式的通信控件,简单而强大,传奇的早期版本就是使用它作通信. { ******************************************************* ...

  3. delphi版本修改PE头源码

    //VC++6外衣 1 OEPCODEFIVE: THEAD = ($55, $8B, $EC, $6A, $FF, $68, $00, $00, $00, $00, $68, $00, $00, $ ...

  4. Delphi 版本信息获取函数 GetFileVersionInfo、GetFileVersionInfoSize、VerFindFile、VerInstallFile和VerQueryValue

    一.版本信息获取函数简介和作用 获取文件版本信息的作用: 1. 避免在新版本的组件上安装旧版本的相同组件: 2. 在多语言系统环境中,操作系统根据文件版本信息里提供的语言信息在启动程序时决定使用的正确 ...

  5. Delphi版本顺序

    1.02.03.04.05.06.07.08.0200520062007 现在应该又出新的版本了

  6. 以前的 Delphi版本

                    Delphi 1 Delphi 2 Delphi 3 Delphi 4 Delphi 5 Delphi 6 Delphi 7 Delphi 8 Delphi 2005

  7. delphi版本对应

    delphi 7 delphi 8delphi 2005 ----- 9delphi 2006 ----- 10 delphi 2007 ----- 11delphi 2009 ----- 12 de ...

  8. 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)

    很幽默的讲解六种Socket IO模型(转)本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...

  9. Delphi Xe2 后的版本如何让Delphi程序启动自动“以管理员身份运行"

    由于Vista以后win中加入的UAC安全机制,采用Delphi开发的程序如果不右键点击“以管理员身份运行”,则会报错. 在XE2以上的Delphi版本处理这个问题已经非常简单了. 右建点击工程,选择 ...

随机推荐

  1. javascript 中的 call

    Javascript中call的使用 Javascript中call的使用自己感觉蛮纠结的,根据文档很好理解,其实很难确定你是否真正的理解. call 方法应用于:Function 对象调用一个对象的 ...

  2. 浅谈css中的position属性

    我觉得吧,css如果不考虑浏览器的兼容问题的话,最让人头疼的应该就是position了,反正我是这么觉得的,为了能基本上搞清楚position的几种情况,我找了一些资料,做了一个小实验,下面是实验的过 ...

  3. makefile --文件文档经链接使用

    生成.a 文件是什么? 在makefile的设置使得文件文档可以方便的使用,不用特意的加某些头文件 加入某些产生的链接包

  4. bzoj 1023: [SHOI2008]cactus仙人掌图

    这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...

  5. java-多线程-join函数

    join()>>不带参数 线程A调用线程B.join,意思就是线程A并入了线程B,当执行完线程B,再去执行线程A后续动作 join(int keepTims)>>带参数,与上面 ...

  6. C++ 读取 pcap文件.

    http://blog.csdn.net/haolipengzhanshen/article/details/51854853 1.了解下pcap文件的结构 2.定义pcap文件头部结构体pcapFi ...

  7. hadoop下跑mapreduce程序报错

    mapreduce真的是门学问,遇到的问题逼着我把它从MRv1摸索到MRv2,从年前就牵挂在心里,连过年回家的旅途上都是心情凝重,今天终于在eclipse控制台看到了job completed suc ...

  8. YII千万级PV架构经验分享--俯瞰篇--性能介绍

    一张图,啥也不说了.直接上图,大图真难画. 呃,非得写满二百个字,其实本来想画均衡负债,一些服务器假设列子的,突然发现,没有业务要求,画不出来.写了这么久了,天天熬夜,得休息几天再继续.其实还有非常重 ...

  9. YII千万级PV架构经验分享--俯瞰篇--业务扩展演变

    hello,大家好,我是方少,世上不如意事十有八九吧,即使你感到很满意,也有人感觉太差了,总得感觉我们技术人员都是一个人在战斗,感情却是最深的,一起吃过苦才难忘吧.娇妻艳女,你失意了会和你一起吃苦吗? ...

  10. CentOS 下 Codeblocks 的 安装 + 汉化 以及 基本使用介绍

    Codeblocks 安装 注:在root用户下运行下列命令 1.安装gcc,需要c和c++两部分,默认安装下,CentOS不安装编译器的,在终端输入以下命令即可 yum install gcc yu ...