问题展示
问题分析:
1.矩形具有多个变量,属于复杂变量,所以采用结构体表示
2.判断交集应采取,两个矩形上角的较小值作为交集的右边界,两个矩形上角的较大值作为交集的上边界,两个矩形下角的较大值作为交集的左边界,两个矩形下角的较小值作为交集的下边界。
注:这里相对顶点坐标采用的是左下右上为一对顶点。
3.应该具有判断交集是否成立的条件。
代码展示
#include <stdio.h>
#include <stdlib.h>
struct P {
int x;
int y;
} P1, P2;
struct S {
struct P top;
struct P bottom;
} S1, S2;
double together(struct S* S1, struct S* S2) {
int right = S1->top.x < S2->top.x ? S1->top.x : S2->top.x; // 交集的右边界
int top = S1->top.y < S2->top.y ? S1->top.y : S2->top.y; // 交集的上边界
int left = S1->bottom.x > S2->bottom.x ? S1->bottom.x : S2->bottom.x; // 交集的左边界
int bottom = S1->bottom.y > S2->bottom.y ? S1->bottom.y : S2->bottom.y; // 交集的下边界
if (left < right && top > bottom) { // 检查是否有交集
int width = right - left;
int height = top - bottom;
return (double)width * height;
}
else {
return 0.0;
}
}
int main() {
scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);
S1.top = P2;
S1.bottom = P1;
scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);
S2.top = P2;
S2.bottom = P1;
double area = together(&S1, &S2);
if (area == 0)printf("矩形无交集");
else printf("%.2lf", area);
return 0;
}
代码逐步分析
- 定义两个结构体,一个表示点(struct P), 一个表示矩形(struct S)。
- 名为
P
的结构体,包含两个整型成员x
和y
,分别代表点的横坐标和纵坐标。同时声明了两个P
类型的变量P1
和P2
。 - 名为
S
的结构体,包含两个P
类型的成员top
和bottom
,分别代表矩形的上角和下角。同时声明了两个S
类型的变量S1
和S2
。 - 定义了一个名为
together
的函数,接受两个指向S
结构体的指针作为参数,用于计算两个矩形的交集面积,并返回面积值。
- scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);使用
scanf_s
函数读取两个点的坐标,分别赋值给P1
和P2
。这里需要注意,P1
和P2
的成员赋值顺序与结构体定义有关,需要确保top
是上角,bottom
是下角。 - S1.top = P2;
S1.bottom = P1;将读取的坐标赋值给S1
的top
和bottom
成员。这里需要注意,top
应该是上角,bottom
应该是下角。 - scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);再次读取两个点的坐标,这次是为了获取第二个矩形的坐标。
- double area = together(&S1, &S2);调用
together
函数,传入S1
和S2
的地址,计算两个矩形的交集面积。 - if (area == 0) printf("矩形无交集");
else printf("%.2lf", area);根据计算出的面积值,输出结果。如果面积为0,则输出“矩形无交集”;否则,输出交集面积,保留两位小数。
together函数
together
的函数,接受两个指向S
结构体的指针作为参数,用于计算两个矩形的交集面积,并返回面积值。-
在
together
函数中,通过比较两个矩形的上角和下角坐标,计算交集的上边界、下边界、左边界和右边界:right
:取两个矩形上角的较小值作为交集的右边界。top
:取两个矩形上角的较大值作为交集的上边界。left
:取两个矩形下角的较大值作为交集的左边界。bottom
:取两个矩形下角的较小值作为交集的下边界。
检查交集并计算面积
if (left < right && top > bottom) {
int width = right - left;
int height = top - bottom;
return (double)width * height;
}
else {
return 0.0;
}
- 通过检查左边界是否小于右边界且上边界大于下边界来判断两个矩形是否有交集。如果有交集,则计算交集的宽度和高度,并返回交集面积;如果没有交集,则返回0.0。
注意:在函数用传参用的是结构体指针,结构体用指针传参数可以减少函数调用是时的复制开销,可以提高代码的效率。