[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 或扩 ...
随机推荐
- 文件操作类File
File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 FileInfo类:提供创建.复制.删除.移动和打开文件的属性和实例方法.FileInfo类 Directory类:公开用于 ...
- android-tip-关于SpannableString的使用
如果想单独设置TextView上其中几个字的样式,该怎么办? 答案是使用SpannableString. 使用SpannableString可以为TextView上的某字或某些字设置: 前景色(For ...
- Python中装饰器(转)
本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生 ...
- Lucas–Kanade光流算法学习
Lucas–Kanade光流算法是一种两帧差分的光流估计算法.它由Bruce D. Lucas 和 Takeo Kanade提出. 光流(Optical flow or optic f ...
- JVM内存模型以及堆分配参数
程序计数器: 存放下一条要运行的指令:每个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令.程序计数器是一块线程私有的内存空间. JAVA虚拟机栈: 线程私有的内存空间,它保存方法的局部变 ...
- 在IIS和Nginx上通过代理部署基于ant-design-pro前端框架开发的应用
一.本文解决的主要问题 通过对前端静态资源站点进行代理服务设置,实现对后端API接口的代理,从而实现前端的独立部署,即通过代理的设置实现对http://IP0:Port0/api/xxx的请求转发至h ...
- 如何注册facebook应用
最近项目中要做第三方登录,其中就有facebook的,下面讲解一下如何在facebook中创建应用 1.登录facebook的开发者平台(https://developers.facebook.com ...
- mysql 数学操作函数
-- 绝对值,圆周率 SELECT ABS(-1),3*PI() -- 平方根,求余 SELECT SQRT(9),MOD(9,5) -- 获取整数的函数 SELECT CEIL(12.145),CE ...
- YII2 全局设定 默认参数
$gridviewSettings = [ 'export' => false, 'responsive' => true, 'floatHeader' => true, 'floa ...
- 在java中对数据库进行增删改查
1.java连接MySql数据库 代码区域: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...