精华内容
下载资源
问答
  • 本文实例讲述了C++判断矩形相交的方法。分享给大家供大家参考。具体如下:已知2矩形原点和宽高,判断2矩形相交,相交矩形相交判断原理:假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形rect1{...

    本文实例讲述了C++判断矩形相交的方法。分享给大家供大家参考。具体如下:

    已知2矩形原点和宽高,判断2矩形相交,相交矩形

    相交判断原理:

    假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形

    rect1{(minx1, miny1)(maxx1, maxy1)}

    rect2{(minx2, miny2)(maxx2, maxy2)}

    相交的结果一定是个矩形,构成这个相交矩形rect{(minx, miny) (maxx, maxy)}的点对坐标是:

    minx   =   max(minx1,   minx2)

    miny   =   max(miny1,   miny2)

    maxx   =   min(maxx1,   maxx2)

    maxy   =   min(maxy1,   maxy2)

    如果两个矩形不相交,那么计算得到的点对坐标必然满足:

    ( minx  >  maxx ) 或者 ( miny  >  maxy )

    判定是否相交,以及相交矩形是什么都可以用这个方法一体计算完成

    设计3个类:

    1. 点类:x,y

    2. 矩形类:点,宽,高

    3. 判断相交类

    程序实现:

    CPoint.h

    #import

    @interface CPoint : NSObject

    {

    int x; //点坐标

    int y;

    }

    -(void) print;

    -(void) setX: (int) vx;

    -(void) setY: (int) vy;

    -(void) setXY:(int) vx :(int) vy;

    -(int) x;

    -(int) y;

    @end

    CPoint.m

    #import "CPoint.h"

    @implementation CPoint

    -(void) print

    {

    NSLog(@"the point is (%i, %i)",x,y);

    }

    -(void) setX: (int) vx

    {

    x = vx;

    }

    -(void) setY: (int) vy

    {

    y = vy;

    }

    -(void) setXY:(int)vx :(int)vy

    {

    x = vx;

    y = vy;

    }

    -(int) x

    {

    return x;

    }

    -(int) y

    {

    return y;

    }

    @end

    CRect.h

    #import

    #import "CPoint.h"

    @interface CRect : NSObject

    {

    int w; //矩形长

    int h; //矩形高

    }

    -(void) print;

    -(int) w;

    -(int) h;

    -(void) setW: (int) vw;

    -(void) setH: (int) vh;

    -(void) setWH: (int) vw :(int) vh;

    -(CPoint *) origin;

    -(void) setOrigin: (CPoint *) pt;

    @end

    CRect.m

    #import "CRect.h"

    @implementation CRect

    {

    CPoint *origin; //点

    }

    -(void) print

    {

    NSLog(@"the rect:(x:%i, y:%i, w:%i,h:%i)",origin.x, origin.y, w, h);

    }

    -(int) w

    {

    return w;

    }

    -(int) h

    {

    return h;

    }

    -(void) setW:(int)vw

    {

    w = vw;

    }

    -(void) setH:(int)vh

    {

    h = vh;

    }

    -(void) setWH:(int)vw :(int)vh

    {

    w = vw;

    h = vh;

    }

    -(CPoint *) origin

    {

    return origin;

    }

    -(void) setOrigin:(CPoint *)pt

    {

    origin = pt;

    }

    @end

    DoCRect.h

    #import

    #import "CRect.h"

    @interface DoCRect : NSObject

    -(BOOL) isIntersect:(CRect *) rect1 :(CRect *) rect2; //矩形相交否

    -(CRect *) intersectRect: (CRect *) rect1 :(CRect *) rect2; //相交矩形

    @end

    DoCRect.m

    #import "DoCRect.h"

    @implementation DoCRect

    //矩形是否相交

    -(BOOL) isIntersect:(CRect *)rect1 :(CRect *)rect2

    {

    int minx = MAX(rect1.origin.x, rect2.origin.x);

    int miny = MAX(rect1.origin.y, rect2.origin.y);

    int maxx = MIN(rect1.origin.x+rect1.w, rect2.origin.x+rect2.w);

    int maxy = MIN(rect1.origin.y+rect1.h, rect2.origin.y+rect2.h);

    if (minx>maxx || miny>maxy)

    {

    return NO;

    }

    return YES;

    }

    -(CRect *) intersectRect:(CRect *)rect1 :(CRect *)rect2

    {

    int minx = MAX(rect1.origin.x, rect2.origin.x);

    int miny = MAX(rect1.origin.y, rect2.origin.y);

    int maxx = MIN(rect1.origin.x+rect1.w, rect2.origin.x+rect2.w);

    int maxy = MIN(rect1.origin.y+rect1.h, rect2.origin.y+rect2.h);

    CRect * rect = [[CRect alloc] init];

    CPoint *p = [[CPoint alloc] init];

    if (NO == [self isIntersect:rect1 :rect2])//no isIntersect

    {

    [p setXY:minx :miny];

    [rect setOrigin:p];

    rect.w = 0;

    rect.h = 0;

    return rect;

    }

    [p setXY:minx :miny];

    [rect setOrigin:p];

    rect.w = ABS(maxx-minx);

    rect.h = ABS(maxy - miny);

    return rect;

    }

    @end

    main.m 测试

    #import

    #import "DoCRect.h"

    int main(int argc, const char * argv[])

    {

    @autoreleasepool

    {

    NSLog(@"Hello,判断矩形相交,返回矩形的原点和长高");

    //初始化对象

    CRect *myrect1 = [[CRect alloc] init];

    CRect *myrect2 = [[CRect alloc] init];

    CPoint *p1 = [[CPoint alloc] init];

    CPoint *p2 = [[CPoint alloc] init];

    DoCRect *dorect = [[DoCRect alloc] init];

    //原点变量

    [p1 setXY:200 :420];

    [p2 setXY:400 :300];

    //设置矩形原点

    [myrect1 setOrigin:p1];

    [myrect1 setWH:250 :75];

    [myrect1 print];

    [myrect2 setOrigin:p2];

    [myrect2 setWH:100 :180];

    [myrect2 print];

    //判断2矩形是否相交

    BOOL insersect = [dorect isIntersect:myrect1 :myrect1];

    NSLog(@" two rect is :%@",insersect?@"YES":@"NO");

    //返回相交矩形

    //CRect *inserectRect = [[CRect alloc] init];

    CRect *inserectRect = [dorect intersectRect:myrect1 :myrect2];

    [inserectRect print];

    }

    return 0;

    }

    希望本文所述对大家的C++程序设计有所帮助。

    展开全文
  • ( ((r1.right ) || (r1.bottom > r2.top)) ||((r2.right) || (r2.bottom >r1.top)) ) } 两矩形相交”的对立事件(“两矩形不相交”比较容易表达(包含的情况数较少),最后对对立事件取非即可: 比如两矩形分别为r1和...

    typedef struct{intleft;//leftmost: 最左

    inttop;//topmost: 最上

    intright;//rightmost: 最右

    intbottom;//bottommost: 最下//其实两个点的组合,表达的是边界的概念//分别为://左边界,右边界//上边界,下边界

    } Rect;bool isRectOverlap(const RECT& r1, const RECT&r2)

    {return !( ((r1.right < r2.left) || (r1.bottom > r2.top)) ||((r2.right< r1.left) || (r2.bottom >r1.top))

    )

    }

    两矩形相交”的对立事件(“两矩形不相交”比较容易表达(包含的情况数较少),最后对对立事件取非即可:

    e0c946a3e3419edc82222402e741cc40.png

    比如两矩形分别为r1和r2:

    则两者不相交的情况为:r1在r2的左侧或上侧(同理,r2在r1的左侧或上侧),这里就要用到C结构体提供的界的概念了,也即r1的最右在r2最左的左侧,r1的最小在r2的最上的上侧。

    ((r1.right < r2.left) || (r1.bottom > r2.top))

    ((r2.right < r1.left) || (r2.bottom > r1.top))

    不妨我们再对解决本题的思路“对立事件”的含义略作说明:

    对立事件(Complementary event,直译为互补事件)

    P(Ac)=1−P(A)

    P(Ac)=1−P(A)

    更像是常说的“非此即彼”,也即整个样本空间(sample space)中,事件P(A)P(A)与其对立事件 P(Ac)P(Ac),构成全部样本空间,放在本例也即,样本空间为:两矩形在平面上的组合形态,事件为:相交,则其对立事件自然为:不相交。

    注意,正如 typedef struct rect 的四个成员变量所限制的那样,本文无法解决平面中不规则放置的矩形之间的关系。

    79bf2b40edfcf27dbc73bff30e84056a.png

    展开全文
  • Java 判断线段与矩形是否相交:private static boolean isLineIntersectRectangle(double linePointX1,double linePointY1,double linePointX2,double linePointY2,double rectangleLeftTopX,double ...

    Java 判断线段与矩形是否相交:

    private static boolean isLineIntersectRectangle(double linePointX1,

    double linePointY1,

    double linePointX2,

    double linePointY2,

    double rectangleLeftTopX,

    double rectangleLeftTopY,

    double rectangleRightBottomX,

    double rectangleRightBottomY) {

    double lineHeight = linePointY1 - linePointY2;

    double lineWidth = linePointX2 - linePointX1;

    double t1 = lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY;

    double t2 = lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY;

    double t3 = lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY;

    double t4 = lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY;

    double c = linePointX1 * linePointY2 - linePointX2 * linePointY1;

    if ((t1 + c >= 0 && t2 + c <= 0)

    || (t1 + c <= 0 && t2 + c >= 0)

    || (t3 + c >= 0 && t4 + c <= 0)

    || (t3 + c <= 0 && t4 + c >= 0)) {

    if (rectangleLeftTopX > rectangleRightBottomX) {

    double temp = rectangleLeftTopX;

    rectangleLeftTopX = rectangleRightBottomX;

    rectangleRightBottomX = temp;

    }

    if (rectangleLeftTopY < rectangleRightBottomY) {

    double temp1 = rectangleLeftTopY;

    rectangleLeftTopY = rectangleRightBottomY;

    rectangleRightBottomY = temp1;

    }

    if ((linePointX1 < rectangleLeftTopX && linePointX2 < rectangleLeftTopX)

    || (linePointX1 > rectangleRightBottomX && linePointX2 > rectangleRightBottomX)

    || (linePointY1 > rectangleLeftTopY && linePointY2 > rectangleLeftTopY)

    || (linePointY1 < rectangleRightBottomY && linePointY2 < rectangleRightBottomY)) {

    return false;

    } else {

    return true;

    }

    } else {

    return false;

    }

    }

    展开全文
  • 如果矩形 rec1 和 rec2 的水平边投影到 x 轴上的线段分别为 (rec1[0], rec1[2]) 和 (rec2[0], rec2[2])。根据数学知识我们可以知道,当 min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]) 时,这两条线段有交集。...

    依据数学理论:

    如果矩形 rec1 和 rec2 的水平边投影到 x 轴上的线段分别为 (rec1[0], rec1[2]) 和 (rec2[0], rec2[2])。根据数学知识我们可以知道,当 min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]) 时,这两条线段有交集。对于矩形 rec1 和 rec2 的竖直边投影到 y 轴上的线段,同理可以得到,当 min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]) 时,这两条线段有交集,

    简单点说,如图

    不相交的情况一定符合下面的公式

    std::max(A.x, a.x()) <= std::min(B.x, b.x()) && std::max(A.y, a.y()) <= std::min(B.y, b.y())


     

    展开全文
  • 判断矩形是否重叠(复合类+友元) 题目描述 用CPoint表示点,用两个CPoint对象表示矩形类CRect的对角线两点。分别实现CPoint类和CRect类,并在主函数用输入的坐标定义4个CPoint类对象,每2个CPoint对象再构造1个CRect...
  • 题目(2018-11-20)用一个对象的数据来表示一个矩形的位置和大小:{x: 100,...请你完成一个函数isOverlap可以接受两个矩形作为参数,判断这两个矩形在页面上是否重叠。例如:const rect1 = { x: 100, y: 100, width: 1...
  • 编写判断两个矩形是否重叠的函数。 输入 判断次数 矩形1的对角线顶点坐标x1、y1、x2、y2 矩形2的对角线顶点坐标x1、y1、x2、y2 … 输出 是否重叠 样例输入 3 1 5 2 9 1 3 2 4 5 6 7 8 5 7 7 7 2 5 1 0 9 4 2 9 样例...
  • 暂时没理解第二个 就是比如以obj1矩形 为固定,obj2矩形为位置不定,同时满足以下四个条件,就是判断obj2四个边是同时都在obj1边的边界范围内这个坐标值是以页面中元素相对于屏幕边的距离 也就是 left top bottom ...
  • 1.给定两个坐标轴对齐的矩形判断他们是否相交,如果相交,给出他们所形成的矩形。 class Rectangle(object): #构造函数要求输入左下角坐标以及宽和高 def __init__(self,x,y,width,height): self.x = x self.y...
  • 简单的思路,如果两个四边形相交,则必然有两条边相交,所以只需要判断任意两条边不相交,则两个四边形不相交,以下是代码。但是有一个问题,没有判断一个四边形在另一个四边形里面的情况!package com.phoenix;...
  • 判断是否相交,先快速排斥,再做跨立,通过向量的叉积判断矩形的四个顶点是否在线段的两侧,是说明有交集。(如果判断与矩形的边是否有交集的话,可判断线段是否与矩形的每条边是否有交集,线段与线段的交集判断。)...
  • } /** 判断线段是否在矩形内 * 先看线段所在直线是否与矩形相交, * 如果不相交则返回false, * 如果相交, * 则看线段的两个点是否在矩形的同一边(即两点的x(y)坐标都比矩形的小x(y)坐标小,或者大), * 若在同...
  • 简单介绍了平面中判断线段与矩形是否相交的算法。
  • 今天突然遇到要判断圆形与矩形相交的问题!在网上搜索了一下,看看有没有好的方法!发现讨论这个的比较少,以前有一个帖子倒是讨论过,但是帖子上好像没讨论出什么东西,最后就不了了之了!后来想了一下,我用下面的...
  • 注意,矩形可以由两个坐标表示,即左上角和右下角。所以主要是给我们以下四个坐标。可以假定矩形与坐标轴平行。一种解决方案是一个接一个地选取一个矩形的所有点,查看该点是否在另一个矩形内。这可以使用此处以下是...
  • 给出矩形的ABCD四个顶点坐标,待判断点k的坐标(x,y)原理:连接点a与四个顶点,形成四个三角形。如果四个小三角形面积之和等于矩形面积,即说明该点在矩形内部。三角形面积计算公式:代码:public class Solution2 {...
  • importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);double[]x=newdouble[4];double[]y=newdouble[4];for(inti=0;i<4;i++){x[i]=sc.ne...
  • 任意多边形与矩形的相交,其实就是判断多条线段是否与这个矩形相交,再简单点就是判断线段是否与矩形的每一条边相交了。那现在,我们先来看看判断一条线段与矩形的其中一条线段的相交的情况(上方水平线):(图形中的a...
  • 1,将城市地图拆分等距拆分为矩形数据结构如图:2.查看高德JS API (点是否在多边形内)核心代码:a=[114.069564,22.545774];b=[[114.067595,22.552082],[114.077322,22.552082],[114.077322,22.543099],[114.067595,...
  • 判断两个矩形是否相交 一个矩形由两个端点确定,即左上角和右下角。 两个矩形相交时有公共部分<=>两矩形相交时,长或宽经过平移都后有重叠的部分<=>两矩形相交时,其外包矩形的长或宽都小于两矩形的长或...
  • 圆和矩形的重叠问题一.问题描述二.分析思路三.代码示例(JQuery) 一.问题描述 给你一个以 (radius, x_center, y_center) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2),其中 (x1, y1) 是矩形左下角的坐标,(x2...
  • 直接上代码 package cn.itsub.tank.types; public class Rect { public int x,y,w,h; public Rect() { } public Rect(int x, int y, int w, int h) { this.x = x; this.y = y;... public ..
  • 本文实例讲述了Python判断直线和矩形是否相交的方法。分享给大家供大家参考。具体实现方法如下:"""A(ax,ay),B(px,py)为两个点 (x1,y1),(x2,y2)为矩形的左上角和右下角坐标,判断A,B两点是否和矩形相交"""def Judge...
  • 怎么判断任意一点P是否在任意矩形围成的框内。可以用向量的点乘判断角度是否为锐角。
  • 判断点是否在矩形内: 只需要判断该点是否在上下两条边和左右两条边之间就行。 判断一个点是否在两条线段之间夹着就转化成,判断一个点是否在某条线段的一边上,就可以利用叉乘的方向性,来判断夹角是否超过了180...
  • 判断上三角矩形-c++

    2021-05-08 17:08:28
    题目描述 KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。... } } //判断 int sum=0; for(int i=1;i;i++) { for(int j=0;j;j++) { if(num[i][j]!=0) sum++; } } if(sum==0) cout; else cout; }
  • //判断线段相交 boolinter(Line l1,Line l2){returnmax(l1.s.x,l1.e.x)>=min(l2.s.x,l2.e.x)&&max(l2.s.x,l2.e.x)>=min(l1.s.x,l1.e.x)&&max(l1.s.y,l1.e.y)>=min(l2.s.y,l2.e.y)&&max(l2.s.y,l2.e.y)>=min(l1.s.y,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,393
精华内容 39,357
关键字:

怎样判断矩形