平面中圆与矩形相交判定

柔情只为你懂 2023-03-02 14:50 24阅读 0赞

圆与矩形的相交条件有以下2个:

我们约定矩形左下角坐标为(x1,y1),右上角坐标为(x2,y2),圆形坐标为(cx,cy),半径为r,矩形中心横坐标 x0 = (x2+x1)/2,纵坐标为y0 = (y1 + y2)/2;约定这些是为了下边描述更加方便

一、矩形顶点在圆内

  1. ![20200729202617232.png][]
  2. 如上图所示,当矩形四个顶点有一个顶点在圆内时,可以认为矩形与圆是相交的,即:
  3. //找出x方向与cx最接近的
  4. minx = min(abs(x1 - cx), abs(x2 - cx));
  5. //找出y方向与cy最接近的
  6. miny = min(abs(y1 - cy), abs(y2 - cy));
  7. if (minx * minx + miny * miny < r * r)return true;

二、圆与矩形边相交(包含圆在矩形内)

20200729202849935.png20200729202902949.png

  1. 如上边两种情况,第一种情况中圆心与矩形中心在竖直方向上距离小于(圆直径+矩形高)/2,并且圆心横坐标在矩形长边内;同理第二种情况是圆心与矩形中心在水平方向上距离小于(圆直径+矩形长)/2,并且圆心纵坐标在矩形短边内;**可以发现如果圆在矩形内部的话,实际上也已经满足了该条件。**
  2. if ((abs(x0 - cx) < abs(x2 - x1) / 2 + r) && abs(cy - y0) < abs(y2 - y1) / 2)
  3. return true;
  4. if ((abs(y0 - cy) < abs(y2 - y1) / 2 + r) && abs(cx - x0) < abs(x2 - x1) / 2)
  5. return true;

因此,以上两个条件是圆与矩形相交的充要判据

总代码

  1. bool check(double x1,double y1,double x2,double y2,double cx,double cy,double r) {
  2. //条件1
  3. double minx, miny;
  4. //找出x方向与cx最接近的
  5. minx = min(abs(x1 - cx), abs(x2 - cx));
  6. //找出y方向与cy最接近的
  7. miny = min(abs(y1 - cy), abs(y2 - cy));
  8. if (minx * minx + miny * miny < r * r)return true;
  9. //条件2
  10. double x0 = (x1 + x2) / 2;
  11. double y0 = (y1 + y2) / 2;
  12. if ((abs(x0 - cx) < abs(x2 - x1) / 2 + r) && abs(cy - y0) < abs(y2 - y1) / 2)
  13. return true;
  14. if ((abs(y0 - cy) < abs(y2 - y1) / 2 + r) && abs(cx - x0) < abs(x2 - x1) / 2)
  15. return true;
  16. return 0;
  17. }

参考文献:

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

发表评论

表情:
评论列表 (有 0 条评论,24人围观)

还没有评论,来说两句吧...

相关阅读