直线与直线、直线与圆、直线与矩形的交点

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

求直线与直线、直线与圆、直线与矩形的交点

  1. 直线与直线的交点:a1x + b1x + c1x = 0 与 a2x + b2x + c2x = 0的交点坐标可直接根据公式x = (b1c2 - b2c1)/(a1b2 - a2b1),y = (a2c1 - a1c2)/(a1b2 - a2b1)得出,其中a1b2 - a2b1 == 0时,代表两条直线重合或平行
  2. 直线与圆的交点:通过将圆心到直线的距离d与半径r大小对比分三种情况讨论:1)d>r,没有交点 2)d=r,一个交点 3)d<r,两个交点,具体设计可参考下图(此图是在网上搜方法看到的,原地址找不到了,如有侵犯还请原谅,感谢原主的帮助):在这里插入图片描述
  3. 直线与矩形的交点:问题可以简化为求直线与构成矩形的四条线段的交点,方法为:假设求直线PQ与线段AB的交点,首先求A到直线PQ的带符号距离d和B到直线PQ的带符号距离d2,如果d1与d2异号或其中至少有一个为0,则交点存在,假设交点为M。D1为A到直线PQ的距离,D2为B到直线PQ的距离,求线段AM占段线AB的比例k=D1/(D1+D2);如果D1+D2==0,即D1和D2均为0,也就是说段线AB与直线PQ重合。有了线段AM点AB的比例k,就可以求出M了: M = A + (B - A) * k;如果d1与d2同号的话就表示直线与线段没有交点。

在以上方法中还有一些需要关注的细节点
1)直线在讨论的过程中需要将直线平行于x,y轴的情况单独讨论
2)求直线与矩形交点时,当交点正好是矩形的顶点时,简单求直线与四条线段的交点会造成顶点在其邻线段被重复计算,因此在计算每条线段时舍去线段的一个端点

代码如下:

/*本程序采用java语言,实现直线与直线、直线与圆、直线与矩形的交点
以(0,0)为坐标原点,建立直角坐标 
直线: a*x +b*x +c = 0  参数:a, b, c
圆 参数 :圆心坐标(x0, y0)  半径 r
矩形参数:三个顶点坐标A:(x1, y1)B:(x2, y2)C:(x3, y3)  限制∠ABC构成直角*/

package robotcup;

