判断圆和矩形是否相交

#include <iostream>

#include

#include <cstdio>

#include <cstring>

#include <cmath>

using namespace std;

const double eps = 1e-8;

const double pi = acos(-1);

struct POINT

{

    double x, y;

    POINT(double a, double b){

        x = a;

        y = b;

    }

    POINT() {}

};

struct Seg

{

    POINT a, b;

    Seg() {}

    Seg(POINT x, POINT y){

        a = x;

        b =y;

    }

};

struct Line

{

    POINT a, b;

    Line() {}

    Line(POINT x, POINT y){

        a = x;

        b = y;

    }

};

struct Cir

{

    POINT o;

    double r;

    Cir() {}

    Cir(POINT oo, double rr){

        o = oo;

        r = rr;

    }

};

struct Rec

{

    POINT p1, p2, p3, p4;

    Rec() { }

    Rec(POINT a, POINT b, POINT c, POINT d){

        p1 = a;

        p2 = b;

        p3 = c;

        p4 = d;

    }

};

int dcmp(double x)

{

    if(fabs(x) < eps) return 0;

    else return x < 0 ? -1 : 1;

}

double x, y, r;

double x1, yy1, x2, y2;

double cross(POINT o, POINT a, POINT b)

{

    return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);

}

double dis(POINT a, POINT b)

{

    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));

}

double PointToLine(POINT p, Line l)

{

    return fabs(cross(p, l.a, l.b)) / dis(l.a, l.b);

}

double PointToSeg(POINT p, Seg s)

{

    POINT tmp = p;

    tmp.x += s.a.y - s.b.y;

    tmp.y += s.b.x - s.a.x;

    if(cross(s.a, p, tmp) * cross(s.b, p, tmp) >= eps){

        return min(dis(p, s.a), dis(p, s.b));

    }

    return PointToLine(p, Line(s.a, s.b));

}

//

bool Circle_Rectangle_cross(Cir O, Rec R)

{

    if(dcmp(dis(O.o, R.p1) - O.r) < 0 && dcmp(dis(O.o, R.p2) - O.r) < 0 && dcmp(dis(O.o, R.p3) - O.r) < 0 && dcmp(dis(O.o, R.p4) - O.r) < 0)

        return false;

    if(dcmp(PointToSeg(O.o, Seg(R.p1, R.p2)) - O.r) <= 0) return true;

    if(dcmp(PointToSeg(O.o, Seg(R.p2, R.p3)) - O.r) <= 0) return true;

    if(dcmp(PointToSeg(O.o, Seg(R.p3, R.p4)) - O.r) <= 0) return true;

    if(dcmp(PointToSeg(O.o, Seg(R.p4, R.p1)) - O.r) <= 0) return true;

    return false;

}

int main()

{

//    freopen("1.txt", "r", stdin);

//    freopen("2.txt", "w", stdout);

    int T;

    scanf("%d", &T);

    while(T -- ){

        Cir O;

        Rec R;

        scanf("%lf %lf %lf", &O.o.x, &O.o.y, &O.r);

        scanf("%lf %lf %lf %lf", &R.p1.x, &R.p1.y, &R.p2.x, &R.p2.y);

        scanf("%lf %lf %lf %lf", &R.p3.x, &R.p3.y, &R.p4.x, &R.p4.y);

        if(Circle_Rectangle_cross(O, R)) puts("Yes!");

        else puts("No!");

    }

    return 0;

}

时间: 2024-11-10 08:18:04

判断圆和矩形是否相交的相关文章

判断圆和矩形是否相交(非面积相交)

月赛题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1165 题解. 问题很简单,给你一个矩形和一个圆,问你是否他们相交.注意,这里的相交不是面积相交.也就是说,圆在矩形内(且不相切)是不相交的.或者矩形在圆内(且矩形的四个点不在圆上)也是不相交的. 那么,我们怎么来判断呢? 中间轮廓线是矩形的边,各向外和内距离为圆半径r划线(当然,四个角的肯定不太标准). 如果圆心在红色区域的话,肯定是会与圆相交了... 当然,如果我们根本画不出来这

C语言——结构体数组的使用案例(如何判断两个矩形是否相交,其中一个是否包含在另外一个里面,点是否在矩形中)

Rect.h struct CPoint { float x; float y; }; typedef struct CPoint CPoint; struct CSize { float width; float height; }; typedef struct CSize CSize; struct CRect { CPoint origin; CSize size; }; typedef struct CRect CRect; //判断两个矩形是否相交 BOOL isIntersecti

poj1410(判断线段和矩形是否相交)

题目链接:https://vjudge.net/problem/POJ-1410 题意:判断线段和矩形是否相交. 思路:注意这里的相交包括线段在矩形内,因此先判断线段与矩形的边是否相交,再判断线段的两端点是否在矩形内(因为是矩形,即凸多边形,直接用叉积判断即可,如果是一般的多边形,需要用射线法判断.) AC code: #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib>

判断两个矩形是否相交

说矩形相交算法之前,先看下如何判断两条线段是否相交 如果有两条线段 [a, b],[c, d](a, b, c, d 为 X 轴坐标点),有下面两种不相交的情况:1)b < c 时,线段 [a, b] 在 [c, d] 的左边不相交2)d < a 时,线段 [a, b] 在 [c, d] 的右边不相交把上面两种情况取反就是相交的情况.相交的线段则可以表示为[min(a, c), min(b, d)](注意:min(b, d) 应大于 min(a, c),否则就是不相交了),即两条线段中起点大的

判断线段和矩形是否相交

package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; [SWF(width=375,height=300,backgroundColor="0xeeeeee")] public class RectLine extends Sprite { private var txt:TextField; public function RectLine

PHP判断两个矩形是否相交

<?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的. Case 2345中,两个中心点间的距离肯定小于AB边长和的一半. Case 1中就像等了. 设A[x01,y01,x02,y02]  B[x11,y11,x12,y12]. 矩形A和矩形B物理中心点X方向的距离为Lx:abs( (x01+x02)/2 – (x11+x12) /2) 矩形A和矩形B物

图形碰撞检测 圆与矩形

先建立我们需要的数据模型: 1. 向量: 1 /** 2 * 向量类,默认使用正交基 3 */ 4 public class SHVector 5 { 6 public var x:Number; 7 public var y:Number; 8 public var z:Number; 9 10 /** 11 * 构造函数 12 */ 13 public function SHVector(x:Number, y:Number, z:Number = 0) 14 { 15 this.x = x

判断两个线段是否相交

我们的问题是这样的:给定一条线段的起点为$A_1$.终点为$A_2$,另一条线段的起点为$B_1$.终点为$B_2$,问线段$A_1A_2$和线段$B_1B_2$是否相交? 我们首先解释一下,两条线段相交的概念是指,存在一个点,这个点同时在两条线段上. 方法一(解方程法): 容易知道,线段$A_1A_2$上的点的集合为$A = A_1 * (1 - r_1) + A_2 * r_1$,其中$r_1 \in [0, 1]$:同理,线段$B_1B_2$上的点的集合为$B = B_1 * (1 - r

判断两个矩形相交以及求出相交的区域

问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2).(1)设计一个算法,确定两个矩形是否相交(即有重叠区域)(2)如果两个矩形相交,设计一个算法,求出相交的区域矩形 (1)       对于这个问题,一般的思路就是判断一个矩形的四个顶点是否在另一个矩形的区域内.这个思路最简单,但是效率不高,并且存在错误,错误在哪里,下面分析一 下. 如上图,把矩形的相交(区域重叠)分成三种(可