算法问题,,如何判断一条线段是否经过一个矩形? rt 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用这条线为对角线,产生一个矩形(Rectangle).假设为变量recA.然后两个矩形求交集。Rectangle有IntersectsWith方法 to MyLf(不睡觉的鱼)你仔细想想这样行吗? 第一步:判断线段是否在直线内,即判断线段端点是否在矩形内;(((x1 - x) * (x2 - x) + (y1 - y) * (y2 - y)) <= 0)第二步:判断线段与矩形四边是否相交;private bool IfCross(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4){ float det, t1_x_det, t2_x_det, det1, det2; det = (x1 - x2) * (y4 - y3) - (x4 - x3) * (y1 - y2); if (det!= 0 ) { t1_x_det = (y4 - y3) * (x4 - x2) - (x4 - x3) * (y4 - y2); t2_x_det = (x1 - x2) * (y4 - y2) - (y1 - y2) * (x4 - x2); if (det < 0) { det = -det; t1_x_det = -t1_x_det; t2_x_det = -t2_x_det; } return (0 <= t1_x_det && t1_x_det <= det) && (0 <= t2_x_det && t2_x_det <= det); } else { det1 = (x1 - x2) * (y4 - y2) - (y1 - y2) * (x4 - x2); det2 = (x4 - x3) * (y4 - y2) - (y4 - y3) * (x4 - x2); if (det !=0 || det2 != 0) { return False; } else { return Inside(x1, y1, x3, y3, x4, y4) || Inside(x2, y2, x3, y3, x4, y4) || Inside(x3, y3, x1, y1, x2, y2) || Inside(x4, y4, x1, y1, x2, y2); } }} 最好gdi+里有相应的功能,可我没找到最好能效率高些,因为要判断很多次…… 在gdi+里就是判断一条线段是否经过剪切区 哈哈,MyLf(不睡觉的鱼) 满可爱的。多空的方法应该可用吧。 多空的方法不行,第一步就判断不准给你一个(500,500,100,100)的矩形一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;的线段这条线段的端点在矩形内,你看能判断出来吗? 给你一个(500,500,100,100)的矩形一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;的线段这条线段的端点在矩形内,你看能判断出来吗?-----------------------------------------这个用GDI+可以判断出来。Rectangle 有Contains(Point)方法可以知道某一点是否在矩形内。但这和你的问题没有直接关系。 Cohen-Sutherland 算法像这样经典的算法GDI+里应该有吧,可一搜一下这个算法,应该有实现的。要不查查图形学的书吧,书上还有代码,别自己想了,大师们早就想好了 给你一个(500,500,100,100)的矩形一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;的线段.....村长同志,请你画一画,想一想,我的算法恰恰证明了这个线段没有经过矩形. / 680,680 / 550,550 .500,500.100,100 Line:起点为(LineStart.X,LineStart.Y)、终点为(LineEnd.X,LineEnd.Y)构建Line对应的Rectangle. new Rectangle(LineStart.X-int.MinValue,LineStart.Y-int.MinValue,LineEnd.X+MinValue,LineEnd.Y+MinValue).再和另一个Rectangle求交集。也可都转换为Region再求交集。涉及GDI+ to MyLf(不睡觉的鱼)给你一个(500,500,100,100)的矩形一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;的线段这条线段的端点在矩形内,你看能判断出来吗?-----------------------------------------这个用GDI+可以判断出来。Rectangle 有Contains(Point)方法可以知道某一点是否在矩形内。但这和你的问题没有直接关系。=========================================这个我当然知道,我是在判断一下多空的算法to 多空 我判断错了,不好意思:)to fsdy2000(乡愁) 没看明白 鼠标经过一条直线--------------------呵呵...这个就容易多了.用GraphicsPath的IsVisible(Point)方法就可以了. 线段有一个起点和终点。把起点和终点的x、y值同时减去和加上足够小的数,构成矩形的四个点。再将新构建的矩形和要判断的矩形进行交运算。上面的int.MinValue没有对,应该是绝对值足够小的数。 GZ------------------------------------我的团队:www.51team.com欢迎访问,有志者共谋事,每天都有惊喜,SOHO 多线程操作有错误,高手看看 请各位高手问怎么提取网页中的手机号码! 求 搜索邮箱地址 思路or代码or成品 C# 启动窗口关闭的问题 如何从一个php站点获取到一个 htmlDocument ? wf 持久化 表的解释 刚学VS2003的WIN编程,小问题一堆 WCF,这种功能是使用WCF双工还是Socket studio 2013中怎么没有报表? 这样写为什么捕捉不到异常? 程序启动问题?图片怎么显示? 執行時間問題,2百分求解!!
(((x1 - x) * (x2 - x) + (y1 - y) * (y2 - y)) <= 0)
第二步:判断线段与矩形四边是否相交;
private bool IfCross(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)
{
float det, t1_x_det, t2_x_det, det1, det2;
det = (x1 - x2) * (y4 - y3) - (x4 - x3) * (y1 - y2);
if (det!= 0 )
{
t1_x_det = (y4 - y3) * (x4 - x2) - (x4 - x3) * (y4 - y2);
t2_x_det = (x1 - x2) * (y4 - y2) - (y1 - y2) * (x4 - x2);
if (det < 0)
{
det = -det;
t1_x_det = -t1_x_det;
t2_x_det = -t2_x_det;
}
return (0 <= t1_x_det && t1_x_det <= det) && (0 <= t2_x_det && t2_x_det <= det);
}
else
{
det1 = (x1 - x2) * (y4 - y2) - (y1 - y2) * (x4 - x2);
det2 = (x4 - x3) * (y4 - y2) - (y4 - y3) * (x4 - x2);
if (det !=0 || det2 != 0)
{
return False;
}
else
{
return Inside(x1, y1, x3, y3, x4, y4) ||
Inside(x2, y2, x3, y3, x4, y4) ||
Inside(x3, y3, x1, y1, x2, y2) ||
Inside(x4, y4, x1, y1, x2, y2);
}
}
}
多空的方法应该可用吧。
一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;
的线段这条线段的端点在矩形内,你看能判断出来吗?
一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;
的线段这条线段的端点在矩形内,你看能判断出来吗?
-----------------------------------------
这个用GDI+可以判断出来。
Rectangle 有Contains(Point)方法可以知道某一点是否在矩形内。但这和你的问题没有直接关系。
一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;
的线段.....村长同志,请你画一画,想一想,我的算法恰恰证明了这个线段没有经过矩形.
/ 680,680
/ 550,550
.500,500.
100,100
构建Line对应的Rectangle. new Rectangle(LineStart.X-int.MinValue,LineStart.Y-int.MinValue,LineEnd.X+MinValue,LineEnd.Y+MinValue).
再和另一个Rectangle求交集。
也可都转换为Region再求交集。
涉及GDI+
给你一个(500,500,100,100)的矩形
一条x1 = 550,y1 = 550,x2 = 680,y2 = 680;
的线段这条线段的端点在矩形内,你看能判断出来吗?
-----------------------------------------
这个用GDI+可以判断出来。
Rectangle 有Contains(Point)方法可以知道某一点是否在矩形内。但这和你的问题没有直接关系。=========================================
这个我当然知道,我是在判断一下多空的算法to 多空 我判断错了,不好意思:)to fsdy2000(乡愁)
没看明白
--------------------
呵呵...这个就容易多了.
用GraphicsPath的IsVisible(Point)方法就可以了.
------------------------------------
我的团队:www.51team.com欢迎访问,有志者共谋事,每天都有惊喜,SOHO