两直线交点算法 C

求两直线交点算法
在这里插入图片描述
有中间交点 CD在AB异侧 且AB在CD异侧
在这里插入图片描述
AB在CD异侧 但 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.

综上 代码部分

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

void copyPoint(float* dst, float *src)
{
	dst[0] = src[0];
	dst[1] = src[1]; 
}
// EPS 误差自定  等零用线段长度点到直线距离替换 
int intersect(float* a, float *b, float *c, float *d, float* res)
{
	if (a[0] == b[0] && a[1] == b[1])  // ab同一点
		return 0;
		
    float a1 = cross(a,b,a,c);
    float a2 = cross(a,b,a,d);
    
	float a3 = cross(c,d,c,a);
	float a4 = cross(c,d,c,b);
   
    if (a1*a2 > 0 || a3*a4 > 0)  
        return -1;   //无交点
        
     if (a1 == 0)  { // 交点为c
         copyPoint(res,c);
         return 1;
     }  else if (a2 == 0) {  // 交点为d
          copyPoint(res,d);
          return 1;
     }    	     
    //中间交点 
    float t = a1 / (a1 - a2);   // 面积1与面积2异号  保持a1方向 

    res[0] = c[0] + t*(d[0] - c[0]);   
    res[1] = c[1] + t*(d[1] - c[1]);
    
    return 1;
}
  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yvee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值