[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 或扩 ...
随机推荐
- int类型与char类型的转换
---------siwuxie095 Java对char类型的数据在底层是按int类型来处理的 (只是显示出来仍然是字符型) 1.int类型与char ...
- leetcode - 3、Longest Substring Without Repeating Characters
题目链接:https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ 题目要求: ...
- Python原始套接字编程-乾颐堂
在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_R ...
- ubuntu如何安装samba
1.samba安装sudo apt-get install samba2.修改smb.confsudo gedit /etc/samba/smb.conf 文件最后增加如下代码:[share] pat ...
- mosquitto ---配置SSL/TLS linux
mosquitto ---配置SSL/TLS 摘自: https://www.cnblogs.com/saryli/p/9821343.html 在服务器电脑上面创建myCA文件夹, 如在/home/ ...
- HBase表的memstore与集群memstore
一直有一个问题,今天调查了一下源码算是明白了. ===问题=== 通过java api(如下代码所示)在创建表的时候,可以通过setMemStoreFlushSize函数来指定memstore的大小, ...
- SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化
摘要: SimpleUrlHandlerMapping只是参与Handler的注册,请求映射时由AbstractUrlHandlerMapping搞定. 初始化时,通过setMappings(Prop ...
- 编写高质量代码改善C#程序的157个建议——建议74:警惕线程的IsBackground
建议74:警惕线程的IsBackground 在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性.两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就 ...
- DFS实现全排列
复习一下DFS实现全排列,具体思想见:https://www.cnblogs.com/chiweiming/p/9279858.html public class Main{ static int a ...
- mybatis 起别名
mybatis.xml文件 typeAliases 节点进行配置别名(有两种配置方法:1.typeAlias 2.package 这个方式比较简单) 也可以省略不写