分形的概念看这里

这里用AS3实现一个动态绘制雪花图案的功能

你只要在界面用鼠标拖动,就会妙笔生雪花

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
/**
* 坐标平面上任意两点连成的线段都可以确定一个独一无二的雪花
* 方法是对每条线段进行特定的分形操作 *
* 具体做法就是将目标线段分成3段,并根据中间两个点(startPoint、endPoint)确定顶点(vertexPoint)
* 使得顶点与中间两个点构成等边三角形 *
* 而后再对上部生成的新的4个线段如此递归下去,就生成了部分(实际是三分之一)雪花图案
*
* @author 王海鹏 */
public class Main extends Sprite {private var first:Point;private var second:Point;private var third:Point;private var startPoint:Point;private var endPoint:Point;private var iterCount:uint = 4;public function Main():void {if (stage)init();elseaddEventListener(Event.ADDED_TO_STAGE, init);}private function getDist(pivot:Point, end:Point):Number {return Math.sqrt( (end.y-pivot.y)*(end.y-pivot.y) + (end.x-pivot.x)*(end.x-pivot.x) );}/*** 本算法的难点,涉及到较多数学知识;大部分人遇到这个问题时首先想到利用等边三角形的性质列方程组求解——我开始* 也是这么想的,但当我将方程式展开后,用y代表x的计算量吓退了我,另外一个让我放弃的原因是方程式求出的是两个* 顶点——它没有方向感-_-!* * 我的方法是利用简单的三角函数来求解,并且因为角度的是天生有方向的,这确保我在参数顺序正确的情况下,得到的顶点* 一定是位于想要的方向^-^* * 当然,在性能上,三角函数是不能和方程式比的。* * 最后,小心选择参数顺序!* @param   pivot 必须是第一个参数,它是起始边的旋转轴* @param    end 必须是第二个参数,它是起始边的末端* @return  vertexPoint 返回与起始边对应的顶点 */private function getVertex(pivot:Point, end:Point):Point {trace("起点坐标:" + pivot.x + "," + pivot.y + " 终点坐标:" + end.x + "," + end.y);//必须用atan2函数,这样就不用担心斜率是负值时,角度在第二象限?还是第四象限?var theta:Number = Math.atan2(end.y - pivot.y, end.x - pivot.x);var thetaAngle:Number = theta * 180 / Math.PI;trace("给定两点的转角:" + thetaAngle );var sumAngle:Number = theta + Math.PI/3;//var sumAngle:Number = theta - Math.PI / 3; 当向反方向旋转地话,就生成一个镂空的三角形-_-!trace("旋转后的边的转角:" + (thetaAngle - 60) );var dist:Number = getDist(pivot, end);trace("点0到点1的距离:" + dist );var vertex:Point = new Point();vertex.x = pivot.x + dist * Math.cos(sumAngle);vertex.y = pivot.y + dist * Math.sin(sumAngle);trace("x2 = " + vertex.x + " , y2 = " + vertex.y );trace("pivot到vertex的距离:" + getDist(pivot, vertex) );trace("end到vertex的距离:" + getDist(end, vertex) );return vertex;}/** * 获取位于给定线段1/3处的枢轴点* @param   first   给定线段的第一点* @param   second  给定线段的第二点* @return */private function getPivot(first:Point, second:Point):Point {return new Point(first.x+(second.x-first.x)/3, first.y+(second.y-first.y)/3);}/*** 获取位于给定线段2/3处的末端点* @param first   给定线段的第一点* @param   second  给定线段的第二点* @return */private function getEnd(first:Point, second:Point):Point {return new Point(first.x+(second.x-first.x)/3*2, first.y+(second.y-first.y)/3*2);}/** * 分形操作的递归代码 * * 想出先递归求解所有点再渲染绘制时,小人激动地拍了下手(自己的-_-!)* @param    first* @param  second* @param iter */private function draw(first:Point, second:Point, iter:uint):void {if (iter == 0) {this.graphics.lineStyle(1, 0xff0000);this.graphics.moveTo(first.x, first.y);             this.graphics.lineTo(second.x, second.y);return;}var pivot:Point = getPivot(first, second);var end:Point = getEnd(first, second);var vertex:Point = getVertex(pivot, end);draw(first, pivot, iter - 1);draw(pivot, vertex, iter - 1);draw(vertex, end, iter - 1);draw(end, second, iter - 1);}public function drawSonwflake(first:Point, second:Point, iter:uint):void {this.first = first;this.second = second;this.third = getVertex(first, second);draw(second, first, iter);draw(first, third, iter);draw(third, second, iter);}/** * 没什么可说的,纯粹演示用的代码 * @param    e */private function myDown(e:MouseEvent):void {this.startPoint = new Point(e.localX, e.localY);stage.addEventListener(MouseEvent.MOUSE_MOVE, myMove);}/** * 没什么可说的,纯粹演示用的代码* @param   e */private function myUp(e:MouseEvent):void {stage.removeEventListener(MouseEvent.MOUSE_MOVE, myMove);}/*** 没什么可说的,纯粹演示用的代码* @param    e */private function myMove(e:MouseEvent):void {this.graphics.clear();endPoint = new Point(e.localX, e.localY);drawSonwflake(startPoint, endPoint, iterCount);}/*** FlashDevelop给我自动生成的,Event.ADDED_TO_STAGE事件在某些情况下(比如模块加载)很有用* @param  e */private function init(e:Event = null):void {removeEventListener(Event.ADDED_TO_STAGE, init); // enry pointstage.addEventListener(MouseEvent.MOUSE_DOWN, myDown);stage.addEventListener(MouseEvent.MOUSE_UP, myUp) //drawSonwflake(new Point(200, 200), new Point(200, 400), 4);}
}

ps:除了代码框架是FlashDevelop IDE自动为我生成的,所有功能性的代码都是本人独立写的,没有参照任何别人(包括koch)的代码。

本代码的运行效果点这里查看

分形技术的一个简单示例——雪花图案(AS3实现)相关推荐

