两线段相交求交点_weixin_30879169的博客-程序员宅基地

算法一

#include<stdio.h>  #include<stdlib.h>  #include<assert.h>

struct POINT  {  int x;  int y;  };

bool IsLineSegmentCross(POINT pFirst1, POINT pFirst2, POINT pSecond1, POINT pSecond2) 

//每个线段的两点都在另一个线段的左右不同侧,则能断定线段相交 
//公式对于向量(x1,y1)->(x2,y2),判断点(x3,y3)在向量的左边,右边,还是线上. 
//p=x1(y3-y2)+x2(y1-y3)+x3(y2-y1).p<0 左侧, p=0 线上, p>0 右侧 
long Linep1,Linep2;  //判断pSecond1和pSecond2是否在pFirst1->pFirst2两侧 
Linep1 = pFirst1.x * (pSecond1.y - pFirst2.y) + pFirst2.x * (pFirst1.y - pSecond1.y) +  pSecond1.x * (pFirst2.y  -pFirst1.y);  Linep2 = pFirst1.x * (pSecond2.y - pFirst2.y) + pFirst2.x * (pFirst1.y - pSecond2.y) +  pSecond2.x * (pFirst2.y - pFirst1.y);  if ( ((Linep1 ^ Linep2) >= 0 ) && !(Linep1==0 && Linep2==0))//符号位异或为0:pSecond1和pSecond2在pFirst1->pFirst2同侧 
{ return false;  }  //判断pFirst1和pFirst2是否在pSecond1->pSecond2两侧 
Linep1 = pSecond1.x * (pFirst1.y - pSecond2.y) +pSecond2.x * (pSecond1.y - pFirst1.y) + pFirst1.x * (pSecond2.y -pSecond1.y);  Linep2 = pSecond1.x * (pFirst2.y - pSecond2.y) + pSecond2.x * (pSecond1.y - pFirst2.y) + pFirst2.x * (pSecond2.y - pSecond1.y);  if ( ((Linep1 ^ Linep2) >= 0 ) && !(Linep1==0 && Linep2==0))//符号位异或为0:pFirst1和pFirst2在pSecond1->pSecond2同侧 
{ return false;  }  //否则判为相交  return true;  }  POINT GetCrossPoint(POINT p1, POINT p2, POINT q1, POINT q2) 
{ //必须相交求出的才是线段的交点,但是下面的程序段是通用的assert(IsLineSegmentCross(p1,p2,q1,q2));  POINT crossPoint;  long tempLeft,tempRight;  //求x坐标  tempLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y); 
tempRight = (p1.y - q1.y) * (p2.x - p1.x) * (q2.x - q1.x) + q1.x * (q2.y - q1.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (q2.x - q1.x); 
crossPoint.x =(int)( (double)tempRight / (double)tempLeft ); 
//求y坐标  tempLeft = (p1.x - p2.x) * (q2.y - q1.y) - (p2.y - p1.y) * (q1.x - q2.x); 
tempRight = p2.y * (p1.x - p2.x) * (q2.y - q1.y) + (q2.x- p2.x) * (q2.y - q1.y) * (p1.y - p2.y) - q2.y * (q1.x - q2.x) * (p2.y - p1.y); 
crossPoint.y =(int)( (double)tempRight / (double)tempLeft ); 
return crossPoint;  }  int main(void)  {  POINT pointA,pointB,pointC,pointD;  POINT pointCross;  bool bCross(false);  pointA.x = 400;pointA.y=440;  pointB.x = 300;pointB.y = 440;  pointC.x = 350;pointC.y = 500;  pointD.x = 350;pointD.y = 400;  bCross = IsLineSegmentCross(pointA,pointB,pointC,pointD);  if (bCross)  {

pointCross = GetCrossPoint(pointA,pointB,pointC,pointD);  printf("交点坐标x=%d,y=%d\n",pointCross.x,pointCross.y);  }  else  { 
printf("They are not crossed!");  }  return 0;  }

算法二

定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3)的面积量: 
|x1   x2   x3|
S(P1,P2,P3)   =   |y1   y2   y3|   =   (x1-x3)*(y2-y3)   -   (y1-y3)(x2-x3) 
|1   1  1|
已知一条线段的两个端点为A(x1,y1),B(x2,y2),另一条线段的两个端点为C(x3,y3),D(x4,y4),要判断AB与CD是否有交点,若有求出.
首先判断d   =   (y2-y1)(x4-x3)-(y4-y3)(x2-x1),
若d=0,则直线AB与CD平行或重合,
若d!=0,则直线AB与CD有交点,设交点为E(x0,y0):
则有:CE/ED   =   S(A,C,B)   /   S(A,B,D)
所以:CE/CD   =   S(A,C,B)   /   (S(A,C,B)   +   S(A,B,D))
故   x0   =   C.x   +   (D.x   -   C.x)   *   S(A,C,B)   /   (S(A,C,B)   +   S(A,B,D));
y0   =   C.y   +   (D.y   -   C.y)   *   S(A,C,B)   /   (S(A,C,B)   +   S(A,B,D));
也可以直接求
x0   =   [(x2-x1)*(x4-x3)*(y3-y1)+(y2-y1)*(x4-x3)*x1-(y4-y3)*(x2-x1)*x3]/d
y0   =   [(y2-y1)*(y4-y3)*(x3-x1)+(x2-x1)*(y4-y3)*y1-(x4-x3)*(y2-y1)*y3]/(-d)
求出交点后在判断交点是否在线段上,即判断以下的式子:
(x0-x1)*(x0-x2) <=0
(x0-x3)*(x0-x4) <=0
(y0-y1)*(y0-y2) <=0
(y0-y3)*(y0-y4) <=0
只有上面的四个式子都成立才可判定(x0,y0)是线段AB与CD的交点,否则两线段无交点

