开源下自己写的一个45度坐标系数据转换工具类 /** *45度坐标系数据转换工具类 * code wxsr */ package com.engine.data.referenceFrame45 { import flash.geom.Point; public class Rectangle45 //implements IRectangle45 { public static var ARI_MODE:Boolean=false public static const anglex:Number=Math.asin(1/Math.sqrt(5))*(180/Math.PI) private static const angley:Number=Math.asin(2/Math.sqrt(5))*(180/Math.PI) public static const sideFirst:Point=new Point(1,1) public static const sideSecond:Point=new Point(-1,1) public static const sideThird:Point=new Point(-1,-1) public static const sideFour:Point=new Point(1,-1) /** *角度转弧度 * @param angle * @return * */ public static function angleToradian(angle:Number):Number { return angle*180/Math.PI*angle; } /** * 弧度转角度 * @param radian * @return * */ public static function radianToangle(radian:Number):Number { return radian*Math.PI/180*radian } /** *获取x单位45度移动增量 * @param targetPoint 目标坐标 * @param leftVertex 新开始点 * @param origin 原点 * @return * */ public static function vx(targetPoint:Point, cell:CellGird45):Number { var pox:Number=(targetPoint.x+cell.leftVertex.x)/2 - (targetPoint.y-cell.leftVertex.y)-cell.origin.x; return pox; } /** * 获取y单位45度移动增量 * @param targetPoint * @param leftVertex * @param origin * @return * */ public static function vy(targetPoint:Point, cell:CellGird45):Number { var poy:Number=(targetPoint.x+cell.leftVertex.x)/2 + (targetPoint.y-cell.leftVertex.y)-cell.origin.x; return poy; } /** *获取直角坐标某点的x45度坐标 * @param targetPoint * @param newLeftVertex * @return * */ public static function x45(targetPoint:Point, cell:CellGird45):Point { var poX:Number=vx(targetPoint,cell) return new Point(cell.leftVertex.x+poX,cell.leftVertex.y-poX*.5) } /** * 获取直角坐标某点的y45度坐标 * @param targetPoint * @param newLeftVertex * @return * */ public static function y45(targetPoint:Point, cell:CellGird45):Point { var poY:Number=vy(targetPoint,cell) return new Point(cell.leftVertex.x+poY,cell.leftVertex.y+poY*.5) } /** *将直角坐标系的一点转换为45度坐标系 对应点 * @param targetPoint * @param newLeftVertex * @return * */ public static function xy45(targetPoint:Point, cell:CellGird45):Point { var poX:Point=x45(targetPoint,cell) var poY:Point=y45(targetPoint,cell) var x:Number=poX.x+poY.x-cell.leftVertex.x; var y:Number=poX.y+poY.y-cell.leftVertex.y; return new Point(x,y) } /** *获取棋盘整型坐标 * @param point * @return * */ public static function getIndex(point:Point,cell:CellGird45):Point { point==null?point=new Point:'' var pox:Number= Math.floor((point.x-cell.leftVertex.x)/cell.cellWidth - (point.y-cell.leftVertex.y)/cell.cellHeight); var poy:Number=Math.floor((point.x-cell.leftVertex.x)/cell.cellWidth + (point.y-cell.leftVertex.y)/cell.cellHeight); return new Point(pox,poy) } /** *将45度坐标转换为直角坐标系 * @param point * @return * */ public static function local45ToGlobal(point:Point,cell:CellGird45):Point { var size:Number=cell.cellHeight; var pox:Number=cell.leftVertex.x+size*(point.x+point.y); var poy:Number=cell.leftVertex.y+size/2*(point.y-point.x); return new Point(pox,poy) } ; public static function symmetryChange(oldSide:Point,newSide:Point,camerPoint:Point,oblPoint:Point):Point { var dirX:int=newSide.x-oldSide.x var dirY:int=newSide.y-oldSide.y if(dirX!=0) { dirX>0?dirX=1:dirX=-1 } if(dirY!=0) { dirY>0?dirY=1:dirY=-1 } var disx:int=(oblPoint.x-camerPoint.x)*dirX; var disy:int=(oblPoint.y-camerPoint.y)*dirY; var newPoint:Point=new Point(oblPoint.x+disx*2,oblPoint.y+disy*2) return newPoint } /** * * @param point * @param cell * @param isReverse * @return * */ public static function fitPoint(point:Point,cell:CellGird45,isReverse:Boolean=false):Point { var newPoint:Point if(isReverse){ newPoint=local45ToGlobal(getIndex(point,cell),cell) return getIndex(newPoint,cell) } newPoint=getIndex(point,cell) return local45ToGlobal(newPoint,cell) } /** *平面90度旋转转换 * @param camerPoint * @param oldPoint * @param cell * @param dir * @return * */ public static function rotationChange2(camerPoint:Point,oldPoint:Point,cell:CellGird45,dir:int=-1):Point { if(!Rectangle45.ARI_MODE)camerPoint=new Point; //var radian:Array=[dir*Math.PI*.5,Math.PI,3*Math.PI/2,2*Math.PI] var x:Number=oldPoint.x-camerPoint.x; var y:Number=oldPoint.y-camerPoint.y var radius:Number=Math.sqrt(x*x+y*y) var angle2:Number=Math.atan2(x,y) var u:Number=Math.round(camerPoint.x+Math.sin(dir*Math.PI*.5+angle2) * radius); var v:Number=Math.round(camerPoint.y+Math.cos(dir*Math.PI*.5+angle2) * radius) var point:Point=new Point( u,v); return point } } } /** *45度坐标系 * 45度转换单位 * code wxsr */ package com.engine.data.referenceFrame45 { import flash.geom.Point; import flash.net.registerClassAlias; public class CellGird45 { private var _anglex:Number=Math.asin(1/Math.sqrt(5)) private var _angley:Number=Math.asin(2/Math.sqrt(5)) private var _origin:Point; private var _leftVertex:Point; private var _topVertex:Point private var _rightVertex:Point; private var _bottonVertex:Point; private var _midpoint:Point; private var _cellSize:Number private var _cellWidth:Number private var _cellHeigth:Number; private var _key:String; private var _keyPoint:Point private var _type:uint=1 private var _color:uint=0xffff00; private var _lock:Boolean; public var source:String; //信息所属的元件id public var imgKey:String public function CellGird45(cellSize:Number=25,originPoint:Point=null) { registerClassAlias("com.save.cellGird45",CellGird45) registerClassAlias("com.save.point",Point) this.cellSize=cellSize if(originPoint==null) { this.origin=new Point() }else { this.origin=originPoint; } } /** * 是否不可设置 * @return * */ public function get lock():Boolean { return this._lock } public function set lock(val:Boolean):void { this._lock=val } /** * 类型 * @return * */ public function get type():uint { return this._type } public function set type(val:uint):void { this._type=val } /** * 颜色 * @return * */ public function get color():uint { return this._color } public function set color(val:uint):void { this._color=val } /** * 注册点 * @param point * */ public function set origin(point:Point):void { this._origin=point; var x:Number=this._origin.x; var y:Number=this._origin.y; var size:Number=this._cellHeigth size=24 this._leftVertex=new Point(x,y+size/2) this._topVertex=new Point(x+size,y) this._rightVertex=new Point(x+size*2,y+size/2) this._bottonVertex=new Point(x+size,y+size) this._midpoint=new Point(x+size,y+size/2) } /** * 单元格大小 * @param val * */ public function set cellSize(val :Number):void { this._cellWidth=(val*this._angley*2); this._cellHeigth=(this._cellWidth/2) this._cellSize=val } /** * 单元格宽度 * @param val * */ public function set cellWidth (val:Number):void { this._cellWidth=(val); this._cellHeigth=val/2 this._cellSize=val/this._angley*.5 } /** * 单元格高度 * @param val * */ public function set cellHeight(val:Number):void { this._cellWidth=(val*2); this._cellHeigth=val this._cellSize=val/this._anglex*.5 } /** * 索引点 * @param point * */ public function set keyPoint(point:Point):void { this._keyPoint=point; this._key=point.x+','+point.y } public function get keyPoint():Point { return this._keyPoint; } /** * 键值 * @return * */ public function get key():String { return this._key; } public function get cellSize():Number { return this._cellSize } public function get cellWidth():Number { return this._cellWidth } public function get cellHeight():Number { return this._cellHeigth } public function get origin():Point { return this._origin; } public function get leftVertex():Point { return this._leftVertex; } /** *顶部的点 * @return * */ public function get topVertex():Point { return this._topVertex; } /** *右边的点 * @return * */ public function get rightVertex():Point { return this._rightVertex; } /** * 下方的点 * @return * */ public function get bottonVertex():Point { return this._bottonVertex; } /** * 中间的点位置 * @return * */ public function get midpoint():Point { return this._midpoint; } } }