  1. java播放声音类和一个简单示例

    java播放声音类和一个简单示例 播放声音的类 复制代码 代码如下:  import java.io.File; import java.io.IOException; import javax.so ...

  2. Kerberos工作流:一个简单示例

    说明:内容来自<Hadoop安全-大数据平台隐私保护>,此处记录仅是便于快速回顾. 现在通过一个工作流示例,展示 Kerberos 大概是怎么工作的.首先定义所有出现的组件. EXAMPL ...

  3. java制作一个简单的画板_【Java】Thymeleaf一个简单示例

    Thymeleaf简单介绍 Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎 Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymeleaf和Freemar ...

  4. QTreeView使用总结1,一个简单示例

    1,简介 本文为一个最简单的QTreeView初始化过程的示例. 除去了一切操作响应等细节,只是展示使QTreeView显示出带层次结构的数据,至少需要哪些代码. 只附带了一点点常用设置项. 2,效果 ...

  5. IoC容器Autofac(2) - 一个简单示例(附demo源码)

    上篇文章中(IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc),我们用自己的方式实现了一个简陋的工厂类来实现IoC. 这里我们尝试使用Auotfac来替换我们的工厂类Mov ...

  6. 使用JDBC技术完成一个简单的账务管理系统

    一:账务系统的大致组成: 简单来说包括app层,controller层,dao层,domain层,service层,tools层,view层. 我的运行环境是:java version "1 ...

  7. 一个简单示例 利用jawin完成调用window中dll的调用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 最近由于 ...

  8. 用DIV+CSS技术制作一个简单的网页 我的家乡主题

    家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套.浮动.margin.border.background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大 ...

  9. 《Python Cookbook 3rd》笔记(2.19):实现一个简单的递归下降分析器

    实现一个简单的递归下降分析器 问题 你想根据一组语法规则解析文本并执行命令,或者构造一个代表输入的抽象语法树.如果语法非常简单,你可以自己写这个解析器,而不是使用一些框架. 解法 在这个问题中,我们集 ...

最新文章

  1. Navicat 12连接MySQL8服务器
  2. U.S.News最新美国大学排名:普林斯顿蝉联总榜第一,MIT领跑计算机,弗罗里达成新贵...
  3. sd卡 写卡阻塞_Sony a7r4写卡速度测试
  4. 实训项目1-熟练使用VMware安装Windows server 2012
  5. 全球及中国蔬菜泥配料行业竞争策略及投资潜力研究报告2021-2027年版
  6. php resultset用法,PHP PDOStatement::nextRowset讲解
  7. 企业微信小程序_集成微信小程序插件_地图选点插件
  8. Hybrid框架UI重构之路:一、师其长技以自强
  9. 数据分析训练营还有这些内容(Spark)
  10. viper4android hifi,体验HiFi级音质 蝰蛇音效进阶使用教程
  11. Objective C 获取当前日期时间方法
  12. STREAM内存带宽测试工具介绍及其内部实现
  13. SWUSTOJ #69 偷菜时间表
  14. 服务器不能使用无线键盘,台式机无线键盘不能使用解决方法
  15. 濡沫江湖一直显示获取服务器地址,濡沫江湖霜儿剧情任务怎么完成?霜儿专属剧情任务接取以及完成攻略...
  16. 已知圆外一点坐标,以及圆心坐标、半径,求圆的切线方程
  17. 怎么用VBA在excel中指定位置画图表? 如怎么用VBA在 A7:G13位置画出图标
  18. 什么事aop,aop的作用是什么?aop在项目哪里使用到了
  19. Arduino智能小车设计(二)
  20. LINUX设置DNS

热门文章

  1. Linux 设置vim 显示行号
  2. centos vim显示行号
  3. Unity零基础到入门 ☀️| Unity从青铜 到 王者!只差这篇让你学会Unity中最重要的部分——脚本组件✨
  4. iphone android 双击,iPhone8新功能曝光:双击唤醒屏幕 向安卓手机学习
  5. ORACLE MERGE INTO DELETE
  6. 如何用STATA快速完成论文的实证部分
  7. 慎用GROUP_CONCAT()
  8. windows xp professional 序列号(密钥)及百度网盘下载地址
  9. 使用selenium写一个简单的爬虫登录邮箱
  10. java中map转json