`
琛哥哥
  • 浏览: 30404 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

我的一些工具类-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;
}
分享到:
评论

相关推荐

    行业分类-电子-1000MW核电站主泵油密封组件的安装和拆卸专用工具的说明分析.rar

    行业分类-电子-1000MW核电站主泵油密封组件的安装和拆卸专用工具的说明分析.rar

    hibernate的大部分的工具类

    这里面包含了大部分hibernate大部分常用的工具类和判断是否为空的工具类还有是否分页和hiberntae的hql通用分页

    java时间处理工具类--DateUtils

    long time = this.fiducialDate.getTime() - 60 * 60 * 24 * 1000; return new Date(time); } public Date getTomorrow(){ long time = this.fiducialDate.getTime() + 60 * 60 * 24 * 1000; return new...

    java常用工具类的使用

    在Java开发类库中,提供了很多工具类,我们即将学习最常见的工具类,比如对日期的操作,对集合的操作等。具体更多的工具类,请参考JavaDoc文档。 2. java.util.Date类 Date类包装了毫秒值,毫秒值表示自1970年1月1...

    1000份前端js代码模板可做工具类

    1000份前端js代码模板可做工具类

    androidButton工具类

    Button工具类 * 判断两次点击的时间 * 防止用户误点 判断两次点击的间隔,如果小于1000,则认为是多次无效点击

    idmiss-common:自己写的一些工具类,生成顺序号订单、通用excel导出,验证码等等。。

    idmiss-common 自己写的一些工具类,生成顺序号订单、通用excel导出,验证码等等。。。 version 1.0.0 2018.7.11 生成顺序订单号 [type]yyyyMMdd[顺序号] 效率 2500+/s 1000W+/h 订单的生成

    python实现简单日期工具类

    本文实例为大家分享了python实现简单日期工具类的具体代码,供大家参考,具体内容如下 import datetime import time DATETIME_FORMAT = %Y-%m-%d %H:%M:%S TIME_FORMAT = %H:%M:%S #当前毫秒数 def curMilis(): ...

    网络测试仪器的使用说明

    Linkrunner LinkRunnerPRO LRPRO-1000 增强型链路通 Linkrunner Pro-1000 LinkRunner Pro Network Multimeter增强型链路通(网络万用表增强型) LRPRO-KIT链路通测试仪套件,FLUKE NETTOOL增强型网络万用表、 MT-8200-...

    ForkJoinUtil.java,一个分而治之的框架工具类

    Fork/Join框架的测试demo,含源代码。 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务...+10000,可以分割成10个子任务,每个子任务分别对1000个数进行求和,最终汇总这10个子任务的结果

    Android编程实现将时间转化成几分钟前、几天前等形式的工具类

    本文实例讲述了Android编程实现将时间转化成几分钟前、几天前等形式的工具类。分享给大家供大家参考,具体如下: 描述: 在Android开发客户端的时候,是在会显示时间是多久之前,比如10分钟前,8小时前,一月前等等...

    Msql、Oracl相互转化工具

    压缩包内包含ora2mysql工具及mysql2ora工具。 分别支持oracle转mysql库及mysql库转oracle库。 其中有个文档简单描述了在Oracle为64位情况下,工具连接oracle时会出现oci.dll找不到或者ora-12514的错误。 这需要oracle...

    ip-guard网络监控-管理利器--完美破解406用户--申精~1000%可用

    经过严格测试18个包 100%可以用,我本来就想一个包的,可是没办法CTO限制每个包2M,大家慢慢来不要急,好软件难求~ IP-guard将为企业解决以下问题: 保护机密商业资料 详细记录文件操作(打开、修改、删除等)...

    wsyscheck--强大的清理病毒木马的工具

    Wsyscheck是一款手动清理病毒木马的工具,其目的是简化病毒木马的识别与清理工作。 一般来说,对病毒体的判断主要可以采用查看路径,查看文件名,查看文件创建日期,查看文件厂商,微软文件校验,查看启动项等方法...

    redes-t1000:任务 1 | 计算机网络 (ILI-256) 2015-1 | UTFSM 圣地亚哥

    网络-t1000 任务 1 | 计算机网络 (ILI-256) 2015-1 | UTFSM 圣地亚哥在软件工程中,Web 应用程序被定义为用户可以通过 Internet 访问 Web 服务器或通过浏览器访问 Intranet 来使用的那些工具(来源:维基百科)。...

    Android代码-LeonEasyPermissions

    android6.0权限请求工具类的简单封装 权限检查工具类的封装 &gt;本项目主要业务逻辑参考:https://github.com/rebus007/PermissionUtils &gt; &gt;我只是针对个人的爱好对源码进行改动,如有不妥之处,请联系我删除 演示效果...

    C# to Java 代码转换工具

    一个很强大的工具, 能将c#代码片段、文件甚至工程直接转换成java代码,并能彻底解决外部引用的DLL问题,最强的是支持c#工程的直接转换,生成的Java代码质量也很不错。软件已破解,去除了未注册版最多只能转换1000行的...

    SnowflakeIdWorker.java

    * * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L ) / (1000L * 60 * 60 * 24 * ...

    awesome-MATLAB:精选的MATLAB工具箱,应用程序,软件和资源的精选清单

    类MATLAB环境 杂项免费工具箱 资源 网站 网志 图书 参考卡 社交媒体 MOOCs 技巧和窍门 贡献 MATLAB中的高性能计算 并行计算工具箱-Mathworks工具箱。 提供对各种并行编程范例的支持,以将MATLAB扩展到1000个CPU...

    E语言1000模块

    。 2008-11-08 14:41 文件夹 文件夹 易语言模块大全 2005-10-21 15:30 14489 3100 易语言模块大全\24位转单色位图模块.ec 2007-01-18 07:00 7110 2339 易语言模块大全\69msn.ec 2005-05-26 02:18 4070 1472 ...

Global site tag (gtag.js) - Google Analytics