zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    typeof与instanceof
    TCP与UDP的区别
    const、let、var关键字
    基本通用的使用jdbc文件java代码连接数据库
    HTML知识点01
    ADO.NET基础02
    ADO.NET基础03
    数据库语法01
    数据库语法02
    Ubuntu16.4 内核降级
  • 原文地址:https://www.cnblogs.com/frost-yen/p/4744783.html
Copyright © 2011-2022 走看看