急救:判断两条线段是否相交,并求两条线段的交点坐标 ~~~~~~

Hinzi 2006-11-08 11:56:36
用C#方法求出下面问题

已知:
第一线段的坐标值:(Px1,Py1)(Px2,Py2)
第二线段的坐标值:(x1,y1)(x2,y2)

求下列问题:
判断这两条线段是否相交,并求两条线段的交点坐标(X,Y)


恳求各位高手提供解决办法!

...全文
1045 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nZAI 2006-11-09
  • 打赏
  • 举报
回复
顶sanmu_bradley()
liuqm 2006-11-09
  • 打赏
  • 举报
回复
那你就用斜率来计算,毕竟方便了很多
alvachien 2006-11-08
  • 打赏
  • 举报
回复
怎么好像是一个初中数学题啊
zhxfzhxf1 2006-11-08
  • 打赏
  • 举报
回复
初中数学题
sanmu_bradley 2006-11-08
  • 打赏
  • 举报
回复
这个问题。。。。
1、求两直线交点
2、如果有交点判断交点X/Y值是否在两条线段X坐标较大值和Y坐标较小值之间。
3、如果在就有交点。
初中水平就可以解决吧。
Hinzi 2006-11-08
  • 打赏
  • 举报
回复
但是要求是线段啊~~~~~不是直线!!

请问liuqm(blue):
float Minx01 = Min(x0, x1);是什么意思呢??

我运行一下你的程序,有错误哦~~~~
yoopan 2006-11-08
  • 打赏
  • 举报
回复
liuqm(blue)
liuqm 2006-11-08
  • 打赏
  • 举报
回复
直接用斜率
如果斜率相等就平行,否则肯定相交
斜率公式:k=(y2-y1)/(x2-x1);
liuqm 2006-11-08
  • 打赏
  • 举报
回复
bool TwoLineIsIntersect(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float &InterX, float &InterY)
{ //两条线段是否相交X0X1 AND X1X2
float x, y;
float Minx01 = Min(x0, x1);
float Miny01 = Min(y0, y1);
float Minx23 = Min(x2, x3);
float Miny23 = Min(y2, y3);
float Maxx01 = Max(x0, x1);
float Maxy01 = Max(y0, y1);
float Maxx23 = Max(x2, x3);
float Maxy23 = Max(y2, y3);

if(x1!=x0 && x2!=x3)
{
float k1 = (y1-y0)/(x1-x0);
float k2 = (y3-y2)/(x3-x2);
float Den = (y1-y0)*(x3-x2) - (y3-y2)*(x1-x0);
if(k1==k2)
{ //平行不相交
float d1 = abs(y0*(x1-x0)-x0*(y1-y0)-y2*(x3-x2)+x2*(y3-y2)); //距离公式d = abs(c1-c2) / sqrt(a*a+b*b)
if(d1==0)
{//直线重合
if((x2>Minx01 && x2<Maxy01 && y2>Miny01 && y2<Maxy01) || (x3>Minx01 && x3<Maxy01 && y3>Miny01 && y3<Maxy01)
|| (x0>Minx23 && x0<Maxy23 && y0>Miny23 && y0<Maxy23) || (x1>Minx23 && x1<Maxy23 && y1>Miny23 && y1<Maxy23))
{ //实际碰撞问题线段重合认为相交了
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
x = ((y2-y0)*(x1-x0)*(x3-x2)+(y1-y0)*(x3-x2)*x0-(y3-y2)*(x1-x0)*x2)/Den;
y = ((y1-y0)*(x-x0))/(x1-x0) + y0;

if(Minx01<=x && x<=Maxx01 && Miny01<=y && y<=Maxy01 && Minx23<=x && x<=Maxx23 && Miny23<=y && y<=Maxy23)
{
InterX = x;
InterY = y;
return true;
}
}
else if(x1==x0 && x2!=x3)
{
x = x0;
y = ((y3-y2)*(x0-x2))/(x3-x2) + y2;
if(Minx01<=x && x<=Maxx01 && Miny01<=y && y<=Maxy01 && Minx23<=x && x<=Maxx23 && Miny23<=y && y<=Maxy23)
{
InterX = x;
InterY = y;
return true;
}
}
else if(x1!=x0 && x2==x3)
{
x = x2;
y = ((y1-y0)*(x2-x0))/(x1-x0) + y0;
if(Minx01<=x && x<=Maxx01 && Miny01<=y && y<=Maxy01 && Minx23<=x && x<=Maxx23 && Miny23<=y && y<=Maxy23)
{
InterX = x;
InterY = y;
return true;
}
}
return false;
}
Hinzi 2006-11-08
  • 打赏
  • 举报
回复
没有人知道吗?

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