来个非算法的,求矩形交集的面积

healer_kx 2012-09-13 06:55:04
在一个平面坐标系上,有两个矩形,它们的边分别平行于X和Y轴。
其中,矩形A已知, ax1(左边), ax2(右边), ay1(top的纵坐标), ay2(bottom纵坐标). 矩形B,类似,就是 bx1, bx2, by1, by2。这些值都是整数就OK了。
要求是,如果矩形没有交集,返回-1, 有交集,返回交集的面积。

int area(rect const& a, rect const& b)
{
...
}

补齐代码,我认为好的代码应该是简洁的。别用库。你可以写你的辅助函数,宏定义。代码风格也很重要。


...全文
3035 89 打赏 收藏 转发到动态 举报
写回复
用AI写文章
89 条回复
切换为时间正序
请发表友善的回复…
发表回复
onlyonesai 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 80 楼 的回复:]

菜鸟写了一个,效率不咋的,不过应该易懂哈C/C++ code
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double ax1,bx1,ax2,bx2,ay1,ay2,by1,by2,s;//ax1(左边), ax2(右边), ay1(top的纵坐标), ay2(bottom纵坐标). 矩形……
[/Quote]
……这个不对吧
zsc09_leaf 2012-10-02
  • 打赏
  • 举报
回复
这里暂且不考虑精度问题哦。
zsc09_leaf 2012-10-02
  • 打赏
  • 举报
回复
#define MAX(a,b) (a)>(b)?(a):(b)
#define MIN(a,b) (a)>(b)?(b):(a)

typedef struct rect
{
double left,top,right,bottoom;
}rect;

double area(rect const& a, rect const& b)
{
if(!(b.right > a.left && b.top > a.bottoom && b.left < a.right && b.bottoom < a.top))
{
return 0.00;
}
double h = (MIN(a.top,b.top)) - (MAX(a.bottoom,b.bottoom));
double l = (MIN(a.right,b.right))- (MAX(a.left,b.left));
return h*l;
}
zsc09_leaf 2012-10-02
  • 打赏
  • 举报
回复
#define MAX(a,b) (a)>(b)?(a):(b)
#define MIN(a,b) (a)>(b)?(b):(a)
typedef struct rect
{
double left,top,right,bottoom;
}rect;
double area(rect const& a, rect const& b)
{
if(!(b.right > a.left && b.top > a.bottoom && b.left < a.right && b.bottoom < a.top))
{
return 0.00;
}
double h = (MIN(a.top,b.top)) - (MAX(a.bottoom,b.bottoom));
double l = (MIN(a.right,b.right))- (MAX(a.left,b.left));
return h*l;
}
hahajluzxb 2012-09-21
  • 打赏
  • 举报
回复
#include <stdio.h>
#define mintwo(x,y) ((x)>(y)?(y):(x))
#define min(x,y,z,a) mintwo(mintwo(x,y),mintwo(z,a))
main()
{
int ax1,ax2,ay1,ay2,bx1,bx2,by1,by2;
scanf("%d %d %d %d",&ax1,&ax2,&ay1,&ay2);
scanf("%d %d %d %d",&bx1,&bx2,&by1,&by2);
if(!(ax1<ax2&&ay1<ay2)||!(bx1<bx2&&by1<by2))
{
printf("error,one or more rect ");
return;
}


if(ax1>bx2||ax2<bx1||ay1<by2||ay2>by1)
printf("-1\n");
else
printf("%d\n", min(bx2-ax1,ax2-bx1,bx2-bx1,ax2-ax1)*min(ay1-by2,by1-ay2,by2-by1,ay2-ay1));


}
晕,看了一下,发现写错了,重写下吧
windkismet 2012-09-21
  • 打赏
  • 举报
回复
int area(rect const& a, rect const& b)
{
...
}
ax1\ax2\ay1\ay2\bx1\bx2\by1\by2 根据a\b中的成员替换

