两条线段相交当且仅当下面两个条件至少成立一个:

1.每条线段都跨越了包含另一条线段的直线。
2.一条线段的某个端点落在了另一条线段上。(这一情况来自于边界情况)

在判断线段的相交时我们可以利用向量的叉积。当两条向量在一条直线上时,向量的叉积等于 0 ,即上面的第二种情况,所以判断两条线段相交就分为两种情况讨论:1.向量的叉积不等于 0 ;2.向量的叉积等于 0 。

一.叉积不等于 0

首先:我们要判断点 p3,p4 分布在线段 p1 p2 两边。如下图所示:

① 根据向量的叉积,如果 p1p4 * p1p2 > 0 则表示向量 p1p2 在向量 p1p4 的逆时针方向,根据 p1p2 * p1p3 > 0,可以判断 p1p3 在 p1p2 的逆时针方向。这时就可以判断点p3,p4 在线段 p1p2 的两端。

② 同理,我们可以判断 p1,p2 分布在线段 p3 p4 的两端。

如果同时满足①,② 成立,则这两个线段就相交

二.叉积等于 0

当叉积等于 0 的时候,只需要判断这三个点是否在同一条直线上就可以了。

java 代码如下:

/*** @date  2015年9月16日*/
package geometry;import java.util.Scanner;public class Segment {/*** 返回向量:(pi-pk)*(pi-pj) 的叉积* pi, pj, pk, 分别是平面上的三点坐标,* pi[0] -> x* pi[1] -> y* @return int*/private int direction(int[] pi, int[] pj, int[] pk){return (pi[0]-pk[0])*(pi[1]-pj[1]) - (pi[0]-pj[0])*(pi[1]-pk[1]);}/*** 判断点pk是否在线段 pi,pj 上* @return boolean*/private boolean onSegment(int[] pi, int[] pj, int[] pk) {if ( Math.min(pi[0], pj[0]) <= pk[0] && pk[0] <= Math.max(pi[0], pj[0]) && Math.min(pi[1], pj[1]) <= pk[1] && pk[1] <= Math.max(pi[1], pj[1]) ) {return true;}else {return false;}}// 判断线段 p1,p2 和线段 p3,p4 是否相交public boolean segmentInsert(int[] p1, int[] p2, int[] p3, int[] p4) {int d1 = direction(p3, p4, p1);int d2 = direction(p3, p4, p2);int d3 = direction(p1, p2, p3);int d4 = direction(p1, p2, p4);if ( ((d1>0 && d2<0) || (d1<0 && d2>0)) &&((d3>0 && d4<0) || (d3<0 && d4>0))) {return true;} else if ( d1==0 && onSegment(p3, p4, p1)) {return true;} else if ( d2==0 && onSegment(p3, p4, p2)) {return true;} else if ( d3==0 && onSegment(p1, p2, p3)) {return true;} else if ( d4==0 && onSegment(p1, p2, p4)) {return true;} else {return false;}}public static void main(String[] args){Segment segment = new Segment();Scanner in = new Scanner(System.in);int[] p1 = {in.nextInt(), in.nextInt()};int[] p2 = {in.nextInt(), in.nextInt()};int[] p3 = {in.nextInt(), in.nextInt()};int[] p4 = {in.nextInt(), in.nextInt()};if (segment.segmentInsert(p1, p2, p3, p4)) {System.out.println("相交");} else {System.out.println("不相交");}}
}

