如何计算两个矩形相交部分的面积?

weakwater 2009-06-16 07:04:58
矩形1是一个正矩形,各边都是单位长度
矩形2是一个经过旋转后的矩形,但是仍然是一个矩形

如果快速判断这两个矩形是否相交
如果相交,如何计算出相交部分的大概面积呢?
所谓大概面积就是相交面积占矩形1的面积的1/2, 1/4, 1/8,大概的就可以
...全文
2370 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
梧桐168 2009-08-03
  • 打赏
  • 举报
回复
将相交的两个矩形顶点按照X,Y大小排序,应该就能很快求出交点的坐标
asideu 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 liumu1209 的回复:]
矩形相交必定有一个顶点落在另一个矩形内。(我无法证明。。。)

所以只需要判断点V是否在矩形A当中就行了。
A可以用四个条边线性函数表示{y <f(x),y <g(x),y>a(x),y>b(x)}
所以只需要判断点V是符合以上不等式。只要四个顶点符合,就表明两矩形相交。
[/Quote]
简单明了!呵呵
liumu1209 2009-06-20
  • 打赏
  • 举报
回复
矩形相交必定有一个顶点落在另一个矩形内。(我无法证明。。。)

所以只需要判断点V是否在矩形A当中就行了。
A可以用四个条边线性函数表示{y<f(x),y<g(x),y>a(x),y>b(x)}
所以只需要判断点V是符合以上不等式。只要四个顶点符合,就表明两矩形相交。

另外还有一方法就是通过矩阵变换,将坐标系的X轴与Y轴与矩形A的两边重合。(矩形任选三点V1,V2,V3组成向量a,b a.b=0,a,b就可以做为坐标系的两轴,a,b的公共点为原点 )
将此矩形A对X,Y轴垂直和平行投影得x1,x2,y1,y2,将点V也进行垂直和平行投影得x3,y3,只要x1<x3<x2且y1<y3<y2 那么就表明两矩形相交


矩形相交的公共面积,没有详细想过。只能给点意见了。
对矩形A,B分另作外接圆O1,O2。即然是求近似值,那我就求两面的公共面积了。(没有仔细想过误差会有多大)
已知条件是两圆半径r1,r2,以及两圆心的距离l,求它的公共面积还是很好求的。

或许可以用另一个模型然后用积分做出来吧,那样会很精确的噢。可惜早忘了。。。
weakwater 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 booklove 的回复:]
2楼的方法不错。
包含算不算相交啊?
[/Quote]

包含算相交,我就是想得到两个矩形公共区域的面积
逐像素计算是不是效率有点低?
我是在主频较低的嵌入式设备上计算的,计算结果也不用太精确
a396830 2009-06-19
  • 打赏
  • 举报
回复
帮顶
hendriclee 2009-06-19
  • 打赏
  • 举报
回复
用CRegion吧,想怎么求交就怎么求交……
booklove 2009-06-19
  • 打赏
  • 举报
回复
2楼的方法不错。
包含算不算相交啊?
wenqinwuhai 2009-06-17
  • 打赏
  • 举报
回复
mark
weakwater 2009-06-17
  • 打赏
  • 举报
回复
多谢大家的热心回复

这个算法要自己实现,不能用Windows API
dch4890164 2009-06-17
  • 打赏
  • 举报
回复
周培德 《计算几何 算法设计与分析》
aaaa3105563 2009-06-17
  • 打赏
  • 举报
回复
帮顶·
  • 打赏
  • 举报
回复
我觉得都可以分解为多个三角形,判断各个三角形是否有相交。
这样问题就简化为判断三角形相交的情况。


这个思路可行。

http://topic.csdn.net/t/20040919/08/3387364.html




用户 昵称 2009-06-16
  • 打赏
  • 举报
回复
相交好判断,相交部分的面积可以看成两个三角形,而且是可以精确解的。
tkminigame 2009-06-16
  • 打赏
  • 举报
回复
这个因为其中一个矩形是单位正交矩形,答案会简化很多啊。你可以把问题想象为把矩形2放在一个网格里,每个网格坐标都是矩形1的整数倍,很容易求出面积来啊。
bragi523 2009-06-16
  • 打赏
  • 举报
回复
计算像素就行吧
Gothic_girl 2009-06-16
  • 打赏
  • 举报
回复
求任意两矩形的相交面积,矩形可以是倾斜的
http://topic.csdn.net/u/20071115/16/E7CDF666-0295-4CCB-995F-5F7204527C0B.html
Gothic_girl 2009-06-16
  • 打赏
  • 举报
回复
参考算法:

判断矩形相交,并求相交面积
class Point
{
private int x, y;

internal int X
{
get
{
return this.x;
}
set
{
this.x = value;
}
}

internal int Y
{
get
{
return this.y;
}
set
{
this.y = value;
}
}

public Point(int x,int y)
{
this.x = x;
this.y = y;
}
}

class Rectangle
{
private Point min = null;
internal Point Min
{
get
{
return this.min;
}
}

private Point max = null;
internal Point Max
{
get
{
return this.max;
}
}

public Rectangle(Point min, Point max)
{
this.min = min;
this.max = max;
}

public Rectangle()
{
this.min = new Point(0,0) ;
this.max = new Point(0, 0);
}
}