就不填函数了,直接给思路,欢迎各位提疑指正:

新的相交矩形定义: 左上角(x1,y1)右下角(x2,y2) 有效矩形,当且仅当 x1<x2 && y1<y2

函数实现如下:
{
x1 = (ax1>bx1)?ax1:bx1;
y1 = (ay1>by1)?ay1:by1;
x2 = (ax2<bx2)?ax2:bx2;
y2 = (ay2<by2)?ay2:by2;

if(x1<x2 && y1<y2)
return ((x2-x1)*(y2-y1));

return -1;
}
hahajluzxb 2012-09-21
  • 打赏
  • 举报
回复
#include <stdio.h>
main()
{

if(ax1>bx2&&ax2<bx1&&ay1<by2&&ay2>by1)
return -1;
else
return min(|bx2-ax1|,|ax2-bx1|,|bx2-bx1|,|ax2-ax1|)*min(|by2-ay1|,|ay2-by1|,|by2-by1|,|ay2-ay1|);


}
随手写的一个,不知道对不对,望指正,没写全
corn8888 2012-09-21
  • 打赏
  • 举报
回复
汇编都上来了
xcszbdnl 2012-09-20
  • 打赏
  • 举报
回复
不就是一个线段树的用法么??
olderma 2012-09-20
  • 打赏
  • 举报
回复
菜鸟写了一个,效率不咋的,不过应该易懂哈
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double ax1,bx1,ax2,bx2,ay1,ay2,by1,by2,s;//ax1(左边), ax2(右边), ay1(top的纵坐标), ay2(bottom纵坐标). 矩形B,类似,就是 bx1, bx2, by1, by2
cin>>ax1>>ax2>>bx1>>bx2>>ay1>>ay2>>by1>>by2;
if(((ax1<=bx1)&&(bx1<=ax2))&&((ay2<=by2)&&(by2<=ay1)))
{
s=(ax2-bx1)*(ay1-by2);
cout<<"面积="<<s;
}
else
if(((ax1<=bx1)&&(bx1<=ax2))&&((by2<=ay2)&&(ay2<=by1)))
{
s=(ax2-bx1)*(by1-ay2);
cout<<"面积="<<s;
}
else
{
if(((bx1<=ax1)&&(ax1<=bx2))&&((ay2<=by2)&&(by2<=ay1)))
{
s=(bx2-ax1)*(ay1-by2);
cout<<"面积="<<s;
}
else
{
if(((bx1<=ax1)&&(ax1<=bx2))&&((ay2<=by2)&&(by2<=ay1)))
{
s=(bx2-ax1)*(ay1-by2);
cout<<"面积="<<s;
}
else
{
cout<<"-1";
}
}
}
}
niu_a 2012-09-20
  • 打赏
  • 举报
回复

int longth(int first, int second)
{
return second-first;
}
int min(int first, int second)
{
return first<second?first:second;
}
int max(int first,int second)
{
return first<second?second:first;
}
int area(rect const &a, rect const&b)
{
int w = longth(a.left,a.right)+longth(b.left,b.right)-longth(min(a.left,b.left),max(a.right,b.right));
if(w>0)
{
int h=longth(a.top,a.bottom)+longth(b.top,b.bottom)-longth(min(a.top,b.top),max(a.bottom,b.bottom));
if(h>0)
return w*h;
}
return 0;
}
niu_a 2012-09-20
  • 打赏
  • 举报
回复

int longth(int first, int second)
{
return second-first;
}
int min(int first, int second)
{
return first<second?first:second;
}
int max(int first,int second)
{
return first<second?second:first;
}
int area(rect const &a, rect const&b)
{
int w = longth(a.left,a.right)+longth(b.left,b.right)-longth(min(a.left,b.left),max(a.right,b.right));
if(w>0)
{
int h=longth(a.top,a.bottom)+longth(b.top,b.bottom)-longth(min(a.top,b.top),max(a.bottom,b.bottom));
if(h>0)
return w*h;
}
return 0;
}
niu_a 2012-09-20
  • 打赏
  • 举报
