我的一些工具类-1000

/**
* 两点之间的距离
* @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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值