class TestRect
{
public static void Main(String[] args)
{
Rectangle rect1 = new Rectangle();
Rectangle rect2 = new Rectangle();
Rectangle rect = new Rectangle();
int s = 0;
rect.Min.X = System.Math.Max(rect1.Min.X, rect2.Min.X);
rect.Min.Y = System.Math.Max(rect1.Min.Y, rect2.Min.Y);
rect.Max.X = System.Math.Min(rect1.Max.X, rect2.Max.X);
rect.Max.Y = System.Math.Min(rect1.Max.Y, rect2.Max.Y);
if (rect.Min.X < rect.Max.X && rect.Min.Y < rect.Max.Y)
{
s = (rect.Max.X - rect.Min.X) * (rect.Max.Y - rect.Min.Y);
}
else
{
s = 0;
}
System.Console.WriteLine(rect.Min.X);
System.Console.WriteLine(rect.Min.Y);
System.Console.WriteLine(rect.Max.X);
System.Console.WriteLine(rect.Max.Y);

System.Console.WriteLine(s);
System.Console.ReadLine();
}
}
yangyang__ 2009-06-16
  • 打赏
  • 举报
回复
API函数:BOOL IntersectRect(LPRECT lprcDst,CONST RECT *lprcSrc1,CONST RECT *lprcSrc2)

形参lprcSrc1 与lprcSrc2为你要判断的两个矩形的RECT结构变量地址.
函数在形参lprcDst中返回两个矩形相交的区域(矩形)坐标.有了这个坐标,面积不愁.

如果两个矩形相交,函数返回非零值.否则返回0.
看不懂的话,看MSDN.
skyxie 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 weakwater 的帖子:]
矩形1是一个正矩形,各边都是单位长度
矩形2是一个经过旋转后的矩形,但是仍然是一个矩形

如果快速判断这两个矩形是否相交
如果相交,如何计算出相交部分的大概面积呢?
所谓大概面积就是相交面积占矩形1的面积的1/2, 1/4, 1/8,大概的就可以
[/Quote]

就用计算机算不规则图形面积的方法:

1. 生成一个包含包含这两个矩形的大矩形

2. 对大矩形中的任意一点, 如果它同时在两个小矩形内,则说明这个点属于相交的部分; 相交部分的面积就是所有这样的点的和.
不同时在两个小矩形内,则说明不属于相交部分.


这样求出来的相交面积是精确的.
如果相交面积为0,则说明不相交..
gyk120 2009-06-16
  • 打赏
  • 举报
回复
判断相交:
GBOOL IsIntersect(GRECT &rc)
{
if(IsEmpty(rc) || IsEmpty())
return FALSE;
if((left > rc.right) || (right < rc.left) || (top > rc.bottom) || (bottom < rc.top))
return FALSE;
return TRUE;
}
---------------------------------------------------------------

bool IsHitting(RECT rcSour, RECT rcDest)
{
bool b_Result=true;

if(rcSour.left>rcDest.right && rcSour.right>rcDest.left) b_Result=false;
if(rcSour.left<rcDest.right && rcSour.right<rcDest.left) b_Result=false;
if(rcSour.top>rcDest.bottom && rcSour.bottom>rcDest.top) b_Result=false;
if(rcSour.top<rcDest.bottom && rcSour.bottom<rcDest.top) b_Result=false;

return b_Result;
}
求面积的话,个人觉得可以用RGN来求
目录 ㈠ 点的基本运算 1. 平面上两点之间距离 1 2. 判断两点是否重合 1 3. 矢量叉乘 1 4. 矢量点乘 2 5. 判断点是否在线段上 2 6. 求一点饶某点旋转后的坐标 2 7. 求矢量夹角 2 ㈡ 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 4. 点到线段所在直线的距离 4 5. 点到折线集的最近距离 4 6. 判断圆是否在多边形内 5 7. 求矢量夹角余弦 5 8. 求线段之间的夹角 5 9. 判断线段是否相交 6 10.判断线段是否相交但不交在端点处 6 11.求线段所在直线的方程 6 12.求直线的斜率 7 13.求直线的倾斜角 7 14.求点关于某直线的对称点 7 15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求多边形面积 9 5. 判断多边形顶点的排列方向,方法一 10 6. 判断多边形顶点的排列方向,方法二 10 7. 射线法判断点是否在多边形内 10 8. 判断点是否在凸多边形内 11 9. 寻找点集的graham算法 12 10.寻找点集凸包的卷包裹法 13 11.判断线段是否在多边形内 14 12.求简单多边形的重心 15 13.求凸多边形的重心 17 14.求肯定在给定多边形内的一个点 17 15.求从多边形外一点出发到该多边形的切线 18 16.判断多边形的核是否存在 19 ㈣ 圆的基本运算 1 .点是否在圆内 20 2 .求不共线的三点所确定的圆 21 ㈤ 矩形的基本运算 1.已知矩形三点坐标,求第4点坐标 22 ㈥ 常用算法的描述 22 ㈦ 补充 1.两圆关系: 24 2.判断圆是否在矩形内: 24 3.点到平面的距离: 25 4.点是否在直线同侧: 25 5.镜面反射线: 25 6.矩形包含: 26 7.两圆交点: 27 8.两圆公共面积: 28 9. 圆和直线关系: 29 10. 内切圆: 30 11. 求切点: 31 12. 线段的左右旋: 31 13.公式: 32

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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