回复
int longth(int first, int second)
{
return second-first;
}
int min(int first, int second)
{
return first<second?first:second;
}
int max(int first,int second)
{
return first<second?second:first;
}
int area(rect const &a, rect const&b)
{
int w = longth(a.left,a.right)+longth(b.left,b.right)-longth(min(a.left,b.left),max(a.right,b.right));
if(w>0)
{
int h=longth(a.top,a.bottom)+longth(b.top,b.bottom)-longth(min(a.top,b.top),max(a.bottom,b.bottom));
if(h>0)
return w*h;
}
return 0;
}
老王爱上猫 2012-09-18
  • 打赏
  • 举报
回复
当初面试的时候没有弄出来
yuriarthas 2012-09-18
  • 打赏
  • 举报
回复
怎么楼上这么多代码?不就是看两个矩阵是否有重合的地方么?怎么这么麻烦?还是我想错了?
ri_aje 2012-09-18
  • 打赏
  • 举报
回复

#include <cstdio>

template <typename T> T const& min (T const& x, T const& y) { return x<y ? x : y; }
template <typename T> T const& max (T const& x, T const& y) { return x>y ? x : y; }

int ax0,ay0,ax1,ay1;
int bx0,by0,bx1,by1;

int area ()
{
int const dx = min(ax1,bx1) - max(ax0,bx0);
int const dy = min(ay1,by1) - max(ay0,by0);
return dx>=0&&dy>=0 ? dx*dy : -1;
}

int main ()
{
int a;

ax0=20;ay0=30;
ax1=80;ay1=70;
bx0=10;by0=50;
bx1=90;by1=60;
a=area();
printf("area=%d\n",a);

return 0;
}


movl ax1, %eax
movl ax0, %edx
cmpl %eax, bx1
cmovle bx1, %eax
cmpl %edx, bx0
cmovge bx0, %edx
movl ay1, %ecx
subl %edx, %eax
movl ay0, %edx
cmpl %ecx, by1
cmovle by1, %ecx
cmpl %edx, by0
cmovge by0, %edx
subl %edx, %ecx
js .L3
testl %eax, %eax
js .L3
imull %ecx, %eax
ret
.L3:
movl $-1, %eax
ret
ruf 2012-09-17
  • 打赏
  • 举报
回复
bool intersect(const SkIRect& a, const SkIRect& b) {
SkASSERT(&a && &b);

if (!a.isEmpty() && !b.isEmpty() &&
a.fLeft < b.fRight && b.fLeft < a.fRight &&
a.fTop < b.fBottom && b.fTop < a.fBottom) {
fLeft = SkMax32(a.fLeft, b.fLeft);
fTop = SkMax32(a.fTop, b.fTop);
fRight = SkMin32(a.fRight, b.fRight);
fBottom = SkMin32(a.fBottom, b.fBottom);
return true;
}
return false;
}
赵4老师 2012-09-17
  • 打赏
  • 举报
