翻书效果核心几何处理类

 制作翻书效果核心几何处理类
  1. package {
  2.   import flash.geom.Point;
  3.   public class Formula {
  4.     function Formula() {
  5.     }
  6.     //求已知线段的垂直平分线
  7.     public static function getVerticalLine(point1:Point, point2:Point):Object {
  8.       var point3:Point=new Point((point1.x+point2.x)/2,(point1.y+point2.y)/2);
  9.       var point4:Point=new Point(0,0);
  10.       var point5:Point=new Point(0,0);
  11.       if (point1.x<point2.x) {
  12.         point4=point1
  13.       } else {
  14.         point4=point2
  15.       }
  16.       point5.x=-(point4.y-point3.y)+point3.x;
  17.       point5.y=point4.x-point3.x+point3.y
  18.       var line:Object={pointA:point3,pointB:point5}
  19.       return line;
  20.     }
  21.     
  22.     //求通过一点且垂直于已知直线的两直线的交点
  23.     public static function getPlumbPoint(point1:Point, point2:Point, point3:Point):Point {
  24.       //ax+by+c=0直线的标准方程
  25.       var a:Number = point1.y-point2.y;
  26.       var b:Number = point2.x-point1.x;
  27.       var c:Number = point1.x*point2.y-point2.x*point1.y;
  28.       var point4:Point;
  29.       var point5:Point;
  30.       //排除a=0或者b=0的情况 
  31.       if (a == 0) {
  32.         point4 = new Point(point3.x,-2*c/b-point3.y);
  33.         point5 = new Point((point4.x+point3.x)/2,(point4.y+point3.y)/2);
  34.         return point5;
  35.       } else if (b == 0) {
  36.         point4 = new Point(-2*c/a-point3.x,point3.y);
  37.         point5 = new Point((point4.x+point3.x)/2,(point4.y+point3.y)/2);
  38.         return point5;
  39.       }
  40.       //直线的斜率
  41.       var k:Number=-a/b;
  42.       //垂直直线的斜率
  43.       var k1:Number = -1/k;
  44.       var u:Number = point3.y-point3.x*k1;
  45.       //直线L和L1的交点point4
  46.       point4=new Point((u+c/b)/(k-k1),k*(u+c/b)/(k-k1)-c/b);
  47.       return point4;
  48.     }
  49.     //已知两点求直线
  50.     public static function getLineExpress(point1:Point, point2:Point):String {
  51.       //ax+by+c=0直线的标准方程
  52.       var a:Number = point1.y-point2.y;
  53.       var b:Number = point2.x-point1.x;
  54.       var c:Number = point1.x*point2.y-point2.x*point1.y;
  55.       return a + "x+" + b + "y+" + c + "=0";
  56.     }
  57.     //求两任意直线的交点
  58.     public static function getNode(point1:Point, point2:Point,point3:Point, point4:Point):* {
  59.       //ax+by+c=0直线的标准方程
  60.       var a:Number = point1.y-point2.y;
  61.       var b:Number = point2.x-point1.x;
  62.       var c:Number = point1.x*point2.y-point2.x*point1.y;
  63.       var a1:Number = point3.y-point4.y;
  64.       var b1:Number = point4.x-point3.x;
  65.       var c1:Number = point3.x*point4.y-point4.x*point3.y;
  66.       var x:Number=0;
  67.       var y:Number=0;
  68.       var point:Point;
  69.       
  70.       //当两条直线平行
  71.       if ((a1==0&&a==0)||(b1==0&&b==0)) {
  72.         trace("平行啊"+a+b);
  73.         return null;
  74.       }
  75.       if (-a/b==-a1/b1&&b!=0&&b1!=0) {
  76.         trace("平行啊"+a+b);
  77.         return null;
  78.       }
  79.       //当两条直线斜率不存在或为零
  80.       if (a1==0&&b==0) {
  81.         y=-c1/b1;
  82.         x=-c/a;
  83.         point=new Point(x,y);
  84.         return point;
  85.       } else if (b1==0&&a==0) {
  86.         x=-c1/a1;
  87.         y=-c/b;
  88.         point=new Point(x,y);
  89.         return point;
  90.       }
  91.       
  92.       //但其中一条直线斜率为零或不存在的时候
  93.       if (a1==0&&a!=0) {
  94.         y=-c1/b1;
  95.         x=-(b*y+c)/a;
  96.         point=new Point(x,y);
  97.         return point;
  98.       } 
  99.       if (b1==0&&b!=0) {
  100.         x=-c1/a1;
  101.         y=-(a*x+c)/b;
  102.         point=new Point(x,y);
  103.         return point;
  104.       }
  105.       if (a==0&&a1!=0) {
  106.         y=-c/b;
  107.         x=-(b1*y+c1)/a1;
  108.         point=new Point(x,y);
  109.         return point;
  110.       } 
  111.       if (b==0&&b1!=0) {
  112.         x=-c/a;
  113.         y=-(a1*x+c1)/b1;
  114.         point=new Point(x,y);
  115.         return point;
  116.       }
  117.             //其他
  118.       y=(a*c1-a1*c)/(a1*b-a*b1);
  119.       x=-(b*y+c)/a;
  120.       point=new Point(x,y);
  121.       return point;
  122.     }
  123.     //保证角度在0——360之间
  124.     public static function fixAngle(angle:Number):Number {
  125.       angle %= 360;
  126.       return angle < 0?angle + 360:angle;
  127.     }
  128.     /*
  129.     求点A和点B相对于参考点C的夹角
  130.     origin:参考点C
  131.     point1:点A
  132.     point2:点B
  133.     返回角度
  134.     */
  135.     public static function getAngle(origin:Point,point1:Point, point2:Point):Number {
  136.       //将坐标中心移到场景的中心
  137.       var x = point1.x-origin.x;
  138.       var y = point1.y-origin.y;
  139.       //判断各种不同的情况,通过运算使r值在0-360之间 
  140.       var angle:Number = fixAngle(Math.atan2(y,x)*180/Math.PI);
  141.       //将坐标中心移到场景的中心
  142.       var x1 = point2.x-origin.x;
  143.       var y1 = point2.y-origin.y;
  144.       //判断各种不同的情况,通过运算使r值在0-360之间 
  145.       var angle1:Number = fixAngle(Math.atan2(y1,x1)*180/Math.PI);
  146.       
  147.       return fixAngle(angle - angle1);
  148.     }
  149.     /*
  150.     以知点O,求点P绕点O旋转30度的点M
  151.     origin:点O
  152.     intent:点P
  153.     ang:旋转角度
  154.     返回点M
  155.     */
  156.     public static function rotate(origin:Point,intent:Point,ang:Number):Point {
  157.       var ca:Number=Math.cos(ang*Math.PI/180);
  158.       var sa:Number=Math.sin(ang*Math.PI/180);
  159.       var cx:Number=(intent.x-origin.x)*ca-(intent.y-origin.y)*sa+origin.x;
  160.       var sy:Number=(intent.x-origin.x)*sa+(intent.y-origin.y)*ca+origin.y;
  161.       var point:Point=new Point(cx,sy);
  162.       return point;
  163.     }
  164.     
  165.     //求一点关于直线的对称点
  166.     public static function symmetry(point1:Point,point2:Point,intent:Point):Point {
  167.       var point3:Point=Formula.getPlumbPoint(point1, point2, intent);
  168.       var x:Number =2*point3.x-intent.x;
  169.       var y:Number=2*point3.y-intent.y;
  170.       var point:Point=new Point(x,y);
  171.       return point;
  172.     }
  173.   }
  174. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值