制作翻书效果核心几何处理类
- package {
- import flash.geom.Point;
- public class Formula {
- function Formula() {
- }
- //求已知线段的垂直平分线
- public static function getVerticalLine(point1:Point, point2:Point):Object {
- var point3:Point=new Point((point1.x+point2.x)/2,(point1.y+point2.y)/2);
- var point4:Point=new Point(0,0);
- var point5:Point=new Point(0,0);
- if (point1.x<point2.x) {
- point4=point1
- } else {
- point4=point2
- }
- point5.x=-(point4.y-point3.y)+point3.x;
- point5.y=point4.x-point3.x+point3.y
- var line:Object={pointA:point3,pointB:point5}
- return line;
- }
- //求通过一点且垂直于已知直线的两直线的交点
- public static function getPlumbPoint(point1:Point, point2:Point, point3:Point):Point {
- //ax+by+c=0直线的标准方程
- var a:Number = point1.y-point2.y;
- var b:Number = point2.x-point1.x;
- var c:Number = point1.x*point2.y-point2.x*point1.y;
- var point4:Point;
- var point5:Point;
- //排除a=0或者b=0的情况
- if (a == 0) {
- point4 = new Point(point3.x,-2*c/b-point3.y);
- point5 = new Point((point4.x+point3.x)/2,(point4.y+point3.y)/2);
- return point5;
- } else if (b == 0) {
- point4 = new Point(-2*c/a-point3.x,point3.y);
- point5 = new Point((point4.x+point3.x)/2,(point4.y+point3.y)/2);
- return point5;
- }
- //直线的斜率
- var k:Number=-a/b;
- //垂直直线的斜率
- var k1:Number = -1/k;
- var u:Number = point3.y-point3.x*k1;
- //直线L和L1的交点point4
- point4=new Point((u+c/b)/(k-k1),k*(u+c/b)/(k-k1)-c/b);
- return point4;
- }
- //已知两点求直线
- public static function getLineExpress(point1:Point, point2:Point):String {
- //ax+by+c=0直线的标准方程
- var a:Number = point1.y-point2.y;
- var b:Number = point2.x-point1.x;
- var c:Number = point1.x*point2.y-point2.x*point1.y;
- return a + "x+" + b + "y+" + c + "=0";
- }
- //求两任意直线的交点
- public static function getNode(point1:Point, point2:Point,point3:Point, point4:Point):* {
- //ax+by+c=0直线的标准方程
- var a:Number = point1.y-point2.y;
- var b:Number = point2.x-point1.x;
- var c:Number = point1.x*point2.y-point2.x*point1.y;
- var a1:Number = point3.y-point4.y;
- var b1:Number = point4.x-point3.x;
- var c1:Number = point3.x*point4.y-point4.x*point3.y;
- var x:Number=0;
- var y:Number=0;
- var point:Point;
- //当两条直线平行
- if ((a1==0&&a==0)||(b1==0&&b==0)) {
- trace("平行啊"+a+b);
- return null;
- }
- if (-a/b==-a1/b1&&b!=0&&b1!=0) {
- trace("平行啊"+a+b);
- return null;
- }
- //当两条直线斜率不存在或为零
- if (a1==0&&b==0) {
- y=-c1/b1;
- x=-c/a;
- point=new Point(x,y);
- return point;
- } else if (b1==0&&a==0) {
- x=-c1/a1;
- y=-c/b;
- point=new Point(x,y);
- return point;
- }
- //但其中一条直线斜率为零或不存在的时候
- if (a1==0&&a!=0) {
- y=-c1/b1;
- x=-(b*y+c)/a;
- point=new Point(x,y);
- return point;
- }
- if (b1==0&&b!=0) {
- x=-c1/a1;
- y=-(a*x+c)/b;
- point=new Point(x,y);
- return point;
- }
- if (a==0&&a1!=0) {
- y=-c/b;
- x=-(b1*y+c1)/a1;
- point=new Point(x,y);
- return point;
- }
- if (b==0&&b1!=0) {
- x=-c/a;
- y=-(a1*x+c1)/b1;
- point=new Point(x,y);
- return point;
- }
- //其他
- y=(a*c1-a1*c)/(a1*b-a*b1);
- x=-(b*y+c)/a;
- point=new Point(x,y);
- return point;
- }
- //保证角度在0——360之间
- public static function fixAngle(angle:Number):Number {
- angle %= 360;
- return angle < 0?angle + 360:angle;
- }
- /*
- 求点A和点B相对于参考点C的夹角
- origin:参考点C
- point1:点A
- point2:点B
- 返回角度
- */
- public static function getAngle(origin:Point,point1:Point, point2:Point):Number {
- //将坐标中心移到场景的中心
- var x = point1.x-origin.x;
- var y = point1.y-origin.y;
- //判断各种不同的情况,通过运算使r值在0-360之间
- var angle:Number = fixAngle(Math.atan2(y,x)*180/Math.PI);
- //将坐标中心移到场景的中心
- var x1 = point2.x-origin.x;
- var y1 = point2.y-origin.y;
- //判断各种不同的情况,通过运算使r值在0-360之间
- var angle1:Number = fixAngle(Math.atan2(y1,x1)*180/Math.PI);
- return fixAngle(angle - angle1);
- }
- /*
- 以知点O,求点P绕点O旋转30度的点M
- origin:点O
- intent:点P
- ang:旋转角度
- 返回点M
- */
- public static function rotate(origin:Point,intent:Point,ang:Number):Point {
- var ca:Number=Math.cos(ang*Math.PI/180);
- var sa:Number=Math.sin(ang*Math.PI/180);
- var cx:Number=(intent.x-origin.x)*ca-(intent.y-origin.y)*sa+origin.x;
- var sy:Number=(intent.x-origin.x)*sa+(intent.y-origin.y)*ca+origin.y;
- var point:Point=new Point(cx,sy);
- return point;
- }
- //求一点关于直线的对称点
- public static function symmetry(point1:Point,point2:Point,intent:Point):Point {
- var point3:Point=Formula.getPlumbPoint(point1, point2, intent);
- var x:Number =2*point3.x-intent.x;
- var y:Number=2*point3.y-intent.y;
- var point:Point=new Point(x,y);
- return point;
- }
- }
- }