回复
编译运行通过的版本:
#include <stdio.h>
int ax1,ay1,ax2,ay2;
int bx1,by1,bx2,by2;
//在一个平面坐标系上,有两个矩形,它们的边分别平行于X和Y轴。
//其中,矩形A已知, ax1(左边), ax2(右边), ay1(top的纵坐标), ay2(bottom纵坐标). 矩形B,类似,就是 bx1, bx2, by1, by2。这些值都是整数就OK了。
//要求是,如果矩形没有交集,返回-1, 有交集,返回交集的面积。
int area() {
int b1c=0,b2c=0;

//__asm int 3;//快速定位Release版汇编代码用
if (bx1<ax1) b1c+=3*0;
else if (ax2<=bx1) b1c+=3*2;
else b1c+=3*1;

if (by1<ay1) b1c+= 0;
else if (ay2<=by1) b1c+= 2;
else b1c+= 1;

if (bx2<ax1) b2c+=3*0;
else if (ax2<=bx2) b2c+=3*2;
else b2c+=3*1;

if (by2<ay1) b2c+= 0;
else if (ay2<=by2) b2c+= 2;
else b2c+= 1;

switch (b1c*9+b2c) {
case 0:
case 1:
case 2:
case 3:
case 6:
case 10:
case 11:
case 20:
case 23:
case 26:
case 30:
case 33:
case 50:
case 53:
case 60:
case 61:
case 62:
case 70:
case 71:
case 80:
return -1;
case 4:
return (bx2-ax1)*(by2-ay1);
case 5:
return (bx2-ax1)*(ay2-ay1);
case 7:
return (ax2-ax1)*(by2-ay1);
case 8:
return (ax2-ax1)*(ay2-ay1);
case 13:
return (bx2-ax1)*(by2-by1);
case 14:
return (bx2-ax1)*(ay2-by1);
case 16:
return (ax2-ax1)*(by2-by1);
case 17:
return (ax2-ax1)*(ay2-by1);
case 31:
return (bx2-bx1)*(by2-ay1);
case 32:
return (bx2-bx1)*(ay2-ay1);
case 34:
return (ax2-bx1)*(by2-ay1);
case 35:
return (ax2-bx1)*(ay2-ay1);
case 40:
return (bx2-bx1)*(by2-by1);
case 41:
return (bx2-bx1)*(ay2-by1);
case 43:
return (ax2-bx1)*(by2-by1);
case 44:
return (ax2-bx1)*(ay2-by1);
case 9:
case 12:
case 15:
case 18:
case 19:
case 21:
case 22:
case 24:
case 25:
case 27:
case 28:
case 29:
case 36:
case 37:
case 38:
case 39:
case 42:
case 45:
case 46:
case 47:
case 48:
case 49:
case 51:
case 52:
case 54:
case 55:
case 56:
case 57:
case 58:
case 59:
case 63:
case 64:
case 65:
case 66:
case 67:
case 68:
case 69:
case 72:
case 73:
case 74:
case 75:
case 76:
case 77:
case 78:
case 79:
printf("not ax1<=ax2 or not ay1<ay2 or not bx1<bx2 or not by1<by2!");
return -1;
break;
}
return -1;
}
int main() {
int a;

ax1=20;ay1=30;
ax2=80;ay2=70;
bx1=10;by1=50;
bx2=90;by2=60;
a=area();
printf("area=%d\n",a);
}
//area=600
赵4老师 2012-09-17
  • 打赏
  • 举报
回复
68楼中指令
004010A7 FF 24 9D 40 12 40 00 jmp dword ptr [ebx*4+401240h]
使用的跳转表:
00401240  00401234  004010AE  004010CA
0040124C 004010D1 004010ED 00401226
00401258 004010F4 00401110 0040112F
00401264 0040114B 0040116A 00401180
00401270 00401199 004011AF 004011C8
0040127C 004011DE 004011F7 0040120D

xiao910xx 2012-09-17
  • 打赏
  • 举报
