`

判断两条线段的相对位置

    博客分类:
  • J2SE
 
阅读更多

判断两条线段的相对位置,用int[] s1表示第一条线段,int[] s2表示第二条线段,即两线段两端点的坐标为:

(s1[0],s1[1]),(s1[2],s1[3])和(s2[0],s2[1]),(s2[2],s2[3])。如果两线段没有交点则返回"NO",只有一个交点则返回"POINT",多个交点则返回"SEGMENT"。

public class TestLine {
	/**
	 * @return 上1下-1左-1右1中0
	 */
	public static int relative(int x1, int y1, int x2, int y2, int px, int py) {
		x2 -= x1;   //把x1,y1看成原点,转换成相对原点的坐标
		y2 -= y1;
		px -= x1;
		py -= y1;
		int flag = px * y2 - py * x2;  //判断P点在线段所在直线的上方还是下方还是线段上
		if (flag == 0) {
			flag = px * x2 + py * y2; //向量相乘,x1*x2+y1*y2=|a|*|b|*cosα,正负可推出相对原点(x1,y1)的位置
			if (flag > 0) {
				px -= x2;
				py -= y2;  //转换px,py相对x2,y2的坐标,即把x2,y2看成原点
				flag = px * x2 + py * y2;  //向量相乘
				if (flag < 0) {   //点位于线段上
					flag = 0;
				}
			}
		}
		return (flag < 0) ? -1 : ((flag > 0) ? 1 : 0);
	}

	public static String testState(int[] s1, int[] s2) {
		int[] state = new int[4];
		state[0] = relative(s2[0], s2[1], s2[2], s2[3], s1[0], s1[1]);
		state[1] = relative(s2[0], s2[1], s2[2], s2[3], s1[2], s1[3]);
		state[2] = relative(s1[0], s1[1], s1[2], s1[3], s2[0], s2[1]);
		state[3] = relative(s1[0], s1[1], s1[2], s1[3], s2[2], s2[3]);

		int zeroCount = 0;
		for (int i = 0; i < state.length; i++) {
			if (state[i] == 0)
				zeroCount++;
		}
		if ((state[0] * state[1] > 0) || (state[2] * state[3] > 0)) {
			return "NO";
		} else if (zeroCount > 1) {
			if (zeroCount > 2)
				return "SEGMENT";
			int index1 = 0;
			int index2 = 0;
			if (state[0] != 0)
				index1 = 2;
			if (state[2] != 0)
				index2 = 2;
			if (s1[index1] == s2[index2] && s1[++index1] == s2[++index2]) {
				return "POINT";
			}
			return "SEGMENT";
		} else
			return "POINT";
	}

	public static void main(String[] args) {
		int[] s1 = new int[] { 0, 0, 0, 1 };
		int[] s2 = new int[] { 0, 1, 0, 2 };
		System.out.println(testState(s1, s2));
	}

}

 输出结果:POINT

分享到:
评论

相关推荐

    两空间直线求交点,fortran编制

    Intersection程序说明 该程序是应聘同豪土木工程咨询... 若共面,输出两直线的平面相对位置(重合、平行或相交); 若相交,输出交点坐标. 步骤: 1.判断是否共面 2.若共面,判断平行、重合还是相交 3.若相交,求交点

    VBA进行CAD二次开发常用函数与算法.txt

    计算两条直线的交点 ...... 获得相对已知点偏移一定距离的点 已知一点,另一点相对于该点的极角(弧度)和极轴长度,求另一点的位置 两点法绘制圆、三点法绘制圆 绘制椭圆、椭圆弧的中心线 绘制面域中心线 交换...

    地理信息系统算法基础.rar

    2.19计算两条共线的线段的交点 2.20计算线段或直线与线段的交点 2.21求线段或直线与圆的交点 2.22中心点的计算 2.23过点作垂线 2.24作平行线 2.25过点作平行线 2.26线段延长 2.27三点画圆 2.28线段打断 ...

    地理信息系统算法基础

    目录序前言第1章算法设计和分析1.1概述1.2算法设计原则1.3算法复杂性的...判断两线段是否相交2.6判断矩形是否包含点2.7判断线段、折线、多边形是否在矩形中2.8判断矩形是否在矩形中2.9判断圆是否在矩形中2.10...

    人教版小学四年级数学下册期末试卷 (4).doc

    3.数学课本封面相邻的两条边互相( ),相对的两条边互相( )。 4.4.2米=( )米( )厘米。 7米6厘米=( )厘米。 5.被减数+减数+差 = 40,减数+差=( ) 6.被除数+商×除数=8,被除数=( ) 7.公元2008年全年有...

    基于图像的运动物体六自由度参数测量方法研究_付亮

    经过特征点和相应摄像机光心的两条空间直线的方程,两条直线的交点坐标 即为特征点的三维世界坐标。考虑到由于实际计算时存在各种误差,两条直 线很有可能并不相交,因此利用最小二乘法对以上的方程组进行求解。最 ...

    2011计算机辅助设计autocad测试试卷A.doc

    要求在当前绘图区中绘制线段AB,已将点A(100,100)绘制完成,B点坐标为(100 ,250),若用"相对直角坐标"输入方式应输入___@100,250_(相对前一点)__,如果 用"相对极角坐标"输入方式应输入___@50(距离和角度)_...

    图像识别的干涉方法

    把两张透明片叠在一起,使两者在横向有一相对位移,放在相干光路里,若两张透明片相同,则其夫琅和费场为匀排直线条纹所调制,根据直线条纹可判断两片的相似程度.但两片若有相对旋转,则会对识别效果有严重的影响.

    常用数据分析方法.docx

    用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。 鱼骨图(Ishikawa) 鱼骨图是一种发现问题"根本原因"的方法,它也可以称之为"因果图"。其特点是简捷实用,...

    《Excel应用大全》示例文件 光盘文件

    • 确定工资单中最后一名员工的位置 • 根据工资表生成工资条 • 利用CHOOSE函数重新生成内存数组 • 利用查找函数进行多表数据标识 • 实现多区域联合判断求值 • VLOOKUP函数实现向左查询 • 从生产配件编号中提取...

    自动打印机

    (2)摩擦传动:摩擦传动的主要功能是通过两构件之间的摩擦来传递运动和动力的,其主要优点是机构简单,而且实现无级变速传动,同时,当过载时,由于两轮间可发生滑动,因而不致造成机器的损坏。但是,这种传动的...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    5.双击这一条,可打开它的编辑对话框。我们看到Icon 项,这里可以更改“新 建”菜单的图标。 6.我们点击后面的...号,进入资源选择器,但现在这里面是空的。所以下面我 们需要给该工程添加外部资源。 7.添加资源有两...

    C# for CSDN 乱七八糟的看不懂

    C#(WINFORM)学习 一、 C#基础 基础 类型和变量 类型和变量 类型 C# 支持两种类型:“值类型”和“引用类型”。值类型包括简单类型(如 char、int 和 float 等)、枚举类型和结构类型。引用类型包括类 (Class)类 ...

Global site tag (gtag.js) - Google Analytics