C++实现两个矩形相交的面积

yang252035060 2011-08-26 04:08:25
1:两个矩形都是平行放置的。
2:给定两个矩形的坐标(x0,y0,x1,y1),(x2,y2,x3,y3)
3:考虑三种情况,相交,一个矩形在另一个的里面,不相交
...全文
1295 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
miracle2000 2011-08-26
  • 打赏
  • 举报
回复
路过,可惜用不到。。。。。。。。。
赵4老师 2011-08-26
  • 打赏
  • 举报
回复
仅供参考
//实现一个函数:求数轴上多个线段覆盖的区域对应的多个线段; 输入多个线段,求出被这些线段覆盖的所有区域(也用线段表示); 一条线段用两个值表示(x0,x1), 其中x1>x0;
//比如(1,3);(2,4);(5,6);结果为(1,4);(5,6);
//比如(1,3);(2,4);(5,6);(4,7);结果为(1,7);
#include <stdio.h>
#define MAXLINES 100
struct LINE {
int x0;//左端
int x1;//右端
} ls[MAXLINES];
int i,j,k,n,x0,x1,c;
void add() {
if (0==n) {//加入第一对点
ls[n].x0=x0;
ls[n].x1=x1;
n=1;
} else {
if (x1==ls[0].x0) {//右端=第一条线段的左端
ls[0].x0=x0;//第一条线段的左端修改为左端
return;
}
if (x1<ls[0].x0) {//右端<第一条线段的左端
for (i=n-1;i>=0;i--) {//将所有线段往后移
ls[i+1].x0=ls[i].x0;
ls[i+1].x1=ls[i].x1;
}
ls[0].x0=x0;//新第一条线段为x0,x1
ls[0].x1=x1;
n++;
return;
}
if (ls[n-1].x1<x0) {//左端>最后那条线段的右端
ls[n].x0=x0;//新最后那条线段
ls[n].x1=x1;
n++;
return;
}
if (x0<=ls[0].x0 && ls[n-1].x1<=x1) {//左端≤第一条线段的左端且最后那条线段的右端≤右端
ls[0].x0=x0;//只剩这一条线段
ls[0].x1=x1;
n=1;
return;
}
for (i=0;i<n;i++) {//从左到右依次检查每条线段
if (ls[i].x0<=x0 && x0<=ls[i].x1) {//第i条线段的左端≤左端≤第i条线段的右端
for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段
if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端
ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端
for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
ls[i+k].x0=ls[j+k].x0;
ls[i+k].x1=ls[j+k].x1;
}
n-=j-i;
return;
}
if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)
ls[i].x1=x1;//第i条线段的右端改为右端
for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
ls[i+k].x0=ls[j+k].x0;
ls[i+k].x1=ls[j+k].x1;
}
n-=j-i;
return;
}
}
}
if (ls[i].x1<x0 && (i==n-1 || x0<ls[i+1].x0)) {//第i条线段的右端<左端<第i+1条线段的左端(如果有)
if (i!=n-1 && x1<ls[i+1].x0) {//右端<第i+1条线段的左端(如果有)
for (k=n-1;k>=i+1;k--) {//将从第i+1条线段开始的所有线段往后移
ls[k+1].x0=ls[k].x0;
ls[k+1].x1=ls[k].x1;
}
ls[i+1].x0=x0;//新第i+1条线段为x0,x1
ls[i+1].x1=x1;
n++;
return;
}
for (j=i+1;j<n;j++) {//从第i+1条线段开始从左到右依次检查每条线段
if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端
ls[i+1].x0=x0;//第i+1条线段的左端改为左端
ls[i+1].x1=ls[j].x1;//第i+1条线段的右端改为第j条线段的右端
for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
ls[i+1+k].x0=ls[j+k].x0;
ls[i+1+k].x1=ls[j+k].x1;
}
n-=j-i-1;
return;
}
if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)
ls[i+1].x0=x0;//第i+1条线段的左端改为左端
ls[i+1].x1=x1;//第i+1条线段的右端改为右端
for (k=1;k<n-j-1;k++) {//将剩余线段往前移
ls[i+k].x0=ls[j+k].x0;
ls[i+k].x1=ls[j+k].x1;
}
n-=j-i-1;
return;
}
}
}
if (x0<ls[i].x0) {//左端<第i条线段的左端
for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段
if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端
ls[i].x0=x0;//第i条线段的左端改为左端
ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端
for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
ls[i+k].x0=ls[j+k].x0;
ls[i+k].x1=ls[j+k].x1;
}
n-=j-i;
return;
}
if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)
ls[i].x0=x0;//第i条线段的左端改为左端
ls[i].x1=x1;//第i条线段的右端改为右端
for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
ls[i+k].x0=ls[j+k].x0;
ls[i+k].x1=ls[j+k].x1;
}
n-=j-i;
return;
}
}
}
}
}
}
void show() {
for (i=0;i<n;i++) {
printf("(%d,%d);",ls[i].x0,ls[i].x1);
}
printf("\n");
}
void main() {
n=0;
c=0;
while (1) {
printf("Input x0,x1(x0<x1;0,0 to exit):");
fflush(stdout);
rewind(stdin);
if (2==scanf("%d,%d",&x0,&x1)) {
if (0==x0&&0==x1) break;
if (x1>x0) {
c++;
if (c>=MAXLINES) {
printf("Up to %d!\n",MAXLINES);
break;
}
add();
show();
}
}
}
}

