[ActionScript 3.0] AS3 绘制任意三角形任意顶点到对边的高
注:顶点坐标可以点击
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.text.TextField; /**
* @author Frost.Yen
* @E-mail 871979853@qq.com
* @create 2015-8-18 下午3:16:57
*
*/
[SWF(width="1024",height="768")]
public class DrawTriangle extends Sprite
{
private var _pointArr:Array = [new Point(200,150),new Point(500,300),new Point(150,400)];
private var _btn:TextField;
private var _container:Sprite;
private var _heightShape:Shape;
private var _pointA:TextField;
private var _pointB:TextField;
private var _pointC:TextField;
private var _pointD:TextField; public function DrawTriangle()
{
initViews();
initEventListeners();
}
private function initViews():void
{
_container = new Sprite();
_btn = new TextField();
_heightShape = new Shape();
_btn.selectable = false;
_btn.border = true;
_btn.htmlText = "点击随机生成三角形";
_btn.autoSize = "left";
_btn.background = true;
_btn.backgroundColor = 0xdddddd;
_btn.x = 100;
_btn.y = 100;
_pointA = getText(_container);
_pointB = getText(_container);
_pointC = getText(_container);
_pointD = getText(_container);
this.addChild(_btn);
this.addChild(_container);
this.addChild(_heightShape);
}
private function initEventListeners():void
{
_btn.addEventListener(MouseEvent.CLICK,onCreatClick);
_pointA.addEventListener(MouseEvent.CLICK,onGetHeight);
_pointB.addEventListener(MouseEvent.CLICK,onGetHeight);
_pointC.addEventListener(MouseEvent.CLICK,onGetHeight);
}
private function onCreatClick(e:MouseEvent):void
{
creatTriangle();
} private function creatTriangle():void
{
getPoint();
_pointArr.sortOn("y");
_heightShape.graphics.clear();
_container.graphics.clear();
_container.graphics.lineStyle(2,0xff0000);
_container.graphics.moveTo(_pointArr[0].x,_pointArr[0].y);
_container.graphics.lineTo(_pointArr[1].x,_pointArr[1].y);
_container.graphics.moveTo(_pointArr[1].x,_pointArr[1].y);
_container.graphics.lineTo(_pointArr[2].x,_pointArr[2].y);
_container.graphics.moveTo(_pointArr[2].x,_pointArr[2].y);
_container.graphics.lineTo(_pointArr[0].x,_pointArr[0].y);
setText(_pointD,"");
setText(_pointA,"A("+_pointArr[0].x+","+_pointArr[0].y+")",_pointArr[0].x,_pointArr[0].y);
setText(_pointB,"B("+_pointArr[1].x+","+_pointArr[1].y+")",_pointArr[1].x,_pointArr[1].y);
setText(_pointC,"C("+_pointArr[2].x+","+_pointArr[2].y+")",_pointArr[2].x,_pointArr[2].y);
}
private function onGetHeight(e:MouseEvent):void
{
var point:Point;
var start:Point;
switch(e.currentTarget){
case _pointA:
point = getCrossoverByVertex(_pointArr[0],_pointArr[1],_pointArr[2]);
break;
case _pointB:
point = getCrossoverByVertex(_pointArr[1],_pointArr[0],_pointArr[2]);
break;
case _pointC:
point = getCrossoverByVertex(_pointArr[2],_pointArr[0],_pointArr[1]);
break;
}
setText(_pointD,"C("+point.x+","+point.y+")",point.x,point.y); }
/**
* 随机生成三个顶点
*/
private function getPoint():void
{
_pointArr = [];
for(var i:int = 0;i<3;i++){
var point:Point = new Point(Math.floor(Math.random()*400)+150,Math.floor(Math.random()*400+150));
_pointArr.push(point);
}
var k:Number = (_pointArr[2].y-_pointArr[1].y)/(_pointArr[2].x-_pointArr[1].x);
var b:Number = _pointArr[2].y-k*_pointArr[2].x;
if(_pointArr[0].y == k*_pointArr[0].x+b ){//判断三个点是否在同一直线
trace("三个点处于同一直线");
getPoint();
}
}
/**
* 获取顶点的高线与对边的交点
* @param vertex 顶点
* @param point1 三角形另外两点之一
* @param point2 三角形另外两点之一
* @return
*/
private function getCrossoverByVertex(vertex:Point,point1:Point,point2:Point):Point
{
if(point2.y == point1.y){
return new Point(vertex.x,point1.y);
} var k1:Number;//顶点对角线的斜率(即A点对角线为BC)
var b1:Number;//顶点对角线的直线方程的常数
var k2:Number;//高所在直线的斜率
var b2:Number;//高所在直线方程的常数
var crossPoint:Point = new Point();//高线和顶点对角线的交点
k1 = (point2.y - point1.y)/(point2.x - point1.x);
b1 = point1.y - k1 * point1.x;
k2 = -1 / k1 ;
b2 = vertex.y-k2*vertex.x;
crossPoint.x = (b1 - b2)/(k2 - k1);
crossPoint.y = k1 * ((b1 - b2)/(k2 - k1)) + b1;
drawHeight(vertex,crossPoint);
return crossPoint;
}
private function drawHeight(start:Point,end:Point):void
{
_heightShape.graphics.clear();
_heightShape.graphics.lineStyle(2,0xff00ff);
_heightShape.graphics.moveTo(start.x,start.y);
_heightShape.graphics.lineTo(end.x,end.y);
_heightShape.graphics.endFill();
}
private function getText(parent:Sprite):TextField
{
var t:TextField = new TextField;
t.autoSize = "left";
t.selectable = false;
parent.addChild(t);
return t;
}
private function setText(t:TextField,text:String,x:Number=0,y:Number=0):void
{
t.text = text;
t.x = x;
t.y = y;
}
}
}
[ActionScript 3.0] AS3 绘制任意三角形任意顶点到对边的高的更多相关文章
- [ActionScript 3.0] AS3 绘制12面体
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; im ...
- [ActionScript 3.0] AS3 绘制星形
package { import flash.display.Sprite; import flash.events.Event; /** * @author Frost.Yen * @E-mail ...
- [ActionScript 3.0] AS3 绘制正四面体(线条)
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; im ...
- [ActionScript 3.0] AS3 绘制正八面体(线条)
分析: 将八面体置于3D坐标系中,其中心的坐标位于原点(0,0,0),让八面体的六个顶点恰好位于3D坐标系的x轴.y轴和z轴上,则从八面体的中心到这六个顶点的距离是相等的.我们可以假设这个距离为r,则 ...
- [ActionScript 3.0] AS3 绘制正二十面体(线条)
分析: 正二十面体共有12个顶点.30条棱,其20个面都是正三角形.每条棱所对应的弧度值为1.1071487177940904弧度,这个弧度值可通过求Math.sqrt(5)/5的反余弦值求得.正二十 ...
- [ActionScript 3.0] AS3 绘制立方体
package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Vector3D; import ...
- [ActionScript 3.0] AS3 3D双圆环贴图
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieCl ...
- [ActionScript 3.0] as3处理xml的功能和遍历节点
as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式. XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据.将数据加载到 XML 对象 ...
- [ActionScript 3.0] AS3.0 动态加载显示内容
可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...
随机推荐
- Ubuntu14.04下opencv卸载与重装
参考链接:http://askubuntu.com/questions/334158/installing-opencv http://stackoverflow.com/questions/1313 ...
- Powerdesigner逆向工程从mysql生成PDM
大家喜欢用powerDesigner进行数据库建模.通常都是先设计出物理模型图,再转换出数据库需要的SQL语句,从而生成数据库.但“powerDesigner逆向工程”就能将数据库逆向转为物理模型图. ...
- [c++] polymorphism without virtual function
polymorphism without virtual function
- Ubuntu命令行下安装、卸载、管理软件包的方法
一.Ubuntu中软件安装方法 1.APT方式 (1)普通安装:apt-get install softname1 softname2 -; (2)修复安装:apt-get -f install so ...
- PLSA算法(转)
文章分类:综合技术 1. 引子 Bag-of-Words 模型是NLP和IR领域中的一个基本假设.在这个模型中,一个文档(document)被表示为一组单词(word/term)的无序组合,而忽略了语 ...
- command >/dev/null 2>&1 解说
0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 & == ...
- java之常用的依赖文件pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Transferring Data Between ASP.NET Web Pages
14 July 2012 20:24 http://www.mikesdotnetting.com/article/192/transferring-data-between-asp-net-web- ...
- 敏捷软件开发:原则、模式与实践——第11章 DIP:依赖倒置原则
第11章 DIP:依赖倒置原则 DIP:依赖倒置原则: a.高层模块不应该依赖于低层模块.二者都应该依赖于抽象. b.抽象不应该依赖于细节.细节应该依赖于抽象. 11.1 层次化 下图展示了一个简单的 ...
- Java对称加密算法
对称加密算法概念 加密密钥和解密密钥相同,大部分算法加密揭秘过程互逆. 特点:算法公开.(相比非对称加密)计算量小.加密速度快.效率高. 弱点:双方都使用同样的密钥,安全性得不到保证. 常用对称加密算 ...