矩形和圆的相交检测 算法分析与实现

本文介绍了一种算法,用于检测给定圆心坐标、半径及矩形对角线上两点坐标的圆与矩形是否有重合部分。通过分三步判断:圆的内接正方形与矩形的相交情况;矩形顶点是否在圆内;以及圆的四个坐标轴方向的点与矩形的相交情况,最终返回是否重合的判断结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写一个函数
int IsOnRECT(float x, float y, float r,
        float x1, float y1, float x2, float y2)
x,y表示一个圆的圆心,r是圆的半径
x1,y1,x2,y2表示一个矩形的一条对角线上的两个顶点的坐标
矩形的四边均与坐标轴平行或者垂直
要判断这个圆和这个矩形有没有重合的部分

输入:
按照参数传递进行输入,样例中一行就是一次输入
按顺序分别对应x,y,d,x1, ....

输出:
使用函数返回值作为输出,当有重合的时候返回非0,否则请返回0
函数中不得含有任何其它输出,否则作为错误

样例输入:
1 1 1  0 0 2 2
1 1 1  2 2 3 3

样例输出:
1
0

算法分析:

分三步:

一:检测圆的内接正方形和矩形的相交与否

  

这一步可以检测出多种相交和包含的情况

如: 

二:检测矩形的四个顶点是否在圆中,用顶点跟圆心的距离计算就可以了

三:检测圆的四个坐标轴方向的点与矩形是否相交,四点位置如黑色所示

 

主要为了检测这种情况:

 

代码如下:

 

 

在C语言中,检查一个矩形是否相交可以采用一种几何方法,比如计算心到矩形各边的距离并的半径进行比较。下面是一个简单的算法概述以及一个基本的实现示例: 1. **算法概述**: - 计算心到矩形四个顶点的距离。 - 如果所有距离都小于或等于的半径,则矩形相交。 - 如果有两边的距离大于半径,那么矩形就不相交。 2. **C语言实现(假设的中心坐标为`center_x`, `center_y`,半径为`radius`,矩形左下角右上角坐标分别为`rect_left`, `rect_top`, `rect_right`, `rect_bottom`)**: ```c #include <stdio.h> #include <math.h> int isCircleRectIntersect(double center_x, double center_y, double radius, double rect_left, double rect_top, double rect_right, double rect_bottom) { // 矩形的宽度高度 double rect_width = rect_right - rect_left; double rect_height = rect_bottom - rect_top; // 心到矩形四个顶点的距离 double dist_left = hypot(rect_left - center_x, rect_top - center_y); double dist_top = hypot(rect_left - center_x, rect_top - center_y); double dist_right = hypot(rect_right - center_x, rect_bottom - center_y); double dist_bottom = hypot(rect_left - center_x, rect_bottom - center_y); // 如果任意一边的距离大于半径则不相交 if (dist_left > radius || dist_top > radius || dist_right > radius || dist_bottom > radius) return 0; // 相离 // 如果所有距离都不超过半径,则相交 return 1; // 相交 } int main() { double center_x, center_y, radius, rect_left, rect_top, rect_right, rect_bottom; printf("请输入心x,y半径,以及矩形的左右上角坐标:\n"); scanf("%lf %lf %lf %lf %lf %lf", &center_x, &center_y, &radius, &rect_left, &rect_top, &rect_right, &rect_bottom); int result = isCircleRectIntersect(center_x, center_y, radius, rect_left, rect_top, rect_right, rect_bottom); if (result == 1) printf("矩形相交。\n"); else printf("矩形相交。\n"); return 0; } ``` 注意这个实现非常基础,实际应用中可能需要考虑更复杂的情况,比如矩形的旋转或的位置变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值