算法三

//求两个点的直线方程
LINE makeline(POINT p1,POINT p2) {
LINE tl;
int sign = 1;
tl.a=p2.y-p1.y;
if (tl.a<0) {
sign = -1;
tl.a=sign*tl.a;
}
tl.b=sign*(p1.x-p2.x);
tl.c=sign*(p1.y*p2.x-p1.x*p2.y);
return tl;
}
// 如果两条直线 l1(a1*x+b1*y+c1 = 0), l2(a2*x+b2*y+c2 = 0)相交,返回true,且返回交点p
bool lineintersect(LINE l1,LINE l2,POINT &p) {// 是 L1,L2
double d=l1.a*l2.b-l2.a*l1.b;
if (abs(d)<EP) return false;// 不相交
p.x = (l2.c*l1.b-l1.c*l2.b)/d;
p.y = (l2.a*l1.c-l1.a*l2.c)/d;
return true;
}
//计算叉积
double multiply(POINT sp,POINT ep,POINT op) {
return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}
bool online(LINEl,POINT p)
{
return((multiply(l.b,p,l.a)==0)&&(((p.x-l.a.x)*(p.x-l.b.x)<=0)&&((p.y-l.a.y)*(p.y-l.b.y)<=0)));
}

http://blog.sina.com.cn/s/blog_4c4a15950100rhjn.html

转载于:https://www.cnblogs.com/lz-vic/p/4765912.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30879169/article/details/98652714

智能推荐

基于物品的协同过滤算法---《推荐系统实践》---Python源码(10)_HGaviN的博客-程序员宅基地

一、源码说明基于物品的协同过滤算法和基于用户的协同过滤算法类似,以给该物品评分的用户作为物品的特征向量,从而计算物品之间的余弦相似度。以下代码根据点击打开链接修改而来,修改了计算相似度的函数和进行推荐的函数。推荐效果的准确度不到10%,基于用户的准确度在20%。二、准确度不高的原因分析从推荐的结果看,根据代码设定是要推荐TOP-10的一个列表,但是结果往往很多只有3,4个,并没有10个。原因是用户...

mysql查看和修改系统参数_mysql修改参数_java叶新东老师的博客-程序员宅基地