public class GetIntersection {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		pointTwoLine(1, 1, -1, 1, -1, 0);//求两直线交点   直线一:x+y-1=0  直线二:x-y=0
		pointLineCircle(1, 1, -1, 1, 1, 1);//求直线与圆的交点  直线:x+y-1=0     圆心:(1,1) r=1
		pointLineRectangular(1, 1, -0.5, 0, 1, 0, 0, 1, 0);//求直线与矩形的交点   直线:x+y-1=0   矩形 三个顶点坐标为A:(0, 1)B:(0, 0)C:(1, 0)
	}
	//求两直线交点
	public static void pointTwoLine(double a1,double b1, double c1, double a2,double b2, double c2 ){
		double x,y;
		if(a1*b2 - a2*b1 == 0){//判断直线是否重合或平行
			System.out.println("两直线重合或平行");
			return;
		}
		x = (b1*c2 - b2*c1)/(a1*b2 - a2*b1);//求交点公式
		y = (a2*c1 - a1*c2)/(a1*b2 - a2*b1);
		System.out.println("两直线交点坐标为:"+"("+ x +","+ y +")");//打印结果
	}
	//求直线与圆交点
	public static void pointLineCircle(double a,double b, double c, double x, double y, double r) {
		double d;//d为点到直线的距离
		d = (a*x+ b*y +c)/(Math.sqrt(a*a + b*b));
		d = Math.sqrt(d*d);//取d的正数
		if(d > r){
			System.out.println("直线和圆没有交点");
			return;
		}
		//直线与圆有一个交点
		else if(d == r){
			if(b == 0){//当直线平行于y轴时,交点直接位于过圆心平行x轴的方向上距离为r  直线方程可表示为: x = -c/a
				if(-c/a > x){//交点位于圆点右侧
					System.out.println("直线与圆的交点坐标为:"+"("+ (x+r) +","+ y +")");//打印结果
					return;
				}
				else {//交点位于圆点左侧
					System.out.println("直线与圆的交点坐标为:"+"("+ (x-r) +","+ y +")");//打印结果
					return;
				}
			}
			else if(a == 0){//直线平行于x轴
				if(-c/b > y)//交点位于圆点上方
					System.out.println("直线与圆的交点坐标为:"+"("+ x +","+ (y+r) +")");//打印结果
				else{//交点位于圆点下方
					System.out.println("直线与圆的交点坐标为:"+"("+ x +","+ (y-r) +")");//打印结果
				}
			}
			else {//当直线与x,y轴均不平行时
				pointLineCircle(a, b, c, a, -b, b*y-a*x);//交点为直线与过原点且垂直于直线的直线的交点
				return;
			}
		}
		//直线与圆有两个交点
		else {
			if(b == 0){//当直线平行于y轴时
				if(-c/a > x){//交点位于圆点右侧
					System.out.println("直线与圆的交点坐标为:"+"("+ (x+d) +","+ (y+Math.sqrt(r*r-d*d)) +")"+"("+ (x+d) +","+ (y-Math.sqrt(r*r-d*d)) +")");//打印结果
					return;
				}
				else{//交点位于圆点左侧
					System.out.println("直线与圆的交点坐标为:"+"("+ (x-d) +","+ (y+Math.sqrt(r*r-d*d)) +")"+"("+ (x-d) +","+ (y-Math.sqrt(r*r-d*d)) +")");//打印结果
					return;
				}
			}
			else if(a == 0){//直线平行于x轴
				if(-c/b > x){//交点位于圆点上方
					System.out.println("直线与圆的交点坐标为:"+"("+ (x+Math.sqrt(r*r-d*d)) +","+ (y+d) +")"+","+"("+ (x-Math.sqrt(r*r-d*d)) +","+ (y+d) +")");//打印结果
					return;
				}
				else{//交点位于圆点下方
					System.out.println("直线与圆的交点坐标为:"+"("+ (x+Math.sqrt(r*r-d*d)) +","+ (y-d) +")"+","+"("+ (x-Math.sqrt(r*r-d*d)) +","+ (y-d) +")");//打印结果
					return;
				}
			}
			else {//当直线与x,y轴均不平行时
				double a1, b1, c1, a2, b2, c2;
				double x3, y3;//定义圆心在直线上的投影点坐标
				double d3;//定义直线在圆内的1/2倍线段长
				d3 = Math.sqrt(r*r - d*d);
				a1 = a; b1 = b; c1 = c; 
				a2 = a; b2 = -b; c2 = b*y - a*x; 
				x3 = (b1*c2 - b2*c1)/(a1*b2 - a2*b1);//求出圆心在直线上的投影点坐标
				y3 = (a2*c1 - a1*c2)/(a1*b2 - a2*b1);
				double x0, y0, d0;//定义直线上的单位向量e(x0, y0) 以及投影点到直线上点(0, -c/b)的距离d0
				d0 = Math.sqrt(x3*x3+(y3+c/b)*(y3+c/b));
				x0 = x3/d0;
				y0 = (y3+c/b)/d0;
				System.out.println("直线与圆的交点坐标为:"+"("+ (x3+x0*d3) +","+ (y3+y0*d3) +")"+","+"("+ (x3-x0*d3) +","+ (y3-y0*d3) +")");//打印结果
			}
		}
	}
	//求(x,y)到直线的带符号距离
	public static double getSignedDistance(double a, double b, double c, double x, double y) {
		double d = (a*x+ b*y +c)/(Math.sqrt(a*a + b*b));
		d = Math.sqrt(d*d);//取d的正数
		if(b == 0){//当直线垂直于x轴时,直线的表达式可表示为:x = -c/a
			if(x <= -c/a)
				return -d;//点位于直线左侧,符号取负
			else
				return d;//点位于直线左侧,符号取正
		}
		else{
			if(y >= ((-a/b)*x - c/b))
				return d;//点位于直线上侧,符号取正
			else
				return -d;//点位于直线下侧,符号取负
		}
	}
		
	//直线与线段交点
	public static boolean pointLineSegment(double a, double b, double c, double x1, double y1, double x2, double y2) {
		double d1,d2;
		d1 = getSignedDistance(a, b, c, x1, y1);//求(x1,y1)到直线的带符号距离
		d2 = getSignedDistance(a, b, c, x2, y2);//求(x2,y2)到直线的带符号距离
		if(d1*d2 <=0){//当d1与d2异号或者其中至少有一个为0时,交点存在
			d1 = Math.sqrt(d1*d1);//去符号
			d2 = Math.sqrt(d2*d2);
			double k = d1/(d1 + d2);//求d1所占线段的比例
			if((d1 + d2 != 0) && (((x1+k*(x2-x1)) != x1)||((y1+k*(y2-y1)) != y1))){//距离都不为0且不是线段的第一个端点时(为了避免交点为矩形邻边的交点导致端点被计算两次的情况)
				System.out.println("交点:"+"("+(x1+k*(x2-x1)) +","+ (y1+k*(y2-y1)) +")");//根据向量运算以以及比例关系求出交点坐标
				return true;
			}
			else if(d1 + d2 == 0){
				System.out.println("直线与矩形的一条边重合,存在无数个交点");
				return true;
			}
		}
		else{
			return false;
		}
		return false;
	}
	//直线与矩形交点
	public static void pointLineRectangular (double a, double b, double c, double x1, double y1, double x2, double y2, double x3, double y3) {
		double x4,y4;//定义矩形第四个点的横纵坐标
		x4 = x1 + x3 - x2;
		y4 = y1 + y3 - y2;
		//接下来依次求解直线与构成矩形的四条线段的交点
		boolean m1,m2,m3,m4;//设置是否有交点的标志
		System.out.println("直线与矩形交点的计算结果为 : ");
		m1 = pointLineSegment(a, b, c, x1, y1, x2, y2); 
		m2 = pointLineSegment(a, b, c, x2, y2, x3, y3); 
		m3 = pointLineSegment(a, b, c, x3, y3, x4, y4); 
		m4 = pointLineSegment(a, b, c, x4, y4, x1, y1); 
		if(m1 == m2 == m3 == m4 == false)
			System.out.println("直线与矩形没有交点");
	}

}


