两条线段是否相交,计算交点公式。
A本身无限长,假设B也无限长,直接求得AB的交点坐标,然后再判断该坐标是否在定长线段B的内部就可以了啊
AB本身就是两条直线,知道两端点就可以知道其直线方程,B也是一样,两个方程联立,
得到一个坐标,再看该坐标是否在B的定义域内就可以啊
A的两点为(x1,y1),(x2,y2)
则A的直线方程为l1:y-y1=(y2-y1)(x-x1)/(x2-x1)
B的两点为(x3,y3),(x4,y4)
则B的直线方程为l2:y-y3=(y4-y3)(x-x3)/(x4-x3)
联立解出交点坐标为的横坐标为:
x=(k2x3-y3-k1x1+y1)/(k2-k1)
其中k1=(y2-y1)/(x2-x1)
k2=(y4-y3)/(x4-x3)
可以推导出来
x = ((x2 - x1) * (x3 - x4) * (y3 - y1) -
x3 * (x2 - x1) * (y3 - y4) + x1 * (y2 - y1) * (x3 - x4)) /
((y2 - y1) * (x3 - x4) - (x2 - x1) * (y3 - y4));
同理也可以推导出y的值:
y = ((y2 - y1) * (y3 - y4) * (x3 - x1) -
y3 * (y2 - y1) * (x3 - x4) + y1 * (x2 - x1) * (y3 - y4)) /
((y2 - y1) * (y3 - y4) - (y2 - y1) * (x3 - x4));
发现x和y的求解公式,结构相同,只要把x换成y下标不变,就是求解y值的公式,
原理部分来自 http://zhidao.baidu.com/question/191530048.html?push=ql
********************************************************************
下面附上java的实现,
前提是:a 线段1起点坐标
b 线段1终点坐标
c 线段2起点坐标
d 线段2终点坐标
import java.awt.Point;
public class AlgorithmUtil {
public static void main(String[] args) {
AlgorithmUtil.GetIntersection(new Point(1, 2), new Point(1, 2),
new Point(1, 2), new Point(1, 2));
AlgorithmUtil.GetIntersection(new Point(1, 2), new Point(1, 2),
new Point(1, 4), new Point(1, 4));
AlgorithmUtil.GetIntersection(new Point(100, 1), new Point(100, 100),
new Point(100, 101), new Point(100, 400));
AlgorithmUtil.GetIntersection(new Point(5, 5), new Point(100, 100),
new Point(100, 5), new Point(5, 100));
}
/**
* 判断两条线是否相交 a 线段1起点坐标 b 线段1终点坐标 c 线段2起点坐标 d 线段2终点坐标 intersection 相交点坐标
* reutrn 是否相交: 0 : 两线平行 -1 : 不平行且未相交 1 : 两线相交
*/
private static int GetIntersection(Point a, Point b, Point c, Point d) {
Point intersection = new Point(0, 0);
if (Math.abs(b.y - a.y) + Math.abs(b.x - a.x) + Math.abs(d.y - c.y)
+ Math.abs(d.x - c.x) == 0) {
if ((c.x - a.x) + (c.y - a.y) == 0) {
System.out.println("ABCD是同一个点!");
} else {
System.out.println("AB是一个点,CD是一个点,且AC不同!");
}
return 0;
}
if (Math.abs(b.y - a.y) + Math.abs(b.x - a.x) == 0) {
if ((a.x - d.x) * (c.y - d.y) - (a.y - d.y) * (c.x - d.x) == 0) {
System.out.println("A、B是一个点,且在CD线段上!");
} else {
System.out.println("A、B是一个点,且不在CD线段上!");
}
return 0;
}
if (Math.abs(d.y - c.y) + Math.abs(d.x - c.x) == 0) {
if ((d.x - b.x) * (a.y - b.y) - (d.y - b.y) * (a.x - b.x) == 0) {
System.out.println("C、D是一个点,且在AB线段上!");
} else {
System.out.println("C、D是一个点,且不在AB线段上!");
}
return 0;
}
if ((b.y - a.y) * (c.x - d.x) - (b.x - a.x) * (c.y - d.y) == 0) {
System.out.println("线段平行,无交点!");
return 0;
}
intersection.x = ((b.x - a.x) * (c.x - d.x) * (c.y - a.y) -
c.x * (b.x - a.x) * (c.y - d.y) + a.x * (b.y - a.y) * (c.x - d.x)) /
((b.y - a.y) * (c.x - d.x) - (b.x - a.x) * (c.y - d.y));
intersection.y = ((b.y - a.y) * (c.y - d.y) * (c.x - a.x) - c.y
* (b.y - a.y) * (c.x - d.x) + a.y * (b.x - a.x) * (c.y - d.y))
/ ((b.x - a.x) * (c.y - d.y) - (b.y - a.y) * (c.x - d.x));
if ((intersection.x - a.x) * (intersection.x - b.x) <= 0
&& (intersection.x - c.x) * (intersection.x - d.x) <= 0
&& (intersection.y - a.y) * (intersection.y - b.y) <= 0
&& (intersection.y - c.y) * (intersection.y - d.y) <= 0) {
System.out.println("线段相交于点(" + intersection.x + "," + intersection.y + ")!");
return 1; // '相交
} else {
System.out.println("线段相交于虚交点(" + intersection.x + "," + intersection.y + ")!");
return -1; // '相交但不在线段上
}
}
}
两条线段是否相交,计算交点公式。相关推荐
- 【数学计算】判断两条线段是否相交+计算两条线段的交点和夹角
序言 还是那句话,学习是为了应用.书到用时方恨"用得少" 1. 计算两条直线的交点 直线一般式方程 A x + B y + C = 0 Ax+By+C = 0 Ax+By+C=0 ...
- 二维空间内,如何判断两条线段是否相交,相离,平行,重合,并求交点
首先,假设有两条线段p,q,求这两条线段的空间关系. 我们把两条线段的四个顶点看为向量,用坐标表示:p1(p1x,p1y), p2(p2x,p2y), q1(q1x,q1y), q2(q2x, q2y ...
- 判断两条直线是否相交c语言,计算几何-两条线段是否相交(三种算法)
原标题:计算几何-两条线段是否相交(三种算法) 计算几何中,判断线段是否相交是最基本的题目. 所谓几何, 最基本的当然就是坐标, 从坐标中我们可以知道位置和方向,比如:一个点就是一个位置,两点确定一条 ...
- 如何判断两条线段是否相交
本篇是在 [C++笔记]如何判断2个线段相交 的基础上加上自己的理解和实践总结出的判断两线段是否相交的方法. 判断两条线段是否相交 先附上判断函数 bool judge(int Ax1,int Ay1 ...
- 判断两条线段是否相交
如上图,判断线段AB和线段CD相交. 分析:如果线段AB和线段CD相交,只能是图中的两种相交情况.可以用向量叉乘来判断.如果(向量AB叉乘向量AC)*(向量AB叉乘向量AD)<= 0 并且(向量 ...
- 计算几何-判断两条线段是否相交
原理:如果两条线段相交,那么必须跨立,就是以一条线段为标准,另一条线段的两端点一定在这条线段的两段 也就是说a b两点在线段cd的两端,c d两点在线段ab的两端 struct point() {do ...
- 判断两条线段/直线相交,并求交点
一.矢量基本知识 因为后面的计算需要一些矢量的基本知识,这里只是简单的列举如下,如果需要更加详细的信息,可以自行搜索wikipedia或google. 1.矢量的概念:如果一条线段的端点是 ...
- Unity3D C#数学系列之判断两条线段是否相交并求交点
1 引言 问题:已知三维空间中四点A.B.C.D,如何判断线段AB与CD是否相交,若相交则求出交点. 分析: AB.CD要相交,则AB.CD必须要在同一平面内 快速排斥和跨立实验判断是否相交 几何法分 ...
- 判断两条线段是否相交 java_判断两个线段是否相交02
写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...
- 【转载】判断两条线段是否相交——(向量叉乘)
原文:https://www.cnblogs.com/tuyang1129/p/9390376.html 实现:https://blog.csdn.net/yegshun/article/detail ...
最新文章
- 华为 Java 编程军规
- Oracle 12c 多租户 CDB 与 PDB之 shared undo 与 Local undo 切换
- asp.net 漂亮搜索框_推荐4款影视搜索工具,十一假期让你看剧看到爽
- [unreal4入门系列之二] 下载和安装虚幻4游戏引擎
- 数据中心成为生态系统向绿色氢经济转变的催化剂
- PHP实现前台页面与MySQL的数据绑定、同步更新
- vb mysql_VB连接MYSQL实例
- MacOS系统自带截图快捷键
- freemarker处理EL表达式
- java 随机获取4个数字_java入门-验证码 今天查到的一个简单随机生成4位数字的验证码-jsp...
- 玩转matlab之一维 gauss 数值积分公式及matlab源代码
- How to get data from Oracle DB in silverlight via WCF ?
- html如何让图片边缘模糊化,CSS3对图片照片进行边缘模糊处理
- 听音扒谱app_掌握这些,你也可以轻松扒谱(下)
- SuperCard与GBA
- 数学 - 泰勒公式,常见麦克劳林公式及Maple函数拟合
- Win10 外接显示器,Chrome花屏/视频全屏黑屏解决方法
- python面向对象爬取某鱼颜值区主播图片
- Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信)
- mysql事务锁死_mysql事务里锁死
热门文章
- 深度学习系统中的log问题
- 医学中的计算机科学与技术学院,【建校60周年献礼】信息技术学院成功举办“隐结构及其在中医药研究的应用暨计算机科学与技术学科建设”学术论坛...
- php sg11加密方式,SG11加密使用、安装配置说明
- ES6 进阶:你不知道的 Rest 参数与 Spread 语法细节
- mysql查询供应3号的顾客_现有一个商店的数据库,记录顾客及其购物情况,根据要求解答问题...
- 浙大开源:5 笔涂出一只 3D 猫咪模型,可跑可跳无需手动绑定骨骼
- 竞争神经网络 python_用python解决kaggles奔驰环保竞争
- 计算机软件工程师考试积分入户深圳,信息处理技术员初级证书入户深圳能加分吗...
- ISA指令集基础应用
- 微信获取好友、公众号、群聊的信息