判定两个点是否在一条直线的同一侧_计算几何01-判定两条线段是否相交相关推荐

  1. 判断两条直线是否相交c语言,计算几何-两条线段是否相交(三种算法)

    原标题:计算几何-两条线段是否相交(三种算法) 计算几何中,判断线段是否相交是最基本的题目. 所谓几何, 最基本的当然就是坐标, 从坐标中我们可以知道位置和方向,比如:一个点就是一个位置,两点确定一条 ...

  2. 两直线平行交叉相乘_计算几何算法5. 直线、线段和平面相交(2D和3D)

    直线和线段相交 平面相交 直线-平面相交 两平面相交 三个平面相交 实现 intersect2D_2Segments() inSegment() intersect3D_SegmentPlane() ...

  3. java根据两条直线的四个坐标点证明这两条线平行(计算直线斜率)或者三个点在一条直线上

    第一步:原理: 1.若两条直线斜率存在,则:斜率相等,则这两直线平行; 2.若两条直线斜率都不存在,则这两条直线也平行.所以说,如果两条直线平行,则它们的斜率相等[是错误的] 反过来:若两直线斜率相等 ...

  4. 判断两条线段是否相交 java_判断两个线段是否相交02

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  5. 两直线平行交叉相乘_人教版初中数学七年级下册 平行线判定2公开课优质课课件教案视频...

    平 行 线 的 判 定 一.教材分析 1.主要内容及其地位 本节的主要内容是平行线的判定公理及两个判定定理,由分析画平行线的过程得知,画平行线实际上就是画相等的同位角,由此得到平行线的判定公理--&q ...

  6. 两条直线求交点c语言,C§ 3.3.1两条直线的交点坐标(5页)-原创力文档

    § 3.1两条直线的交点坐标 学习目标 1.掌握判断两直线相交的方法:会求两直线交点坐标: 2.体会判断两直线相交中的数形结合思想. 学习过程 一.课前准备: (预习教材P112~ P114,找出疑 ...

  7. 求两条直线(线段)的交点

    转自: http://blog.csdn.net/dgq8211/article/details/7952825 如图,如何求得直线 AB 与直线 CD 的交点P? 以上内容摘自<算法艺术与信息 ...

  8. 如何判断两条直线是否相交

    之前写过一篇如何判断两条线段是否相交,我们紧接这个主题,再来谈谈如何判断两条直线是否相交 如何判断两条直线是否相交 总体来上,判断直线是否相交比判断线段是否相交容易多了 两条直线相交只有两种情况 第一 ...

  9. LintCode 最多有多少个点在一条直线上

    题目 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. 解决思路 重复的点没有必要去 ...

最新文章

  1. Python3 如何优雅地使用正则表达式(详解五)
  2. 理解Prefix.pch文件
  3. freebsd 安装教程
  4. 消息中间件--RabbitMQ ---TTL队列/消息
  5. 实战java虚拟机配套代码
  6. Java基础——泛型
  7. 第八章 面向对象编程简介
  8. python分析财务报表
  9. python之 pyCharm pip安装pandas库失败
  10. javascript new对象的过程
  11. 智能计算机与应用期刊,智能计算机与应用期刊是省级期刊吗
  12. 弄懂了阴阳转换,穴位或为丹田的宿
  13. 《RAFT-Stereo:Multilevel Recurrent Field Transforms for Stereo Matching》论文笔记
  14. Trajectory generation for quadrotor while tracking a moving target in cluttered environment
  15. Win10 WSL2 linux 子系统安装Docker
  16. 网络信息安全攻防学习平台——基础关
  17. 算法作业(4):旅行者问题
  18. python里 tan的倒数怎么表示_Python sympy.tan方法代码示例
  19. Three.js 后期处理-物体边界线条高亮处理-OutlinePass
  20. java byte_Java byte数据类型详解

热门文章

  1. java 手机信息管理系统照相功能_Android实现手机拍照功能
  2. java行转列_Java后端面试标准:如何准备一场后端面试?
  3. 删除元素值最大的结点
  4. matlab分支定界法linprog_序列比对(二十二)——中间字符串分支定界方法中更紧的界...
  5. linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...
  6. 语言程序推箱子课设报告_“延期不延学”第13期 | C++篇 | c++课设建议
  7. this.scrollheight获取textarea的高度是0_【2019年14卷3期】UHF传感器固定角度和加装屏蔽罩对有效高度的影响丨电气工程学报文章推荐...
  8. 微软高性能计算服务器pdf,微软高性能计算HPCserver2008技术概览.pdf
  9. vs2008安装_Visual Studio2008安装教程
  10. linux 文本 编辑 软件下载,文本编辑软件 Atom 1.5.0 已经发布下载