结果截屏:
在这里插入图片描述
第一次写博客,决定写博客是因为自己写程序时会出现很多不懂得地方,搞懂了后会很多的感想,于是就希望记录下来加深印象,同时希望这篇博客能给大家带来帮助!大家如果有什么更好的方法欢迎留言,谢谢!

C# 直线弧的交点坐标 直线弧的交点时,我们先分析一下,主要分为两步。 第一步:先直线交点。 第二步: 判断交点是否在弧上。 下面开始展示代码,伸手党有福了,可能有些地方写的不好,望谅解,创作不易,喜欢给个好评吧。 主干 /// <summary> /// 计算直线交点方法 /// </summary> /// <... 阅读详情

相关推荐

C# 弧和弧的交点坐标算法

弧和弧的交点坐标的时候,我们同样和我上一个直线交点坐标一样,先来分析一下,主要分为 第一步: 弧和交点,我们可以先该弧对应的交点。 第二步:通过判断交点是否同时是存在两个弧上,注意交点必须同时存在于两个弧上,这个交点才是真正的交点(这个地方有点小坑,希望能自己画图理解)。 下面开始展示代码,伸手党有福了,可能有些地方写的不好,望谅解,创作不易,喜欢给个好评吧。...

MiMi_Liang的博客 3450

直线直线矩形交点

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点

机器人技术第三次作业:用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。 基本思想: 直线直线直线:利用公式直接直线矩形:分解成直线直线交点: #include <iostream> #include <math.h> class VecPosition//////坐标 { public: double mx; double my; public: void setpoint(double x,double y

Mosone的博客 1513

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。 要各给出每个案例的至少一个示例的程序。

线段和交点程序

C#实现结算线段和交点 本代码是为了解决图像处理中的问题做的,所以x,y坐标这里使用的是Row和Column 代码中涉及到的其他静态方法,均可在我的其他博文中找到 //线段和交点 public static void InterC2S(double centerR, double centerC, double R, List<double> Row, List<double> Column, out List<double> Rows, out

qq_35044766的博客 1643

C# 线段交点

本文转自:http://blog.csdn.net/rabbit729/article/details/4285119 原文给出了很好的思路 /// /// 线段交点 /// /// 线段起点 /// 线段终点 /// 心坐标 /// 半径平方

