<<  Ext.TabPanelItem中使用Iframe引起的内存泄露 | 首 页 | Flex杀手是kugoo -___-  >>
2007-10-24

关键字:AS3 ActionScript3 图形 两条直线交点 

今天在做数据关系图表时,需要求两条直线相交的交点坐标,代码整理如下:

package org.hadronforce.charts.utils.math{
 import flash.geom.Point;
 import org.hadronforce.charts.baseobjects.Line;
 
 /**
  * 点计算类
  * @Author:Robin
  */
 public class PointCalculator{
  
/**
   * 求两条直线交点.
   * 如果两直线无交点,则返回null。
   */
  public static function getIntersection(line1:Line, line2:Line):Point{
   var x:Number;//被求交点的x轴坐标
   var y:Number;//被求交点的y轴坐标
   
   var k1:Number;//line1的斜率
   var b1:Number;//line1的纵截距
   
   var k2:Number;//line2的斜率
   var b2:Number;//line2的纵截距
   
   /*
     分别求出line1和line2的斜率
     公式:斜率k= tan(a) = y/x
   */
   
   k1 = (line1.startPoint.y - line1.endPoint.y) / (line1.startPoint.x - line1.endPoint.x);
   k2 = (line2.startPoint.y - line2.endPoint.y) / (line2.startPoint.x - line2.endPoint.x);
   
   /*
    根据斜截式 y = kx + b
    可得推导式:b = y - kx
    将k1,k2代入推导式,分别求b1,b2
   */
      b1 = line1.startPoint.y - k1 * line1.startPoint.x;
      b2 = line2.startPoint.y - k2 * line2.startPoint.x;
     
   if (k1 == k2){//当两条直线平行时返回null;
    return null;
   }else if ((k1 == Number.POSITIVE_INFINITY || k1 == Number.NEGATIVE_INFINITY) &&
       (k2 == Number.NEGATIVE_INFINITY || k2 == Number.POSITIVE_INFINITY)){
        //当两条直线平行时(特例,均垂直于y轴)返回null;
       return null;
   }else if (k1 == Number.POSITIVE_INFINITY || k1 == Number.NEGATIVE_INFINITY){
    //当line1垂直于y轴时(斜率为正无穷或负无穷),进行如下计算
    x = line1.startPoint.x;
    y = k2 * x + b2;
   }else if (k2 == Number.POSITIVE_INFINITY || k2 == Number.NEGATIVE_INFINITY){
    //当line2垂直于y轴时(斜率为正/负无穷),进行如下计算
    x = line2.startPoint.x;
    y = k1 * x + b1;
   }else{
       /*
      连例 y = k1 * x + b1
          y = k2 * x + b2
      得到推导式:x = (b1 - b2)/(k2 - k1)
    */
       x = (b1 - b2) / (k2 - k1);
      
     /*
       将x值带入斜截式方程,可求y值
     */
       y = k1 * x + b1;
   }
   
   return new Point(x,y);
  }
 }

}





Tag:

评论

发表评论

 姓名:
 E-mail:
 地址: