C++判断矩形与圆是否相交

代码:

#include<iostream>
#include<math.h>
using namespace std;

//定义一个顶点结构体 
struct Point{
	double x;
	double y;
};

//定义判断是否相交的函数 
bool isIntersect(Point q1,Point q2,Point q3,Point q4,double r){
	for(int i=0;i<1;i++){
    	//判断矩形是否有一顶点在圆内 ,有则相交 
	    double minx=min(fabs(q1.x-q3.x),fabs(q1.x-q4.x));
	    double miny=min(fabs(q1.y-q3.y),fabs(q1.y-q4.y));
	    if(minx*minx+miny*miny<r*r)  
	    	return true;	    	
	    //判断圆是否与矩形左右两条边相交 
	    if((fabs(q1.x-q2.x)<(fabs(q3.x-q4.x)/2+r))&&(fabs(q1.y-q2.y)<fabs(q3.y-q4.y)/2)) 
		    return true;
	    //判断圆是否与矩形上下两条边相交
	    if((fabs(q1.y-q2.y)<(fabs(q3.y-q4.y)/2+r))&&(fabs(q1.x-q2.x)<fabs(q3.x-q4.x)/2))
		    return true;
	} 
	return false;
} 

int main(){
	//分别定义圆和矩形的中心点以及矩形左下右上两个点 
	Point p1,p2,p3,p4; 
	double r,a,b;
	//输入圆 
	cout<<"请输入圆心坐标和半径:"<<endl; 
	cin>>p1.x>>p1.y>>r;
	//输入矩形 
	cout<<"请输入矩形中心坐标和长宽:"<<endl;	
	cin>>p2.x>>p2.y>>a>>b;
	p3.x=p2.x-a/2;
	p3.y=p2.y-b/2;
	p4.x=p2.x+a/2;
	p4.y=p2.y+b/2;
	//判断是否相交 
	if(isIntersect(p1,p2,p3,p4,r)==true)
	    cout<<"圆与矩形相交"<<endl;
	else
	    cout<<"圆与矩形不相交"<<endl; 
	return 0;
} 

输入输出:

 

 

 参考文献:

https://www.cnblogs.com/llkey/p/3707351.html

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断线段与矩形是否相交可以分为两种情况: 1. 线段的两个端点都在矩形内部: 这种情况比较简单,只需要判断线段的两个端点是否都在矩形内部即可。可以通过比较端点的坐标与矩形的边界坐标来实现。如果两个端点都在矩形内部,则线段与矩形相交。 2. 线段的两个端点不都在矩形内部: 这种情况稍微复杂一些,需要判断线段是否矩形的四条边相交。可以将矩形的四条边分别表示成直线方程,然后判断线段是否与这些直线相交。如果线段与矩形的任意一条边相交,则线段与矩形相交。 下面是一段示例代码,演示了如何判断线段与矩形相交: ```c++ #include <iostream> using namespace std; struct Point { double x, y; }; struct Segment { Point start, end; }; struct Rectangle { Point leftTop, rightBottom; }; // 计算两点间的距离 double distance(Point p1, Point p2) { double dx = p1.x - p2.x; double dy = p1.y - p2.y; return sqrt(dx * dx + dy * dy); } // 判断是否矩形内部 bool inRectangle(Point p, Rectangle rect) { return p.x >= rect.leftTop.x && p.x <= rect.rightBottom.x && p.y >= rect.leftTop.y && p.y <= rect.rightBottom.y; } // 判断线段是否矩形相交 bool isIntersect(Segment seg, Rectangle rect) { // 判断线段两个端点是否都在矩形内部 if (inRectangle(seg.start, rect) && inRectangle(seg.end, rect)) { return true; } // 判断线段是否矩形的四条边相交 Point p1 = rect.leftTop; Point p2 = {rect.rightBottom.x, rect.leftTop.y}; Point p3 = rect.rightBottom; Point p4 = {rect.leftTop.x, rect.rightBottom.y}; Segment edge1 = {p1, p2}; Segment edge2 = {p2, p3}; Segment edge3 = {p3, p4}; Segment edge4 = {p4, p1}; Segment edges[] = {edge1, edge2, edge3, edge4}; for (int i = 0; i < 4; i++) { Segment edge = edges[i]; // 判断线段是否与边相交 double d1 = (seg.end.x - seg.start.x) * (edge.start.y - seg.start.y) - (seg.end.y - seg.start.y) * (edge.start.x - seg.start.x); double d2 = (seg.end.x - seg.start.x) * (edge.end.y - seg.start.y) - (seg.end.y - seg.start.y) * (edge.end.x - seg.start.x); if (d1 * d2 <= 0) { double d3 = (edge.end.x - edge.start.x) * (seg.start.y - edge.start.y) - (edge.end.y - edge.start.y) * (seg.start.x - edge.start.x); double d4 = (edge.end.x - edge.start.x) * (seg.end.y - edge.start.y) - (edge.end.y - edge.start.y) * (seg.end.x - edge.start.x); if (d3 * d4 <= 0) { return true; } } } return false; } int main() { Segment seg = {{1, 1}, {3, 3}}; Rectangle rect = {{2, 2}, {4, 4}}; if (isIntersect(seg, rect)) { cout << "线段与矩形相交" << endl; } else { cout << "线段与矩形相交" << endl; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值