`
琛哥哥
  • 浏览: 32314 次
  • 性别: 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;
}
分享到:
评论

相关推荐

    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...

    hibernate的大部分的工具类

    在这个“hibernate的大部分的工具类”压缩包中,我们很可能会找到一系列帮助简化Hibernate操作的实用工具类。这些工具类通常包括对数据操作的辅助方法、空值检查、分页处理以及HQL查询的通用分页功能。 首先,让...

    XBT-L1000-3.rar

    在处理这类文件时,我们需要确保我们的计算机上装有适当的解压工具,如WinRAR或7-Zip,以便能够打开并访问文件内容。 【压缩包子文件的文件名称列表】中的"2007ZDH2007LW11001047.pdf"揭示了压缩包内的一个PDF文件...

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

    这份“行业分类-电子政务-1000MW核电站主泵油密封组件的安装和拆卸专用工具.pdf”文件,很显然,提供了详尽的说明和分析,旨在指导专业人员正确执行操作。 油密封组件在核电站中的作用是防止冷却剂泄漏,确保泵的...

    2020最新Java企业面试题汇总-1000多份.txt

    - **并发工具类**:ExecutorService、Callable、Future、CountDownLatch、CyclicBarrier。 #### 4. 输入/输出流 - **字节流**:InputStream、OutputStream。 - **字符流**:Reader、Writer。 - **缓冲流**:...

    hutool一个Java基础工具类

    《Hutool:Java基础工具类的全面解析》 在Java开发中,高效便捷的工具类库是提高开发效率和代码质量的关键。Hutool就是这样一款强大的Java基础工具类库,它对Java SDK中的众多功能进行了封装,为开发者提供了丰富的...

    Date日期操作工具类

    在Java编程中,Date类是处理日期和时间的基础类,但在实际开发中,由于Date类本身的API设计并不十分友好,通常我们会使用工具类来简化日期的处理工作。本主题聚焦于一个名为"Date日期操作工具类"的实用工具,它提供...

    倒计时工具类

    在Android开发中,倒计时工具类是一种常用的组件,尤其在电商、抢购等场景下,用于显示商品剩余可购买时间或活动剩余时间。本文将详细介绍如何创建和使用一个名为"倒计时工具类"的Java类,以及如何在ListView的item...

    深信服ac1000 说明书

    - **抓包工具**:捕获网络数据包,分析网络通信问题。 - **命令控制台**:执行高级命令,进行底层调试。 - **Bypass与拦截定位**:定位网络故障点,快速恢复服务。 - **重启操作**:在必要时重启设备,解决暂时性的...

    通过封装的工具类,来计算XIRR内部收益率

    在给定的压缩包文件中,我们可以看到一个名为"util"的工具类,这是用来计算XIRR的核心组件。这个工具类很可能包含了计算XIRR所需的关键算法和方法。下面,我们将深入探讨XIRR的计算原理和如何利用编程实现。 1. **...

    java 日期操作工具类:包括计算两个时间相差距离多少天多少小时多少分多少秒

    这篇博客文章“java 日期操作工具类:包括计算两个时间相差距离多少天多少小时多少分多少秒”提供了一个实用的工具类,帮助开发者更方便地处理日期和时间差异。下面将详细解释这个工具类中的关键知识点。 1. **Java...

    雪花算法工具类

    `ResigerTest` 是雪花算法工具类的测试类,通常会包含一些测试用例来验证 `SnowflakeIdWorker` 的正确性。这些测试用例可能包括: 1. **基本功能测试**:检查是否能正常生成ID,ID的各个部分是否符合预期。 2. **...

    日期工具类,包括各种日期之间的转换

    根据提供的文件信息,本文将对日期工具类进行深入解析,并详细介绍其包含的主要功能与实现方法。此工具类主要涉及到了日期格式化、日期解析、获取当前时间等实用操作。 ### 一、概述 该日期工具类名为 `DateUtil`...

    新的方法球10-1000内的素数 C#

    总之,求解素数是计算机科学中的基本问题,而C#提供了丰富的工具和库来解决这类问题。通过控制台程序,我们可以清晰地展示算法的执行过程,并且方便地进行调试和测试。对于这个新的求素数方法,尽管描述简略,但我们...

    常识判断1000题(801--1000)(1).zip

    总的来说,这个“常识判断1000题(801--1000)(1).zip”文件是一个实用的学习工具,旨在帮助用户通过练习提升常识理解和判断能力,覆盖多学科领域的知识,适合备考、自我提升或教学使用。使用时,配合DOCX文档进行阅读...

    通知常用工具类

    根据提供的文件信息,我们可以总结出以下关于Android通知(Notification)工具类的相关知识点: ### 一、导入必要的包 首先,为了实现通知功能,我们需要导入一些Android SDK中的必要包: ```java import android....

    Python-FSS1000面向少样本分割的1000类图片数据集

    为了解决这个问题,"Python-FSS1000面向少样本分割的1000类图片数据集"(FSS-1000)应运而生。 FSS-1000数据集旨在推动少样本分割(Few-Shot Segmentation)的研究,这是一个在少量样本上训练模型以进行高精度图像...

    Android获取网络定位封装工具类

    本篇文章将详细解析如何在Android中封装一个网络定位工具类,以便快速、高效地获取到设备的经纬度坐标。 首先,我们要引入必要的依赖。在`build.gradle`模块文件中,确保已添加Google Play服务的地点库: ```...

    .Net数据库生成测试数据工具类

    本文将详细讲解如何使用一个自定义的.NET工具类来高效地生成数据库测试数据,支持包括MSSQL、Oracle、MySQL以及OleDb等多种数据库类型。 首先,这个工具类的设计目标是为了简化数据库填充过程,避免手动输入大量...

    JDBC工具类

    ### JDBC工具类——DBUtils详解 #### 一、概述 在Java编程中,数据库操作是一项常见且基础的任务。然而,直接使用JDBC进行数据库交互时,我们常常会遇到大量重复的代码片段,如连接数据库、执行SQL语句、处理结果...

Global site tag (gtag.js) - Google Analytics