回复
选两个矩形的左上角的坐标 可判断出上下和左右的位置关系
然后可选择 一个的左上的坐标 一个选择右下的坐标 可得到是否重叠或重叠矩形的边长
加载更多回复(65)
第1章算法设计和分析 1.1概述 1.2算法设计原则 1.3算法复杂性的度量 1.3.1时间复杂性 1.3.2空间复杂性 1.4最优算法 1.5算法的评价 1.5.1如何估计算法运行时间 1.5.2最坏情况和平均情况的分析 1.5.3平摊分析 1.5.4输入大小和问题实例 思考题 第2章GIS算法的计算几何基础 2.1维数扩展的9交集模型 2.1.1概述 2.1.2模型介绍 2.1.3空间关系的判定 2.2矢量的概念 2.2.1矢量加减法 2.2.2矢量叉积 2.3折线段的拐向判断 2.4判断点是否在线段上 2.5判断两线段是否相交 2.6判断矩形是否包含点 2.7判断线段、折线、多边形是否在矩形中 2.8判断矩形是否在矩形中 2.9判断圆是否在矩形中 2.10判断点是否在多边形内 2.10.1射线法 2.10.2转角法 2.11判断线段是否在多边形内 2.12判断折线是否在多边形内 2.13判断多边形是否在多边形内 2.14判断矩形是否在多边形内 2.15判断圆是否在多边形内 2.16判断点是否在圆内 2.17判断线段、折线、矩形、多边形是否在圆内 2.18判断圆是否在圆内 2.19计算两条共线的线段的交点 2.20计算线段或直线与线段的交点 2.21线段或直线与圆的交点 2.22中心点的计算 2.23过点作垂线 2.24作平行线 2.25过点作平行线 2.26线段延长 2.27三点画圆 2.28线段打断 2.29前方交会 2.30距离交会 2.31极坐标作点 思考题 第3章空间数据的变换算法 3.1平面坐标变换 3.1.1平面直角坐标系的建立 3.1.2平面坐标变换矩阵 3.1.3平移变换 3.1.4比例变换 3.1.5对称变换 3.1.6旋转变换 3.1.7错切变换 3.1.8复合变换 3.1.9相对(xf,yf)点的比例变换 3.1.10相对(xf,yf)点的旋转变换 3.1.11几点说明 3.2球面坐标变换 3.2.1球面坐标系的建立 3.2.2确定新极Q地理坐标中、 3.3仿射变换 3.4地图投影变换 3.4.1概述 3.4.2地球椭球体的相关公式 3.4.3兰勃特投影 3.4.4墨卡托投影 3.4.5高斯一克吕格投影 3.4.6通用横轴墨卡托投影 思考题 第4章空间数据转换算法 4.1矢量数据向栅格数据转换 4.1.1矢量点的栅格化 4.1.2矢量线的栅格化 4.1.3矢量面的栅格化 4.2栅格数据向矢量数据转换 4.2.1栅格点坐标与矢量点坐标的关系 4.2.2栅格数据矢量化的基本步骤 4.2.3线状栅格数据的细化 4.2.4多边形栅格转矢量的双边界搜索算法 4.2.5多边形栅格转矢量的单边界搜索算法 思考题 第5章空间数据组织算法 5.1矢量数据的压缩 5.1.1间隔取点法 5.1.2垂距法和偏角法 5.1.3道格拉斯一普克法 5.1.4光栏法 5.1.5曲线压缩算法的比较 5.1.6面域的数据压缩算法 5.2栅格数据的压缩 5.2.1链式编码 5.2.2游程长度编码 5.2.3块式编码 5.2.4差分映射法 5.2.5四叉树编码 5.3拓扑关系的生成 5.3.1基本数据结构 5.3.2弧段的预处理 5.3.3结点匹配算法 5.3.4建立拓扑关系 思考题 第6章空间度量算法 6.1直线和距离 6.1.1直线 6.1.2直线方程 6.1.3点到直线的距离 6.2角度量算 6.3多边形面积的量算 6.3.1三角形面积量算 6.3.2四边形面积量算 6.3.3任意二维平面多边形面积量算 6.3.4任意三维平面多边形面积量算 思考题 第7章空间数据索引算法 7.1B树与B+树 7.1.1B树索引结构 7.1.2B+树索引结构 7.2R树结构 7.2.1R树定义 7.2.2R树索引的主要操作算法 7.2.3R*树算法 7.3四叉树结构 7.3.1常规四叉树 7.3.2线性四叉树 7.3.3线性四叉树的编码 7.3.4Z曲线和Hibert曲线算法 思考题 第8章空间数据内插算法 8.1概述 8.1.1几何方法 8.1.2统计方法 8.1.3空间统计方法 8.1.4函数方法 8.1.5随机模拟方法 8.1.6确定性模拟 8.1.7综合方法 8.2分段圆弧法 8.3分段三次多项式插值法 8.3.1三点法 8.3.2五点法 8.4趋势面插值算法 8.5反距离权重插值算法 8.6双线性插值算法 8.7薄板样条函数法 8.7.1薄板样条函数法 8.7.2规则样条函数 8.7.3薄板张力样条法 8.8克里金法 8.8.1普通克里金法 8.8.2通用克里金法 思考题 第9章Delaunay三角网与Voronoi图算法 9.1概述 9.2Voronoi图 9.3Delaunay三角形 9.4Voronoi图生成算法 9.4.1半平面的交 9.4.2增量构造方法 9.4.3分治算法 9.4.4减量算法 9.4.5平面扫描算法 思考题 第10章缓冲区分析算法 10.1概述 10.2缓冲区边界生成算法基础 10.3点缓冲区边界生成算法 10.4线缓冲区边界生成算法 10.5面缓冲区边界生成算法 10.6多目标缓冲区合并算法 思考题 第11章网络分析算法 11.1概述 11.2网络数据模型 11.3路径分析算法 11.3.1单源点的最短路径 11.3.2单目标最短路径问题 11.3.3单结点对间最短路径问题 11.3.4多结点对间最短路径问题 11.3.5次短路径算法 11.4最佳路径算法 11.4.1最大可靠路径 11.4.2最大容量路径 11.5连通性分析算法 11.5.1Prim算法 11.5.2Kruskal算法 11.6资源分配算法 思考题 第12章地形分析算法 12.1数字地面模型的生成算法 12.1.1基于离散点的DEM规则网格的生成 12.1.2基于不规则三角网的DEM生成 12.1.3DEM数据结构的相互转换 12.2基本地形因子分析算法 12.2.1坡面因子提取的算法基础 12.2.2坡度、坡向 12.2.3坡形 12.3地形特征提取算法 12.3.1地形特征点的提取 12.3.2基于规则格网DEM数据提取山脊与山谷线的典型算法 12.4通视分析算法 12.4.1判断两点之间的可视性的算法 12.4.2计算可视域的算法 思考题 第13章空间数据挖掘算法 13.1概述 13.2分类算法 13.2.1数据分类的基本过程 13.2.2决策树分类概述 13.2.3决策树的特点 13.2.4二叉决策树算法与分类规则的生成 13.2.5决策树分类算法 13.2.6决策树属性的选取 13.2.7改进决策树性能的方法 13.3泛化规则算法 13.3.1概念层次 13.3.2面向属性泛化的策略与特点 13.3.3基于规则的面向属性泛化方法 13.4相关分析 13.4.1两要素间的相关分析 13.4.2多要素之间的相关分析 13.4.3关联规则算法 13.5回归分析 13.5.1一元线性回归模型 13.5.2多元线性回归模型 13.5.3线性回归模型 13.5.4回归分析与相关分析 13.6系统聚类分析 13.6.1概述 13.6.2聚类要素预处理 13.6.3分类统计量 13.6.4系统聚类法 13.6.5其他聚类方法概述 13.7判别分析 13.7.1距离判别 13.7.2费歇判别法 13.7.3贝叶斯判别法 13.7.4判别分析应注意的问题 13.8主成分分析 13.8.1主成分分析的基本原理 13.8.2主成分分析的方法 思考题 第14章数据输出算法 14.1概述 14.1.1地图符号构成元素组成 14.1.2地图符号几何特征 14.1.3基于SVG的地图符号描述模型 14.2点状地图符号的绘制 14.2.1圆的绘制 14.2.2椭圆的绘制 14.2.3多边形的绘制 14.2.4五角星的绘制 14.3线状地图符号的绘制 14.3.1平行线绘制 14.3.2虚线绘制 14.3.3短齿线的绘制 14.3.4铁路线的绘制 14.3.5境界线的绘制 14.4面状地图符号的绘制

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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