`
263229365
  • 浏览: 473481 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

两条线段是否相交,计算交点公式。

 
阅读更多

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));

 

 

总结:

  1. //第一条直线  
  2. double x1 = 10, y1 = 20, x2 = 100, y2 = 200;   
  3. double a = (y1 - y2) / (x1 - x2);  
  4. double b = (x1 * y2 - x2 * y1) / (x1 - x2);  
  5. System.out.println("求出该直线方程为: y=" + a + "x + " + b);  
  6.   
  7. //第二条  
  8. double x3 = 50, y3 = 20, x4 = 20, y4 = 100;  
  9. double c = (y3 - y4) / (x3 - x4);  
  10. double d = (x3 * y4 - x4 * y3) / (x3 - x4);  
  11. System.out.println("求出该直线方程为: y=" + c + "x + " + d);  
  12.   
  13. double x = ((x1 - x2) * (x3 * y4 - x4 * y3) - (x3 - x4) * (x1 * y2 - x2 * y1))  
  14.     / ((x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4));  
  15.   
  16. double y = ((y1 - y2) * (x3 * y4 - x4 * y3) - (x1 * y2 - x2 * y1) * (y3 - y4))  
  17.     / ((y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4));  
  18.   
  19. System.out.println("他们的交点为: (" + x + "," + y + ")"); 

********************************************************************

下面附上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; // '相交但不在线段上
        }
    }
}
 

 

 

========================下面是找到的另外的一种方法====================

 

 

第二种方法: 利用斜率公式, 直线方程为ax+bx+c=0, 先求出a,b,c, 然后再求出交点 

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.     Point2D p1 = new Point2D.Double(1020);  
  3.     Point2D p2 = new Point2D.Double(100200);  
  4.       
  5.     Point2D p3 = new Point2D.Double(5020);  
  6.     Point2D p4 = new Point2D.Double(20100);  
  7.       
  8.     Param pm1 = CalParam(p1, p2);  
  9.     Param pm2 = CalParam(p3, p4);  
  10.     Point2D rp = getIntersectPoint(pm1, pm2);  
  11.     System.out.println("他们的交点为: (" + rp.getX() + "," + rp.getY() + ")");  
  12. }  
  13.   
  14. /** 
  15.  * 计算两点的直线方程的参数a,b,c 
  16.  * @param p1 
  17.  * @param p2 
  18.  * @return 
  19.  */  
  20. public static Param CalParam(Point2D p1, Point2D p2){  
  21.     double a,b,c;  
  22.     double x1 = p1.getX(), y1 = p1.getY(), x2 = p2.getX(), y2 = p2.getY();  
  23.     a = y2 - y1;  
  24.     b = x1 - x2;  
  25.     c = (x2 - x1) * y1 - (y2 - y1) * x1;  
  26.     if (b < 0) {  
  27.         a *= -1; b *= -1; c *= -1;  
  28.     }else if (b == 0 && a < 0) {  
  29.         a *= -1; c *= -1;  
  30.     }  
  31.     return new Param(a, b, c);  
  32. }  
  33.   
  34. /** 
  35.  * 计算两条直线的交点 
  36.  * @param pm1 
  37.  * @param pm2 
  38.  * @return 
  39.  */  
  40. public static Point2D getIntersectPoint(Param pm1, Param pm2){  
  41.     return getIntersectPoint(pm1.a, pm1.b, pm1.c, pm2.a, pm2.b, pm2.c);  
  42. }  
  43.   
  44. public static Point2D getIntersectPoint(double a1, double b1, double c1, double a2, double b2, double c2){  
  45.     Point2D p = null;  
  46.     double m = a1 * b2 - a2 * b1;  
  47.     if (m == 0) {  
  48.         return null;  
  49.     }  
  50.     double x = (c2 * b1 - c1 * b2) / m;  
  51.     double y = (c1 * a2 - c2 * a1) / m;  
  52.     p = new Point2D.Double(x, y);  
  53.     return p;  
  54. }  


输出的结果为: 

Java代码  收藏代码
  1. 求出该直线方程为: y=2.0x + -0.0  
  2. 求出该直线方程为: y=-2.6666666666666665x + 153.33333333333334  
  3. 他们的交点为: (32.857142857142854,65.71428571428571)  
  4. 他们的交点为: (32.857142857142854,65.71428571428571)  

 

0
0
分享到:
评论
2 楼 davidwkj 2017-02-10  
Y坐标的公式不对。算出来的值是错的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1 楼 Terence.Wang 2011-08-26  
有木有求椭圆和直线相交交点坐标的code?

相关推荐

    判断两条线段是否相交

    如果这两条线段相交,那么存在至少一个点P(x, y),使得P同时属于线段AB和CD。 判断线段是否相交的常用方法是利用向量叉积的概念。向量A(x2-x1, y2-y1)和向量B(x4-x3, y4-y3)分别表示线段AB和CD的方向。如果这两向量...

    AS3.0学习之判断两条线段是否相交

    3. 当两条线段的端点形成四个交点时,如果其中存在一个交点同时位于两条线段内部,那么这两条线段相交。 在AS3.0中,我们可以使用向量代数来判断线段是否相交。关键在于计算两条线段的斜率和截距,然后比较它们是否...

    线段相交检测demo

    本资源“线段相交检测demo”是基于CocosCreator的一个示例,通过源代码展示了如何在2D环境中检测两条线段是否相交。以下是关于线段相交检测的详细知识点: 1. **线段的基本概念**:线段是由两个不在同一直线上的点A...

    线段对象(判断是否相交以及相交点的获取)

    1. **判断两个线段是否相交**:线段相交的条件是它们的两个端点分别位于对方线段的两侧。我们可以使用叉积(向量的叉乘)来检查这个条件。如果两个线段的四个端点形成的两对交叉乘积符号相反,则它们相交。下面是...

    两条直线相交判断方法

    对于任意两条直线,我们可以计算它们的交点坐标,如果这个交点位于两条直线各自定义的线段内,那么这两条线段相交。计算交点的公式是通过解两个直线方程的系统得到的: \[ \begin{cases} y - y1 = m_1 \cdot (x ...

    MyLine交互给出线段、点坐标;判断线段是否第一象限;判断线段是否相交;点到线段距离.rar

    对于每一对线段,如果它们的两个端点分别组成的四个向量的叉积符号不同,则这两条线段相交。此外,还需要确保交点落在每条线段的范围内。 3. **点到线段的距离**: 计算点P(x_p, y_p)到线段AB(A(x1, y1), B(x2, y2...

    计算两条共线的线段的交点:

    在计算机图形学和几何计算中,计算两条线段的交点是一个常见的问题。这个任务尤其重要,因为它在各种领域都有应用,比如游戏开发、地图绘制、碰撞检测等。标题提到的"计算两条共线的线段的交点",意味着我们要解决的...

    测试线段是否相交

    本篇文章将详细探讨如何判断两条线段是否相交,并给出计算交点的方法。 线段是由两个点(端点)定义的,每个点具有二维坐标 (x, y)。线段 `A-B` 可以用端点坐标 `(Ax, Ay)` 和 `(Bx, By)` 来表示,同样,线段 `C-D`...

    判断两直线是否相交 C++ MFC

    标题 "判断两直线是否相交 C++ MFC" 涉及的是计算机图形学和编程领域的一个基础问题,即在二维空间中如何使用C++和MFC(Microsoft Foundation Classes)来判断两条直线是否交叉。MFC是微软提供的一套C++类库,用于...

    判断两条直线相交算法

    如果给出另一条直线\( CD \),其中\( C(x_3, y_3) \)和\( D(x_4, y_4) \),那么这两条直线相交的问题就可以转化为求解它们的交点是否存在,并且该交点是否同时位于两条直线上。 #### 知识点二:直线相交判定公式 ...

    生成两直线的交点

    本文将详细介绍如何通过编程方式计算二维平面上两条直线的交点,并基于给定的代码片段进行解析。该问题在计算机图形学、几何处理等领域有着广泛的应用。通过理解本知识点,我们可以更好地掌握直线相交的数学原理以及...

    两线段是否相交.zip

    两条线段相交当且仅当它们共享一个公共点,并且该点位于两条线段的内部,而不是端点上。为判断这一点,我们可以使用以下步骤: 1. **定义线段**:线段由其两个端点表示,例如线段AB由点A(x1, y1)和点B(x2, y2)定义...

    详解js实现线段交点的三种算法

    这种算法首先计算两条线段所在直线的交点,然后再判断该交点是否同时位于两条线段之上。直线的一般方程是 `ax+by+c=0`,其中 `a`、`b` 和 `c` 是直线系数。线段所在直线的交点坐标 `(x, y)` 可以通过解线性方程组...

    VC++求两个线段(城市)最短距离的算法

    计算两个线段的最短距离通常有两种情况:线段相交或不相交。如果线段相交,最短距离就是它们的交点到各自端点的距离中较短的那个。如果不相交,最短距离可能是两个端点之间的直线距离,也可能是线段的某一点到另一条...

    一些简单的直线处理,如线段相交、线段延长、点到直线的距离、直线拟合、角度旋转的等方法

    1. **线段相交检测**:线段相交是指两条线段在二维平面上有公共点。检测线段相交的方法通常基于几何原理,如计算两个线段端点之间的距离和比较是否小于它们长度的乘积。此外,还可以使用向量叉乘来判断线段的方向...

    二维中两条线的交点:取四个点,给出它们连接线的交点-matlab开发

    在MATLAB编程环境中,计算二维平面上两条线段的交点是一项常见的任务,尤其是在几何图形处理、数据分析或算法实现中。这个"二维中两条线的交点:取四个点,给出它们连接线的交点"的MATLAB开发案例提供了一个简单易用...

    计算几何常用算法:点、线、面

    - **定义**:检测两条线段是否相交,并且相交点不在任一线段的端点上。 - **算法原理**:除了基本的线段相交判断外,还需排除端点相交的情况。 - **应用场景**:适用于计算机辅助设计(CAD)中的图形识别。 11. **...

    平面直线求交算法 C++

    在计算机图形学中,平面直线求交算法是计算几何领域的一个基本问题,它涉及到如何判断两条或多条直线在二维平面上是否相交以及如何找到它们的交点。本主题将详细探讨这一算法,并以C++语言进行实现。 首先,我们...

    ACM计算几何大全

    判断线段相交(处理交点) 9 判断线段和射线相交 9 判断线段和直线相交 9 线段到线段距离 9 线段到射线距离 9 线段到直线距离 9 线段的垂直向量 9 相交线段的个数 10 裸的n条线段判断是否有相交(O(nlogn)) 11 判断两...

Global site tag (gtag.js) - Google Analytics