[ActionScript 3.0] AS3 绘制任意三角形任意顶点到对边的高

注:顶点坐标可以点击

  1 package
  2 {
  3     import flash.display.Shape;
  4     import flash.display.Sprite;
  5     import flash.events.MouseEvent;
  6     import flash.geom.Point;
  7     import flash.text.TextField;
  8     
  9     /**
 10      * @author Frost.Yen
 11      * @E-mail 871979853@qq.com
 12      * @create 2015-8-18 下午3:16:57
 13      *
 14      */
 15     [SWF(width="1024",height="768")]
 16     public class DrawTriangle extends Sprite
 17     {
 18         private var _pointArr:Array = [new Point(200,150),new Point(500,300),new Point(150,400)];
 19         private var _btn:TextField;
 20         private var _container:Sprite;
 21         private var _heightShape:Shape;
 22         private var _pointA:TextField;
 23         private var _pointB:TextField;
 24         private var _pointC:TextField;
 25         private var _pointD:TextField;
 26         
 27         public function DrawTriangle()
 28         {
 29             initViews();
 30             initEventListeners();
 31         }
 32         private function initViews():void
 33         {
 34             _container = new Sprite();
 35             _btn = new TextField();
 36             _heightShape = new Shape();
 37             _btn.selectable = false;
 38             _btn.border = true;
 39             _btn.htmlText = "点击随机生成三角形";
 40             _btn.autoSize = "left";
 41             _btn.background = true;
 42             _btn.backgroundColor = 0xdddddd;
 43             _btn.x = 100;
 44             _btn.y = 100;
 45             _pointA = getText(_container);
 46             _pointB = getText(_container);
 47             _pointC = getText(_container);
 48             _pointD = getText(_container);
 49             this.addChild(_btn);
 50             this.addChild(_container);
 51             this.addChild(_heightShape);
 52         }
 53         private function initEventListeners():void
 54         {
 55             _btn.addEventListener(MouseEvent.CLICK,onCreatClick);
 56             _pointA.addEventListener(MouseEvent.CLICK,onGetHeight);
 57             _pointB.addEventListener(MouseEvent.CLICK,onGetHeight);
 58             _pointC.addEventListener(MouseEvent.CLICK,onGetHeight);
 59         }
 60         private function onCreatClick(e:MouseEvent):void
 61         {
 62             creatTriangle();
 63         }
 64         
 65         private function creatTriangle():void
 66         {
 67             getPoint();
 68             _pointArr.sortOn("y");
 69             _heightShape.graphics.clear();
 70             _container.graphics.clear();
 71             _container.graphics.lineStyle(2,0xff0000);
 72             _container.graphics.moveTo(_pointArr[0].x,_pointArr[0].y);
 73             _container.graphics.lineTo(_pointArr[1].x,_pointArr[1].y);
 74             _container.graphics.moveTo(_pointArr[1].x,_pointArr[1].y);
 75             _container.graphics.lineTo(_pointArr[2].x,_pointArr[2].y);
 76             _container.graphics.moveTo(_pointArr[2].x,_pointArr[2].y);
 77             _container.graphics.lineTo(_pointArr[0].x,_pointArr[0].y);
 78             setText(_pointD,"");
 79             setText(_pointA,"A("+_pointArr[0].x+","+_pointArr[0].y+")",_pointArr[0].x,_pointArr[0].y);
 80             setText(_pointB,"B("+_pointArr[1].x+","+_pointArr[1].y+")",_pointArr[1].x,_pointArr[1].y);
 81             setText(_pointC,"C("+_pointArr[2].x+","+_pointArr[2].y+")",_pointArr[2].x,_pointArr[2].y);
 82         }
 83         private function onGetHeight(e:MouseEvent):void
 84         {
 85             var point:Point;
 86             var start:Point;
 87             switch(e.currentTarget){
 88                 case _pointA:
 89                     point = getCrossoverByVertex(_pointArr[0],_pointArr[1],_pointArr[2]);
 90                     break;
 91                 case _pointB:
 92                     point = getCrossoverByVertex(_pointArr[1],_pointArr[0],_pointArr[2]);
 93                     break;
 94                 case _pointC:
 95                     point = getCrossoverByVertex(_pointArr[2],_pointArr[0],_pointArr[1]);
 96                     break;
 97             }
 98             setText(_pointD,"C("+point.x+","+point.y+")",point.x,point.y);
 99             
100         }
101         /**
102          * 随机生成三个顶点
103          */
104         private function getPoint():void
105         {
106             _pointArr = [];
107             for(var i:int = 0;i<3;i++){
108                 var point:Point = new Point(Math.floor(Math.random()*400)+150,Math.floor(Math.random()*400+150));
109                 _pointArr.push(point);
110             }
111             var k:Number = (_pointArr[2].y-_pointArr[1].y)/(_pointArr[2].x-_pointArr[1].x);
112             var b:Number = _pointArr[2].y-k*_pointArr[2].x;
113             if(_pointArr[0].y == k*_pointArr[0].x+b ){//判断三个点是否在同一直线 
114                 trace("三个点处于同一直线");
115                 getPoint();
116             }
117         }
118         /**
119          * 获取顶点的高线与对边的交点
120          * @param    vertex 顶点
121          * @param    point1 三角形另外两点之一
122          * @param    point2 三角形另外两点之一
123          * @return
124          */
125         private function getCrossoverByVertex(vertex:Point,point1:Point,point2:Point):Point
126         {
127             if(point2.y == point1.y){
128                 return new Point(vertex.x,point1.y);
129             }
130             
131             var k1:Number;//顶点对角线的斜率(即A点对角线为BC)
132             var b1:Number;//顶点对角线的直线方程的常数
133             var k2:Number;//高所在直线的斜率
134             var b2:Number;//高所在直线方程的常数
135             var crossPoint:Point = new Point();//高线和顶点对角线的交点
136             k1 = (point2.y - point1.y)/(point2.x - point1.x);
137             b1 = point1.y - k1 * point1.x;
138             k2 = -1 / k1 ;
139             b2 = vertex.y-k2*vertex.x;
140             crossPoint.x = (b1 - b2)/(k2 - k1);
141             crossPoint.y = k1 * ((b1 - b2)/(k2 - k1)) + b1;
142             drawHeight(vertex,crossPoint);
143             return crossPoint;
144         }
145         private function drawHeight(start:Point,end:Point):void
146         {
147             _heightShape.graphics.clear();
148             _heightShape.graphics.lineStyle(2,0xff00ff);
149             _heightShape.graphics.moveTo(start.x,start.y);
150             _heightShape.graphics.lineTo(end.x,end.y);
151             _heightShape.graphics.endFill();
152         }
153         private function getText(parent:Sprite):TextField
154         {
155             var t:TextField = new TextField;
156             t.autoSize = "left";
157             t.selectable = false;
158             parent.addChild(t);
159             return t;
160         }
161         private function setText(t:TextField,text:String,x:Number=0,y:Number=0):void
162         {
163             t.text = text;
164             t.x = x;
165             t.y = y;
166         }
167     }
168 }
原文地址:https://www.cnblogs.com/frost-yen/p/4744783.html