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; }
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), }; }
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); }