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

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. php程序是如何运行,如何第一次运行PHP程序?
  2. python中常见的异常错误
  3. 众人拾柴火焰高,pmcaff捐助者答谢列表。
  4. 【IT资讯】继哈工大Matlab软件被美禁用后,华为、360再遭Docker软件禁令
  5. 注解@Component方式代替xml装配bean
  6. zookeeper+kafka+logstash+elasticsearc+kibana
  7. 【转】Unity 对象池(Object Pooling)理解与简单应用
  8. 微信小程序使用阿里字体图标库的方法
  9. ASPF与NAT ALG的工作原理与应用
  10. python-RFM模型
  11. 陈满雪冤背后英雄:上百名同学捐款数十万元
  12. FreeMarker学习手册
  13. 带你玩转序列模型之循环神经网络(一)
  14. 2021年企业十大科技趋势预测
  15. 2021-10-21分享几个贼拉好用的电脑小窍门
  16. c语言2逻辑与2是1吗,2.C语言逻辑运算符和表达式
  17. IDEA 编译gong'chenError:(1, 1) 错误: 非法字符: '\ufeff'
  18. requests模拟登陆 + 验证码
  19. 量化交易:创建签名、从okex平台获取ticker数据和k线数据
  20. 各种操作系统支持的磁盘格式对比

热门文章

  1. $con=mysql_connect_php连接mysql mysql_connect()与mysqli_connect()的盲点
  2. cmd命令不识别exp_cmd 命令行exp 命令导出数据库文件
  3. mysql 创建和删除库_mysql入门系列:mysql创建、删除和选择数据库
  4. 类写了package java命令出错_java/javac命令行如何同时引用多个包;错误 TypeError: 'JavaPackage' object is not callable 的含义...
  5. oracle12c如何存档图片,Oracle Database 12c实用教程
  6. gcn在图像上的应用_GCN的概念与应用
  7. php 递归实现无限极分类和排序_无限极分类的两种方式,递归和引用
  8. linux mint 安装内核,如何在Ubuntu, Linux Mint中安装Linux Kernel 4.18
  9. python怎么导出程序_[272]如何把Python脚本导出为exe程序
  10. Vue的钩子函数是什么意思?Vue都有哪些钩子函数?