Esempio n. 1
0
 public static List <Point> convertSingleBuilding2Outline(OldBuilding bld)
 {
     return(new List <Point>()
     {
         new Point(bld.X1, 0),
         new Point(bld.X1, bld.H),
         new Point(bld.X2, bld.H),
         new Point(bld.X2, 0),
     });
 }
 public static List<Point> MergeBuildings(OldBuilding[] blds, int leftIndex, int rightIndex)
 {
     if (rightIndex - leftIndex <= 1)//one or two buildings
     {
         return mergeTwoBuildingsImpl(blds[leftIndex], blds[rightIndex]);
     }
     else
     {
         int middle = (rightIndex + leftIndex) / 2;
         List<Point> firstOutlines = MergeBuildings(blds, leftIndex, middle);
         List<Point> secondOutlines = MergeBuildings(blds, middle + 1, rightIndex);
         return mergeTwoOutLinesImpl(firstOutlines, secondOutlines);
     }
 }
 public static OldBuilding[] initBuildings(int buildCount, int leftLimitInclusive, int maxHeightLimitInclusive, int rightLimitInclusive)
 {
     OldBuilding[] buildings = new OldBuilding[buildCount];
     Random rndRange = new Random(DateTime.Now.Millisecond);
     Random rndHeight = new Random(DateTime.Now.Millisecond);
     for (int i = 0; i < buildCount; i++)
     {
         int l = rndRange.Next(leftLimitInclusive, rightLimitInclusive);
         int r = rndRange.Next(l + 1, rightLimitInclusive + 1);
         int h = rndHeight.Next(1, maxHeightLimitInclusive + 1);
         OldBuilding bld = new OldBuilding(l, h, r);
         buildings[i] = bld;
     }
     return buildings;
 }
