求两直线的交点

2024-04-07 11:08
文章标签 交点 直线

本文主要是介绍求两直线的交点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自    http://blog.csdn.net/abcjennifer/article/details/7584628

一般方程法:

直线的一般方程为F(x) = ax + by + c = 0。既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0

因此我们可以将两条直线分别表示为

F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0

那么两条直线的交点应该满足

a0*x + b0*y +c0 = a1*x + b1*y + c1

由此可推出

x = (b0*c1 – b1*c0)/D

y = (a1*c0 – a0*c1)/D

D = a0*b1 – a1*b0 (D0时,表示两直线平行,因此在求交点之前应先检查斜率是否相等)

二者实际上就是连立方程组F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0的叉积应用

i     j     k

a0 b0 c0

a1 b1 c1

[cpp]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. #include"iostream"  
  2. #include"stdio.h"  
  3. #include"math.h"  
  4. using namespace std;  
  5.   
  6. struct Point  
  7. {  
  8.     double x;  
  9.     double y;  
  10. };  
  11.   
  12. struct Line  
  13. {  
  14.     Point p1,p2;  
  15.     double a,b,c;  
  16. };  
  17.   
  18. void GetLinePara(Line *l)  
  19. {  
  20.     l->a=l->p1.y-l->p2.y;  
  21.     l->b=l->p2.x-l->p1.x;  
  22.     l->c=l->p1.x*l->p2.y-l->p2.x*l->p1.y;  
  23. }  
  24.   
  25. Point GetCrossPoint(Line *l1,Line *l2)  
  26. {  
  27.     GetLinePara(l1);  
  28.     GetLinePara(l2);  
  29.     double D=l1->a*l2->b-l2->a*l1->b;  
  30.     Point p;  
  31.     p.x=(l1->b*l2->c-l2->b*l1->c)/D;  
  32.     p.y=(l1->c*l2->a-l2->c*l1->a)/D;  
  33.     return p;  
  34. }  
  35.   
  36. int main()  
  37. {  
  38.     Line l1,l2;  
  39.     while(true)  
  40.     {  
  41.         scanf("%lf%lf%lf%lf",&l1.p1.x,&l1.p1.y,&l1.p2.x,&l1.p2.y);  
  42.         scanf("%lf%lf%lf%lf",&l2.p1.x,&l2.p1.y,&l2.p2.x,&l2.p2.y);  
  43.         Point Pc=GetCrossPoint(&l1,&l2);  
  44.         printf("Cross point:%lf %lf\n",Pc.x,Pc.y);  
  45.     }  
  46.     return 0;  
  47. }  

这篇关于求两直线的交点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882434

相关文章

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

圆与线段的交点

poj 3819  给出一条线段的两个端点,再给出n个圆,求出这条线段被所有圆覆盖的部分占了整条线段的百分比。 圆与线段的交点 : 向量AB 的参数方程  P = A + t * (B - A)      0<=t<=1 ; 将点带入圆的方程即可。  注意: 有交点 0 <= t <= 1 ; 此题求覆盖的部分。 则 若求得 t  满足 ; double ask(d

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t

n条直线最多能划分出多少个平面?

N条直线,两两相交,其交点各不不同,则产生的交点数目为N个数中取2个数的组合; 同时,也只有这种情况下(两两相交,也交点不同),分割的平面数最多, 数目为: 2 + (N-1)(N+2)/2.  这里求最少平面数没有意义,因为最少平面数就是N+1, 即N条直线两两平行的时候,分割的平面最少。 举例: 1条直线分割平面数最多为2; a1 = 2 2条直线分割平面数最多为4;

OpenCV绘图函数(12)绘制直线函数 line()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 line 函数在图像中绘制从 pt1 到 pt2 两点之间的线段。这条线会被图像边界裁剪。对于没有抗锯齿效果且坐标为整数的线,会使用 8-连接或者 4-连接的 Bresenham 算法。粗线条的绘制会采用圆角处理。抗锯齿线条则通过高斯滤波来绘制

Codeforces Round #329 (Div. 2) B. Anton and Lines ([好题] 计算直线在区间是否有交点)

题目链接 题意:给出n个条直线,然后在指定的区间(x1,x2)是否有直线的交点存在。 解法:一:闭区间,首先把区间略微调小。 二:计算直线在x1,x2上的交点y坐标,以及直线的id,然后按照y值,id值排序,最后判断第x1,x2左右两边的第i个点是不是同一直线的,如果不是,就存在交点。 #include<bits/stdc++.h>using namespace std;const i

Unity坐标系计算3D中两直线的最短距离及最近点的几何原理

方法1: 已知空间中两直线AB, CD,判断它们是否相交      问题的关键是求出这两条直线之间的最短距离,以及在这个距离上最接近两线的点坐标,判断该点是否在直线AB和直线CD上。      首先将直线方程化为对称式,分别得到两直线方向向量AB=(x1,y1,z1), CD=(x2,y2,z2),再将两向量AB, CD叉乘得到其公垂向量N=(x,y,z),在AB, CD两直线上分别选取点E

这神器好棒!阅读体验直线飙升~

这是蜗牛互联网的第 89 期原创。 作者 | 白色蜗牛 来源 | 蜗牛互联网(ID: woniu_internet) 转载请联系授权(微信ID: 919201148) 前言 我们在网上阅读的时候,经常会看到一些有价值的观点或者是有用的知识,希望可以摘录下来,甚至把我们自己当时的思考也记录下来,以便未来需要的时候回头再看。 有的朋友可能会记到一个小本本上,有的朋友可能会写到线上的笔记软件里。但

【转载】直线分平面

路路分蛋糕问题 蛋糕终于是买回来了,路路的朋友们已经迫不及待来吃蛋糕了。为了公平起见,每个人都将分到一块蛋糕。可是路路是一个很懒的家伙,他想用最少的刀数分出他想要的蛋糕块数,不论大小和形状。下面请开动你的脑筋告诉这个懒家伙该怎么做,蛋糕切法按照常理理解。 从题目中提供的条件来看,蛋糕按照常理可以抽象为一个圆形(平面图形),而切开的印痕可以抽象为一条直线,所以这个问题需要研究平面内的n条直线所能分

【Opencv】Hough变换找直线和圆

目录 题目 解决方法 完整代码 Hough参数详解 总结 参考 题目 用霍夫变换找出图像中的直线和圆(用彩色直线和圆标记在原图上)。要求有代码,有注释,有过程、有结果   解决方法 # -*- coding: UTF-8 -*-import cv2import numpy as np# 1.加载图片,转为二值图img = cv2.imread('image.j