luols的专栏 1万+

直线直线矩形交点计算资源

直线直线矩形交点计算资源 去发现同类优质开源项目:https://gitcode.com/ 此资源包含了一套面向对象的类设计,用于计算直线直线直线以及直线矩形之间的交点。通过将几何对象抽象成类,我们可以更灵活、更高效地处理这些计算。 资源简介 在本资源中,我们采用面向对象的方法设计了直线矩形类,并实现了以下功能: 直线直线交点计算 直线交点计算 直线矩形交点...

gitblog_06780的博客 447

机器人用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。 本文面向的对象为:准备自己实现代码,但是找不到高效的数学方法的同学 本文没有代码实现。 本文中判断矩形直线交点的方法应该是只用初中数学水平中最高效的。

sb_HFUT_leaders的博客 1142

合肥工业大学机器人技术作业:直线直线矩形交点坐标(C++)

使用C++直线直线矩形交点坐标几何类的编写矩形直线总结 几何类的编写 没什么特别的,利用了的标准公式来表示 class Circle { private: double x_center_param; /* 心的 x 坐标值 */ double y_center_param; /* 心的 y 坐标值 */ double r_param; /* 半径 */ public...

YEEMING的博客 2062

直线直线矩形交点计算资源:高效解决几何交点问题

直线直线矩形交点计算资源:高效解决几何交点问题 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代计算机图形学、物理模拟以及游戏开发中,几何对象之间的交点计算是一项基础且重要的技术需直线直线矩形交点计算资源 是一个开源项目,它通过面向对象的类设计,提供了计算直线直线以及矩形之间交点的解决方案。这种设计不仅提高了代码的可读性和可维护性,而且使...

gitblog_06705的博客 300

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。要各给出每个案例的至少一个示例的程序。

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。要各给出每个案例的至少一个示例的程序。

m0_64428667的博客 323

使用C++实现点、线、等基本几何元素的计算方法

这篇文章介绍了5个C++几何编程基础算法,帮助图形学入门者掌握点、线、等几何元素的计算方法。主要内容包括:1)二维坐标系统的Point类实现;2)点直线关系的判断技巧;3)点位置关系的判定方法;4)两直线交点计算;5)矩形重合面积计算。文章提供了详细的C++代码示例,并建议使用标准库函数、处理浮点数精度以及代码复用等优化技巧。这些基础算法为图形学开发奠定了重要基础,适用于GUI开发、游戏编程等领域。

2503_94025595的博客 1169

java 直线交点坐标公式_java(二) - 关于机器人足球之几何交点

机器人技术第二次作业.代码说明题目测试平台编程语言: java操作系统: windows实验结果关于直线直线交点解测试代码public class Exp2 {public static void main(String[] args) {// 线-线 交点测试Line line1 = new Line(7, 10, 3);Line line2 = new Line(5, 5, 9);St...

weixin_34828705的博客 675

交点

直线直线直线直线矩形交点 Point.h #ifndef POINT_H_ #define POINT_H_ #include <iostream> #include <cmath> class Point { private: double x; double y; public: Point(): x(0), y(0) { } ...

Zone的博客 269

halcon算子——intersection计算直线的交叉点

*交叉区域intersection (Region1, Region2, RegionIntersection) *circle轮廓的交叉点 intersection_circle_contour_xld (Contour, CircleRow, CircleColumn, CircleRadius, 0, 6.28318, 'positive', Row, Column) *直线轮廓的交叉点(计算的时候会自动延长直线,得到直线的延长线轮廓的交叉点) intersection_line_co

大胡子大叔的专栏 9902

合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释

用面向对象的思维设计相关类,从而实现直线直线直线直线矩形交点。 要各给出每个案例的至少一个示例的程序。

m0_64428667的博客 1911

合肥工业大学机器人技术期末_机器人技术第二次作业(HFUT)

简单的几何计算。java源码:package robathomework2;//点类,后面交点后,返回一个点对象class Point {private double x;private double y;private int condition;// 因为后面交点的函数返回的都是Point对象,为了区分直线其他无交点,有交点,有无数交点的情况// 需要引入 condition ,当值为...

weixin_42492000的博客 637
下一篇: java IO流详解
Sponge_Bob__
博客等级 码龄7年 7粉丝 17原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值