/** * 两点之间的距离 * @param startPoint * @param endPoint * @return */ private function getDistanceByPoints(startPoint:Point, endPoint:Point):Number { var distancePow:Number=Math.pow(startPoint.x - endPoint.x, 2) + Math.pow(startPoint.y - endPoint.y, 2); //左 var distance:Number=Math.pow(distancePow, 0.5); distance=Math.round(distance); return distance; } /** * point在link上的位置 * (到起始点的距离与到终点的距离之比) * @param link * @param point * @return */ private function getRateOnLine(link:Link, point:Point):Number { var fromPoint:Point=link.fromNode.centerLocation; var toPoint:Point=link.toNode.centerLocation; var rate:Number; if (fromPoint.x == toPoint.x) { rate=(fromPoint.y - point.y) / (fromPoint.y - toPoint.y); } else { rate=(fromPoint.x - point.x) / (fromPoint.x - toPoint.x); } return rate; } /** * 通过比例关系,获得link上的点的坐标 * 比例关系为到起始点的距离与到终点的距离之比 * @param link * @param rate * @return */ private function getPointByRate(link:Link, rate:Number):Point { var fromPoint:Point=link.fromNode.location; var toPoint:Point=link.toNode.location; var point:Point=new Point; //根据数学,求出直接的表达示:y=kx+b if (fromPoint.x == toPoint.x) { point.x=fromPoint.x; point.y=fromPoint.y + rate * (toPoint.y - fromPoint.y); return point; } else if (fromPoint.y == toPoint.y) { point.y=fromPoint.y; point.x=fromPoint.x + rate * (toPoint.x - fromPoint.x); return point; } else { point.x=fromPoint.x + rate * (toPoint.x - fromPoint.x); point.y=fromPoint.y + rate * (toPoint.y - fromPoint.y); } return point; } /** * 通过比例关系,获得link上的中心点的坐标 * 比例关系为到起始点的距离与到终点的距离之比 * @param link * @param rate * @return */ private function getCenterPoint(link:Link, rate:Number):Point { //link.fromNode.location var fromPoint:Point=link.fromNode.centerLocation; var toPoint:Point=link.toNode.centerLocation; var point:Point=new Point; //根据数学等比原理 if (fromPoint.x == toPoint.x) { point.x=fromPoint.x; point.y=fromPoint.y + rate * (toPoint.y - fromPoint.y); return point; } else if (fromPoint.y == toPoint.y) { point.y=fromPoint.y; point.x=fromPoint.x + rate * (toPoint.x - fromPoint.x); return point; } else { point.x=fromPoint.x + rate * (toPoint.x - fromPoint.x); point.y=fromPoint.y + rate * (toPoint.y - fromPoint.y); } return point; } /** * 线条与容器的交点 * @param fromPoint 线条(LINK)的起始点 * @param toPoint 线条(LINK)的终点 * @param uiPoint 容器的位置 * @param uiW 容器的宽度 * @param uiH 容器的高度 * @return 线条与容器的交点 */ private function getUIHitPoint(fromPoint:Point, toPoint:Point, uiPoint:Point, uiW:Number, uiH:Number):Point { var point:Point=new Point; if (fromPoint.x > toPoint.x) { point=fromPoint; fromPoint=toPoint; toPoint=point; } var hitPoint:Point=getHitPoint(fromPoint, toPoint, uiPoint, new Point(uiPoint.x, uiPoint.y + uiH)); if (hitPoint == null) { hitPoint=getHitPoint(fromPoint, toPoint, uiPoint, new Point(uiPoint.x + uiW, uiPoint.y)); if (hitPoint == null) { hitPoint=getHitPoint(fromPoint, toPoint, new Point(uiPoint.x + uiW, uiPoint.y), new Point(uiPoint.x + uiW, uiPoint.y + uiH)); if (hitPoint == null) { hitPoint=getHitPoint(fromPoint, toPoint, new Point(uiPoint.x, uiPoint.y + uiH), new Point(uiPoint.x + uiW, uiPoint.y + uiH)); } } } return hitPoint; } /** * 计算p1,p2组成的线段和p3,p4组成的线段的交点 * @param p1 线段1的起始点 * @param p2 线段1的终点 * @param p3 线段2的起始点 * @param p4 线段2的终点 * @return 线段1,2的交点 */ private function getHitPoint(p1:Point, p2:Point, p3:Point, p4:Point):Point { if (Math.min(p3.x, p4.x) > Math.max(p1.x, p2.x) || Math.min(p1.x, p2.x) > Math.max(p3.x, p4.x) || Math.min(p3.y, p4.y) > Math.max(p1.y, p2.y) || Math.min(p1.y, p2.y) > Math.max(p3.y, p4.y)) { return null; } //根据数学,求出直接的表达示:y=kx+b var p:Point=null; //两条线均不与Y轴平行 if (p1.x != p2.x && p3.x != p4.x) { var k1:Number=(p1.y - p2.y) / (p1.x - p2.x); var b1:Number=p1.y - k1 * p1.x; var k2:Number=(p3.y - p4.y) / (p3.x - p4.x); var b2:Number=p3.y - k2 * p3.x; //两条线平行 if (k1 == k2) return null; p=new Point; p.x=-(b1 - b2) / (k1 - k2); p.y=(k1 * b2 - k2 * b1) / (k1 - k2); } else { var k:Number; var b:Number; //经过p1,p2的直线与y轴平行, if (p1.x == p2.x && p3.x != p4.x) { k=(p3.y - p4.y) / (p3.x - p4.x); b=p3.y - k * p3.x; p=new Point; p.x=p1.x; p.y=k * p.x + b; } else if (p1.x != p2.x) { k=(p1.y - p2.y) / (p1.x - p2.x); b=p1.y - k * p1.x; p=new Point; p.x=p3.x; p.y=k * p.x + b; } } //如果两条线段没有相交,延长线相交则返回null if (p) { if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x) || p.x < Math.min(p3.x, p4.x) || p.x > Math.max(p3.x, p4.x) || p.y < Math.min(p1.y, p2.y) || p.y > Math.max(p1.y, p2.y) || p.y < Math.min(p3.y, p4.y) || p.y > Math.max(p3.y, p4.y)) { return null; } } return p; } /** * 点point 与 fromPoint 和 endPoint 组成的线段 水平或者竖直方向的相交点 * @param point * @param fromPoint 线段起始点 * @param endPoint 线段结束点 * @param position H(水平)/V(垂直) * @return 相交点 */ private function getStraightPoint(point:Point, fromPoint:Point, endPoint:Point, position:String="H"):Point { //根据数学,求出直接的表达示:y=kx+b var p:Point=new Point; var temp:Number; //初始判断 if (position == "H") { if (point.y > Math.max(endPoint.y, fromPoint.y) || point.y < Math.min(endPoint.y, fromPoint.y)) { return null; } if (fromPoint.y == endPoint.y && point.y == fromPoint.y) { p.y=point.y; if (point.x < (temp=Math.min(fromPoint.x, endPoint.x))) { p.x=temp; } else if (point.x > (temp=Math.max(fromPoint.x, endPoint.x))) { p.x=temp; } else { p.x=point.x; } } else if (fromPoint.x == endPoint.x) { p.x=fromPoint.x; p.y=point.y; } else { var k1:Number=(fromPoint.y - endPoint.y) / (fromPoint.x - endPoint.x); var b1:Number=fromPoint.y - k1 * fromPoint.x; p.y=point.y; p.x=Math.round((p.y - b1) / k1); } } else { if (point.x < Math.min(fromPoint.x, endPoint.x) || point.x > Math.max(fromPoint.x, endPoint.x)) { return null; } if (fromPoint.x == endPoint.x && point.x == fromPoint.x) { p.x=point.x; if (point.y < (temp=Math.min(fromPoint.y, endPoint.y))) { p.y=temp; } else if (point.y > (temp=Math.max(fromPoint.y, endPoint.y))) { p.y=temp; } else { p.y=point.y; } } else if (fromPoint.y == endPoint.y) { p.x=point.x; p.y=fromPoint.y; } else { var k2:Number=(fromPoint.y - endPoint.y) / (fromPoint.x - endPoint.x); var b2:Number=fromPoint.y - k2 * fromPoint.x; p.x=point.x; p.y=Math.round(k2 * p.x + b2); } } return p; } /** * * * * * * * * * * * * * * link * p1 * * p2 * * * * p3 * * * * * * p4 * @param node * @param link */ private function getDoorHitPoint(node:RotatableNode,link:Link):Point{ var linkUI:LinkUI = network.getElementUI(link) as LinkUI; var radius:Number = linkUI.angle; var doorAngle:Number = node.angle; var location:Point = node.location; var p1:Point = new Point; var p2:Point = new Point; var p3:Point = new Point; var p4:Point = new Point; var sin:Number = Math.sin(radius); var cos:Number = Math.cos(radius); var doorWidth:Number = 80; var doorHeight:Number = 40; if(radius>0){ if(doorAngle<90 && doorAngle>0){ p1.x = location.x + sin * doorHeight; p1.y = location.y; p2.x = location.x + node.width; p2.y = location.y + sin * doorWidth; p3.x = location.x; p3.y = location.y + cos * doorHeight; p4.x = location.x + cos * doorWidth; p4.y = location.y + node.height; }else{ p1.x = location.x; p1.y = location.y + cos * doorHeight; p2.x = location.x + cos * doorWidth; p2.y = location.y + node.height; p3.x = location.x + sin * doorHeight; p3.y = location.y; p4.x = location.x + node.width; p4.y = location.y + sin * doorWidth; } }else{ if(doorAngle<180 && doorAngle>90){ p1.x = location.x - sin * doorHeight; p1.y = location.y + node.height; p2.x = location.x + node.width; p2.y = location.y + cos * doorHeight; p3.x = location.x; p3.y = location.y - sin * doorWidth; p4.x = location.x + cos * doorWidth; p4.y = location.y; }else{ p1.x = location.x; p1.y = location.y - sin * doorWidth; p2.x = location.x + cos * doorWidth; p2.y = location.y; p3.x = location.x - sin * doorHeight; p3.y = location.y + node.height; p4.x = location.x + node.width; p4.y = location.y + cos * doorHeight; } } var point:Point = getImageHitPoint(link.fromNode.centerLocation, link.toNode.centerLocation , p1 , p2 , p3 , p4); return point; }
我的一些工具类-1000
猜你喜欢
转载自pczhuce-126-com.iteye.com/blog/1754553
今日推荐
周排行