Esempio n. 4
0
        public static OldBuilding[] initBuildings(int buildCount, int leftLimitInclusive, int maxHeightLimitInclusive, int rightLimitInclusive)
        {
            OldBuilding[] buildings = new OldBuilding[buildCount];
            Random        rndRange  = new Random(DateTime.Now.Millisecond);
            Random        rndHeight = new Random(DateTime.Now.Millisecond);

            for (int i = 0; i < buildCount; i++)
            {
                int         l   = rndRange.Next(leftLimitInclusive, rightLimitInclusive);
                int         r   = rndRange.Next(l + 1, rightLimitInclusive + 1);
                int         h   = rndHeight.Next(1, maxHeightLimitInclusive + 1);
                OldBuilding bld = new OldBuilding(l, h, r);
                buildings[i] = bld;
            }
            return(buildings);
        }
 private static List<Point> mergeTwoBuildingsImpl(OldBuilding first, OldBuilding second)
 {
     OldBuilding left, right;
     if (Math.Min(first.X1, second.X1) == second.X1)
     {
         left = second;
         right = first;
     }
     else
     {
         left = first;
         right = second;
     }
     List<Point> points = new List<Point>();
     #region Lx1<Lx2<=Rx1<Rx2
     if (left.X2 <= right.X1)
     {
         if (left.X2 < right.X1)
         {
             points.AddRange(
                 new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H),
                     new Point(left.X2,left.H),
                     new Point(left.X2,0),
                     new Point(right.X1,0),
                     new Point(right.X1,right.H),
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
         }
         else//==
         {
             if (left.H == right.H)
             {
                 points.AddRange(
                     new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H),                            
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
             }
             else
             {
                 points.AddRange(
                     new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H),
                     new Point(left.X2,left.H), 
                     new Point(right.X1,right.H),
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
             }
         }
     }
     #endregion
     #region Lx1<=Rx1<Lx2<=Rx2
     if (left.X1 <= right.X1 && right.X1 < left.X2 && left.X2 <= right.X2)
     {
         if (left.X1 < right.X1 && left.X2 < right.X2)
         {
             if (left.H < right.H)
             {
                 points.AddRange(
                        new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(right.X1,left.H),
                     new Point(right.X1,right.H),
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
             }
             else if (left.H > right.H)
             {
                 points.AddRange(
                       new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(left.X2,left.H),
                     new Point(left.X2,right.H),
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
             }
             else//==
             {
                 points.AddRange(
                         new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H),                             
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
             }
         }
         if (left.X1 == right.X1 && left.X2 < right.X2)
         {
             if (left.H <= right.H)
             {
                 points.AddRange(
                        new List<Point>()
                 {
                     new Point(right.X1,0),
                     new Point(right.X1,right.H), 
                     new Point(right.X2,right.H),                           
                     new Point(right.X2,0),
                 });
             }
             else
             {
                 points.AddRange(
                       new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(left.X2,left.H),
                     new Point(left.X2,right.H),
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
             }
         }
         if (left.X1 < right.X1 && left.X2 == right.X2)
         {
             if (left.H >= right.H)
             {
                 points.AddRange(
                        new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(left.X2,left.H),                           
                     new Point(left.X2,0),
                 });
             }
             else
             {
                 points.AddRange(
                       new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(right.X1,left.H),
                     new Point(right.X1,right.H),
                     new Point(right.X2,right.H),
                     new Point(right.X2,0),
                 });
             }
         }
         if (left.X1 == right.X1 && left.X2 == right.X2)
         {
             points.AddRange(
                        new List<Point>()
                 {
                     new Point(right.X1,0),
                     new Point(right.X1,Math.Max(left.H,right.H)), 
                     new Point(right.X2,Math.Max(left.H,right.H)),                           
                     new Point(right.X2,0),
                 });
         }
     }
     #endregion
     #region Lx1<=Rx1<Rx2<=Lx2
     if (left.X1 <= right.X1 && right.X2 <= left.X2)
     {
         //if (left.X1 == right.X1 && right.X2 == left.X2)
         //{
         //    points.AddRange(
         //                   new List<Point>()
         //        {
         //            new Point(right.X1,0),
         //            new Point(right.X1,Math.Max(left.H,right.H)), 
         //            new Point(right.X2,Math.Max(left.H,right.H)),                           
         //            new Point(right.X2,0),
         //        });
         //}
         if (left.X1 < right.X1 && right.X2 < left.X2)
         {
             if (right.H <= left.H)
             {
                 points.AddRange(
                                new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(left.X2,left.H),                           
                     new Point(left.X2,0),
                 });
             }
             else
             {
                 points.AddRange(
                                    new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(right.X1,left.H), 
                     new Point(right.X1,right.H),                           
                     new Point(right.X2,right.H),
                     new Point(right.X2,left.H),
                     new Point(left.X2,left.H), 
                     new Point(left.X2,0),
                 });
             }
         }
         //if (left.X1 < right.X1 && right.X2 == left.X2)
         //{
         //    if (right.H <= left.H)
         //    {
         //        points.AddRange(
         //                       new List<Point>()
         //        {
         //            new Point(left.X1,0),
         //            new Point(left.X1,left.H), 
         //            new Point(left.X2,left.H),                           
         //            new Point(left.X2,0),
         //        });
         //    }
         //    else
         //    {
         //        points.AddRange(
         //                       new List<Point>()
         //        {
         //            new Point(left.X1,0),
         //            new Point(left.X1,left.H), 
         //            new Point(right.X1,left.H), 
         //            new Point(right.X1,right.H),
         //            new Point(right.X2,right.H),                           
         //            new Point(right.X2,0),
         //        });
         //    }
         //}
         if (left.X1 == right.X1 && right.X2 < left.X2)
         {
             if (right.H <= left.H)
             {
                 points.AddRange(
                                new List<Point>()
                 {
                     new Point(left.X1,0),
                     new Point(left.X1,left.H), 
                     new Point(left.X2,left.H),                           
                     new Point(left.X2,0),
                 });
             }
             else
             {
                 points.AddRange(
                                new List<Point>()
                 {
                     new Point(right.X1,0),
                     new Point(right.X1,right.H), 
                     new Point(right.X2,right.H), 
                     new Point(right.X2,left.H),
                     new Point(left.X2,left.H),                           
                     new Point(left.X2,0),
                 });
             }
         }
     }
     #endregion
     return points;
 }
        public static List<Point> convertSingleBuilding2Outline(OldBuilding bld)
        {
            return new List<Point>() 
            {
            new Point(bld.X1,0),
              new Point(bld.X1,bld.H),
                new Point(bld.X2,bld.H),
                  new Point(bld.X2,0),            
            };

        }
