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

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

如果快速判断这两个矩形是否相交
如果相交,如何计算出相交部分的大概面积呢?
所谓大概面积就是相交面积占矩形1的面积的1/2, 1/4, 1/8,大概的就可以
...全文
2290 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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来求

19,471

社区成员

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

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