两直线交点算法 C

求两直线交点算法
在这里插入图片描述

有中间交点 则CD在AB异侧

A B × A C A B × A D \nobreak AB \times AC \newline AB \times AD AB×ACAB×AD
异号

叉乘后相乘小于零

等于零的几种情况
A = B
C与AB共线
D与AB共线

求交点,可由面积比例用叉乘计算

C E C D = S A B C S A B C D . \frac{CE}{CD} =\frac{S_{ABC}}{S_{ABCD}} . CDCE=SABCDSABC.

CE与CD之比若在0与1之间 说明点在CD上 (0 为C 1为D)
综上 代码部分

float cross(float* A, float* B, float* C, float* D)
{
  return (B[0] - A[0]) * (D[1] - C[1]) - (B[1] - A[1]) * (D[0] - C[0]);
}

int intersect(float* a, float *b, float *c, float *d, float* res)
{
    if (a[0] == b[0] && a[1] == b[1])
        return 0; // a == b  

    float a1 = cross(a,b,a,c);
    float a2 = cross(a,b,a,d);
    
    if (a1 == 0 && a2 == 0)  //ab cd共线 
     return 0;
    
    float t = a1 / (a1 - a2);   // 面积1与面积2异号  保持a1方向 
    if (a1*a2 > 0 || t < 0 || t > 1)  
        return -1;   //无交点

    res[0] = c[0] + t*(d[0] - c[0]);   
    res[1] = c[1] + t*(d[1] - c[1]);
    
    return 1;
}
上一篇:【C++庖丁解牛】面向对象的三大特性之一多态 | 抽象类 | 多态的原理 | 单继承和多继承关系中的虚函数表


下一篇:从零开始的 dbt 入门教程 (dbt cloud 自动化篇)