Esempio n. 7
0
        private static List <Point> mergeTwoBuildingsImpl(OldBuilding first, OldBuilding second)
        {
            OldBuilding left, right;

            if (Math.Min(first.X1, second.X1) == second.X1)
            {
                left  = second;
                right = first;
            }
            else
            {
                left  = first;
                right = second;
            }
            List <Point> points = new List <Point>();

            #region Lx1<Lx2<=Rx1<Rx2
            if (left.X2 <= right.X1)
            {
                if (left.X2 < right.X1)
                {
                    points.AddRange(
                        new List <Point>()
                    {
                        new Point(left.X1, 0),
                        new Point(left.X1, left.H),
                        new Point(left.X2, left.H),
                        new Point(left.X2, 0),
                        new Point(right.X1, 0),
                        new Point(right.X1, right.H),
                        new Point(right.X2, right.H),
                        new Point(right.X2, 0),
                    });
                }
                else//==
                {
                    if (left.H == right.H)
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                    else
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(left.X2, left.H),
                            new Point(right.X1, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                }
            }
            #endregion
            #region Lx1<=Rx1<Lx2<=Rx2
            if (left.X1 <= right.X1 && right.X1 < left.X2 && left.X2 <= right.X2)
            {
                if (left.X1 < right.X1 && left.X2 < right.X2)
                {
                    if (left.H < right.H)
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(right.X1, left.H),
                            new Point(right.X1, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                    else if (left.H > right.H)
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(left.X2, left.H),
                            new Point(left.X2, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                    else//==
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                }
                if (left.X1 == right.X1 && left.X2 < right.X2)
                {
                    if (left.H <= right.H)
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(right.X1, 0),
                            new Point(right.X1, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                    else
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(left.X2, left.H),
                            new Point(left.X2, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                }
                if (left.X1 < right.X1 && left.X2 == right.X2)
                {
                    if (left.H >= right.H)
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(left.X2, left.H),
                            new Point(left.X2, 0),
                        });
                    }
                    else
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(right.X1, left.H),
                            new Point(right.X1, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, 0),
                        });
                    }
                }
                if (left.X1 == right.X1 && left.X2 == right.X2)
                {
                    points.AddRange(
                        new List <Point>()
                    {
                        new Point(right.X1, 0),
                        new Point(right.X1, Math.Max(left.H, right.H)),
                        new Point(right.X2, Math.Max(left.H, right.H)),
                        new Point(right.X2, 0),
                    });
                }
            }
            #endregion
            #region Lx1<=Rx1<Rx2<=Lx2
            if (left.X1 <= right.X1 && right.X2 <= left.X2)
            {
                //if (left.X1 == right.X1 && right.X2 == left.X2)
                //{
                //    points.AddRange(
                //                   new List<Point>()
                //        {
                //            new Point(right.X1,0),
                //            new Point(right.X1,Math.Max(left.H,right.H)),
                //            new Point(right.X2,Math.Max(left.H,right.H)),
                //            new Point(right.X2,0),
                //        });
                //}
                if (left.X1 < right.X1 && right.X2 < left.X2)
                {
                    if (right.H <= left.H)
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(left.X2, left.H),
                            new Point(left.X2, 0),
                        });
                    }
                    else
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(right.X1, left.H),
                            new Point(right.X1, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, left.H),
                            new Point(left.X2, left.H),
                            new Point(left.X2, 0),
                        });
                    }
                }
                //if (left.X1 < right.X1 && right.X2 == left.X2)
                //{
                //    if (right.H <= left.H)
                //    {
                //        points.AddRange(
                //                       new List<Point>()
                //        {
                //            new Point(left.X1,0),
                //            new Point(left.X1,left.H),
                //            new Point(left.X2,left.H),
                //            new Point(left.X2,0),
                //        });
                //    }
                //    else
                //    {
                //        points.AddRange(
                //                       new List<Point>()
                //        {
                //            new Point(left.X1,0),
                //            new Point(left.X1,left.H),
                //            new Point(right.X1,left.H),
                //            new Point(right.X1,right.H),
                //            new Point(right.X2,right.H),
                //            new Point(right.X2,0),
                //        });
                //    }
                //}
                if (left.X1 == right.X1 && right.X2 < left.X2)
                {
                    if (right.H <= left.H)
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(left.X1, 0),
                            new Point(left.X1, left.H),
                            new Point(left.X2, left.H),
                            new Point(left.X2, 0),
                        });
                    }
                    else
                    {
                        points.AddRange(
                            new List <Point>()
                        {
                            new Point(right.X1, 0),
                            new Point(right.X1, right.H),
                            new Point(right.X2, right.H),
                            new Point(right.X2, left.H),
                            new Point(left.X2, left.H),
                            new Point(left.X2, 0),
                        });
                    }
                }
            }
            #endregion
            return(points);
        }