当然解决楼主的问题不需要这么复杂。
nnull 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

相交时候:两个矩形的四个顶点中,都有一个顶点在另一个矩形之内。
分别遍历两个矩形的顶点,找到那两个顶点面积可以计算出。
[/Quote]

错,有可能一个矩形的两个顶点都在另外一矩形中,即“插入”也是“相交”~~
limang89 2011-08-26
  • 打赏
  • 举报
回复
首先遍历定点判断是否相交(包括一个在另一个内),然后判断是否一个在另一个内(包括重合),最后计算相交的。。

判断相交的方法:一个矩形的至少有一个顶点在另一个矩形内。
一个在另一个内:一个矩形的4个顶点都在另一个矩形内。面积及是里面那个矩形的面积。
相交计算面积:有两种情况,只有一个顶点在另个内;有两个顶点在另一个内
iamnobody 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mingliang1212 的回复:]
引用 5 楼 mingliang1212 的回复:
简单,
计算其中一个矩形(A)的四个顶点到另一矩形(B)的四边的距离。如果其中四个顶点到四边距离都小于B的边长,A在B内,else 如果有一个点到四边距离小于B的边长,相交ELSE 不相交

看成正方形了。容我三思
[/Quote]
有结果了,
如果 d1,d2,d3,d4,分别是一点到四边的距离,如果d1+d3 == 高 || d2+d4 == 宽,刚该点在距形内
iamnobody 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mingliang1212 的回复:]
简单,
计算其中一个矩形(A)的四个顶点到另一矩形(B)的四边的距离。如果其中四个顶点到四边距离都小于B的边长,A在B内,else 如果有一个点到四边距离小于B的边长,相交ELSE 不相交
[/Quote]
看成正方形了。容我三思
iamnobody 2011-08-26
  • 打赏
  • 举报
回复
简单,
计算其中一个矩形(A)的四个顶点到另一矩形(B)的四边的距离。如果其中四个顶点到四边距离都小于B的边长,A在B内,else 如果有一个点到四边距离小于B的边长,相交ELSE 不相交
机智的呆呆 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 demon__hunter 的回复:]
if x1>x0>0&&y1>y0>0&&x3>x2>0&&y3>y2>0

x0=max(x0,x2)
y0=max(y0,y2)
x1=min(x1,x3)
y1=min(y1,y3)
[/Quote]
无视吧,考虑的太简单了
phoeni_xin 2011-08-26
  • 打赏
  • 举报
回复
额。看看。
机智的呆呆 2011-08-26
  • 打赏
  • 举报
回复
if x1>x0>0&&y1>y0>0&&x3>x2>0&&y3>y2>0

x0=max(x0,x2)
y0=max(y0,y2)
x1=min(x1,x3)
y1=min(y1,y3)
ryfdizuo 2011-08-26
  • 打赏
  • 举报
回复
相交时候:两个矩形的四个顶点中,都有一个顶点在另一个矩形之内。
分别遍历两个矩形的顶点,找到那两个顶点面积可以计算出。
㈠ 点的基本运算 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
计算机图形学几何算法源码包,如下:

目录

㈠ 点的基本运算
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

64,644

社区成员

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

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