[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 }
------------------------------------------------------------------
Always put yourself in the other's shoes.If you feel that it hurts you,it probably hurts others,too.------------------------------------------------------------------