An algorithm problem-to find the intersection rectangle of three rectangles.

Source: Internet
Author: User

The given rectangle is defined as follows:

struct rect{    int// represents the upper-left horizontal coordinate of the rectangle    int// represents the upper-left vertical coordinate of the rectangle    int// indicates rectangle width    int // represents the rectangle height };

Now give three rectangles, the intersection of three rectangles, if there is no intersection, then the rectangle's x,y,w and H are assigned to-1. For example, the following illustration shows the rectangle represented by a thick line box that intersects three rectangles.

Problem Solving Ideas:
Problem-solving thinking is very important, there is no collective thinking, the topic is certainly not to be made. The following gives my problem-solving ideas:
(1) Determine whether the three rectangles have a intersection. This is a difficult point, how to do it? You can arrange the three rectangles by x in the x-axis direction from left to right, to determine whether the 22 rectangle has an intersection in the X-axis direction, and if any pair does not intersect then three rectangles have no intersection. The judging method is that if RECTB.X>=RECTA.X+RECTA.W, then there is no intersection between RECTA and RECTB.

Similarly, in the direction of the y-axis to do the same judgment;

(2) The intersection rectangle of any two rectangles is calculated, and then the intersection rectangle and the third rectangle are then intersected, and the final intersection rectangle is obtained.

With the correct and clear ideas, you can write code, the following gives my implementation, for users to reference.

1#include <iostream>2 using namespacestd;3#include <vector>4#include <algorithm>5 6 structrect{7     intX//represents the upper-left horizontal coordinate of a rectangle8     intY//represents the upper-left vertical coordinate of a rectangle9     intW//represents the width of a rectangleTen     intH//represents the height of a rectangle One }; A  - //Sort by x increment - BOOLComparex (Constrect& Recta,Constrect&RECTB) { the     returnrecta.x<rectb.x; - } -  - //Sort by y increment + BOOLComparey (Constrect& Recta,Constrect&RECTB) { -     returnrecta.y<rectb.y; + } A  at //determine if three rectangles intersect - BOOLIsintersect (Constrect& Recta,Constrect& RECTB,Constrect&RECTC) { -Rect Rectleft,rectxmid,rectright;//left-to-right rectangle -Rect Recttop,rectymid,rectbelow;//top-to-bottom rectangle -  -     //sort rectangles by x left to right invector<ConstRect>Vec; - Vec.push_back (recta); to Vec.push_back (RECTB); + Vec.push_back (RECTC); - sort (Vec.begin (), Vec.end (), Comparex); therectleft=vec[0],rectxmid=vec[1],rectright=vec[2]; *  $     //no intersection of any two rectangles in horizontal directionPanax Notoginseng     if(rectxmid.x>=rectleft.x+rectleft.w| | rectright.x>=rectxmid.x+rectxmid.w| | rectright.x>=rectleft.x+RECTLEFT.W) -         return false; the  +     //Similarly, sort the rectangles by Y A sort (Vec.begin (), Vec.end (), Comparey); therecttop=vec[0],rectymid=vec[1],rectbelow=vec[2]; +  -     //no intersection of any two rectangles in the vertical direction $     if(rectymid.y>=recttop.y+recttop.h| | rectbelow.y>=rectymid.y+rectymid.h| | rectbelow.y>=recttop.y+rectTop.h) $         return false; -     return true;//three rectangles have an intersection - } the  - //the intersection of two rectangles, provided that two rectangles must have an intersectionWuyiRect Intersection (Constrect& Recta,Constrect&RECTB) { the Rect Resrect; -resrect.x=recta.x>rectb.x?recta.x:rectb.x;//Select the X of the rightmost rectangle as the X of the intersection Wuresrect.y=recta.y>rectb.y?recta.y:rectb.y;//Select y of the bottom rectangle as the intersection of Y -     //Select the right side of the left rectangle (the smaller x coordinate) as the right side of the intersection rectangle, so you can find the width of the intersection rectangle Aboutresrect.w=recta.x+recta.w<rectb.x+rectb.w?recta.x+recta.w-resrect.x:rectb.x+rectb.w-Resrect.x; $     //Similarly, select the bottom of the upper rectangle (the lower y coordinate) as the bottom of the intersection rectangle so that the height of the intersection rectangle can be calculated -resrect.h=recta.y+recta.h<rectb.y+rectb.y?recta.y+recta.h-resrect.y:rectb.y+rectb.h-Resrect.y; -     returnResrect; - } A  +  the //find the intersection of three rectangles -Rect Threeintersection (Constrect& Recta,Constrect& RECTB,Constrect&RECTC) { $ Rect Res; the     BOOLIsintersectbool=Isintersect (RECTA,RECTB,RECTC); the     if(Isintersectbool) {//have intersect theRect rectab=intersection (RECTA,RECTB); theres=intersection (RECTAB,RECTC); -     } in     Else theres.x=res.y=res.w=res.h=-1; the     returnRes; About}

The test results are as follows:

intMain () {Rect recta,rectb,rectc; //test Case 1//recta.x=0,recta.y=0,recta.w=1,recta.h=1; //rectb.x=1,rectb.y=1,rectb.w=1,rectb.h=1; //rectc.x=2,rectc.y=2,rectc.w=1,rectc.h=1; //Test Case 2recta.x=0, recta.y=0, recta.w=2, recta.h=2; rectb.x=1, rectb.y=1, rectb.w=1, rectb.h=1; rectc.x=1, rectc.y=1, rectc.w=1, rectc.h=1; Rect Resrect=threeintersection (RECTA,RECTB,RECTC); if(resrect.x!=-1){//have intersectcout<<"Resrect.x:"<<resRect.x<<Endl; cout<<"Resrect.y:"<<resRect.x<<Endl; cout<<"RESRECT.W:"<<resRect.x<<Endl; cout<<"resRect.h:"<<resRect.x<<Endl; }    Elsecout<<"Not intersect"<<Endl; GetChar ();}

Test Case 1 output: not intersect;
Test Case 2 Output:
Resrect.x:1
Resrect.y:1
Resrect.w:1
Resrect.h:1

An algorithm problem-to find the intersection rectangle of three rectangles.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.