注:顶点坐标可以点击

 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 绘制任意三角形任意顶点到对边的高的更多相关文章

  1. [ActionScript 3.0] AS3 绘制12面体

    package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; im ...

  2. [ActionScript 3.0] AS3 绘制星形

    package { import flash.display.Sprite; import flash.events.Event; /** * @author Frost.Yen * @E-mail ...

  3. [ActionScript 3.0] AS3 绘制正四面体(线条)

    package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; im ...

  4. [ActionScript 3.0] AS3 绘制正八面体(线条)

    分析: 将八面体置于3D坐标系中,其中心的坐标位于原点(0,0,0),让八面体的六个顶点恰好位于3D坐标系的x轴.y轴和z轴上,则从八面体的中心到这六个顶点的距离是相等的.我们可以假设这个距离为r,则 ...

  5. [ActionScript 3.0] AS3 绘制正二十面体(线条)

    分析: 正二十面体共有12个顶点.30条棱,其20个面都是正三角形.每条棱所对应的弧度值为1.1071487177940904弧度,这个弧度值可通过求Math.sqrt(5)/5的反余弦值求得.正二十 ...

  6. [ActionScript 3.0] AS3 绘制立方体

    package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Vector3D; import ...

  7. [ActionScript 3.0] AS3 3D双圆环贴图

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieCl ...

  8. [ActionScript 3.0] as3处理xml的功能和遍历节点

    as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式. XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据.将数据加载到 XML 对象 ...

  9. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

随机推荐

  1. 【Rsync项目实战一】备份全网服务器数据

    目录 [Rsync项目实战]备份全网服务器数据 [企业案例] 1.1 环境部署 1.2 开始部署backup服务器:Rsync服务端过程: 1.3 开始部署nfs01服务器:Rsync客户端过程: [ ...

  2. glTexGen

    [glTexGen] Rather than having to explicitly provide a texture coordinate for each vertex, we can use ...

  3. css水平居中,竖直居中技巧(二)

    css水平居中,竖直居中技巧(二)===### 1.效果 ### 2.代码#### 2.1.index.html <!DOCTYPE html> <html lang="z ...

  4. markdown转HTML,目录生成

    1.首先,准备好已经编辑好的markdown文件放到指定目录下. 2.下载node.js,下载地址:https://nodejs.org/en/download/ 3.下载好node.js文件后,配置 ...

  5. 30-Transformation(HDU4578)-区间线段树(复杂)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 Transformation Time Limit: 15000/8000 MS (Java/Others ...

  6. Nlog- Application Logging in C#

    当你在谷歌搜索 Application  Loggin in C#,排在最前面的是这个 .NET Logging Tools and Libraries ,点击进去你会发现里面收录了不错的日记工具及文 ...

  7. 查看并解除Oracle锁

    当某个数据库用户在数据库中插入.更新.删除一个表的数据,或者增加一个表的主键时或者表的索引时, 常常会出现ora-00054:resource busy and acquire with nowait ...

  8. Hibernate环境搭建

    Hibernate的环境搭建,主要步骤分为一下四步: 首先创建一个工程,在工程里创建一个实体类User,在这个实体类中必须包含无参的构造器,和这个类对属性的存取方法(getter and setter ...

  9. smarty内置函数、自定义函数

    1.把字符串里的d字母替换成h格式:{'d'|str_replace:'h':$str}; d要查找的字符 h要替换的字符 $str字符串 2.function test($param){$p1=$p ...

  10. css常用技巧:input提示文字;placeholder字体修改

    1 很多网站都需要更改 <input>内部的placeholder 文字颜色属性:下面来介绍下这个技巧. 2  源代码: <!DOCTYPE html><html> ...