mysql 参数MySQL提供了相当多的系统参数,涉及方方面面。我们可以使用show关键字来查看:show variables like '%autocommit%';或者show status like '%xxx%';修改参数值mysql有一些参数是可以直接修改的,比如mysql的自动提交是默认开启,我们修改为关闭自动提交set autocommit = 1;当然也有些系统参数不能直接修改里面的值,当我们修改时会报错,就像这样:mysql&gt; set @@ft_max_word

webkit网页布局(2)_-webkit-rtl-ordering_fancy_sky的博客-程序员宅基地

原帖地址 :http://blog.csdn.net/gmstart/article/details/6732334

Synchronized和CAS_贺博文的博客-程序员宅基地

CASCAS的全称是 Compare And Swap(Compare And Exchange) 比较并交换,乐观锁 / 自旋锁 / 轻量级锁 / 无锁cas(v, a, b) , 变量v,期待的值a,要修改的值b以java.util.concurrent.atomic包下的AtomicInteger 为例,

随便推点

详解单体架构 微服务 微服务架构 微服务各个组件 分布式 集群 负载均衡_王德印的博客_王德印的博客-程序员宅基地

为什么淘汰了单体架构,使用微服务?集群是什么东东,和分布式有什么联系?什么是微服务,分布式,两者有什么关系?微服务之间是如何通信的SpringCloud和Dubbo有哪些区别本质区别:服务之间的通信机制的不同,Dubbo是基于RPC,springcloud是基于http的restful API。springboot和SpringCloud,请你谈谈对他们的理解什么是服务熔断?什么是服务降级?微服务的优缺点分别是什么?说一下你在项目开发中碰到的坑你所知道的微服务栈有哪些?列举一二Eurek

【字符集】解决docker 容器中中文乱码问题_docker 字符集_HunterMichaelG的博客-程序员宅基地

一个后端服务容器中解压zip包,释放出带文件名带中文的文件,中文显示被?代替,初步推断是服务基础镜像系统字符集出现问题。进入容器中端界面,手动创建带中文的文件,果不其然,中文显示被?代替了!进入容器 查看字符集# docker exec -it &lt;container_id&gt; /bin/bash# locale# locale -a从...

U8g2图形库使用技巧记录(1)_TL_gone的博客-程序员宅基地

~~呆萌的瓦力平衡机器人~~的显示UI我希望做得精致一些 所以寻觅了好久,最终寻来了u8g2这款精巧的图形库,这款ui图形库可以算得上是图形库里面的瑞士小军????,深得吾爱,所以该系列的文章既是我筛选图形库过程的心路历程,也是在选中u8g2这款图形库后的一些开发记录;u8g2 图形库简介:1.U8g2 是用于嵌入式设备的单色图形库。支持显示控制器:SSD1305、SSD1306、SSD1309、SSD1316、SSD1322、SSD1325、SSD1327、SSD1329、SSD1606、 S

【Docker】Oracle容器化部署,看这一篇就够了!_v朔一的博客-程序员宅基地

写在前由于本机mac空间不够(哈哈,促进我学习),所以想搭建一个云Oracle环境。之前写过windows搭建的,但是之前11g(项目要求)一直安装不上,索性就把服务器换成linux,准备改用docker的方式来进行搭建。总体步骤阿里云申请 linux 服务器,这里我的是 CentOS 7.4。 安装 docker 。 下载 Oracle 镜像并安装。 导入数据(通过DM...

苹果AppStore应用商店生存之道:国内iOS开发者创业经验分享(1)_Dolphinsimon的博客-程序员宅基地

<br />1、整体市场<br />        我准备写至少两篇。本篇为对iPhone的整体的看法。以后会写对中国AppStore市场的看法,市场销售的看法,和在中国开发的看法。<br />        先自我介绍。我从08年9月就开始做iPhone。之前做PC的软件,做得没有意思了,正好iPhone的SDK上市,就尝试了一下。当然一开始不懂App Store的各种销售方法。但是那个时候的竞争少,一共就几千个app。当然有iPhone的人也少。做得最好的时候有一个app到了美国区的销售榜第 2(可惜没

推荐文章

热门文章

相关标签