কিউব ভিত্তিক বিশ্বের (যেমন মাইনক্রাফ্ট, ট্রভ বা কিউব ওয়ার্ল্ড) কল্পনা করুন যেখানে সবকিছু অভিন্ন আকারের কিউব এবং সমস্ত কিউব একই ধরণের হয় ।
লক্ষ্যটি কয়েকটি সংখ্যক আয়তক্ষেত্রাকার বাক্সের সাথে বিশ্বের প্রতিনিধিত্ব করা (কিউবগুলি মার্জ করে তবে উত্তল আকারটি ধরে রাখা (ওরফে, একটি আয়তক্ষেত্রাকার বাক্স আকার))। আমার অ্যালগরিদম এটিতে সাফল্য পায় তবে এটির উদ্দেশ্যটি এর জন্য কার্য সম্পাদন খুব ধীর। দ্রুত অ্যালগরিদম আছে?
আমার অ্যালগরিদমের সিউডো-সি # কোডটি মূলত:
struct Coordinate { int x,y,z; }; //<-- integer based grid
HashSet<Coordinate> world; // <-- contains all the cubes
//width, height, and length represent how many cubes it spans
struct RectangularBox { Coordinate coord; int width,height,length; }
void Begin()
{
List<RectangularBox> fewestBoxes = new List<RectangularBox>();
while(world.Count > 0)
{
RectangularBox currentLargest = ExtractLargest();
fewestBoxes.Add(currentLargest);
world.RemoveRange(currentLargest.ContainedCubes());
}
//done; `fewestBoxes` contains the fewest rectangular boxes needed.
}
private RectangularBox ExtractLargest()
{
RectangularBox largestBox = new RectangularBox();
foreach (Coordinate origin in world)
{
RectangularBox box = FindMaximumSpan(origin);
if (box.CalculateVolume() >= largestBox.CalculateVolume())
largestBox = box;
}
return largestBox;
}
private RectangularBox FindMaximumSpan(Coordinate origin)
{
int maxX, maxY,maxZ;
while (world.Contains(origin.Offset(maxX, 0, 0))) maxX++;
while (world.Contains(origin.Offset(0, maxY, 0))) maxY++;
while (world.Contains(origin.Offset(0, 0, maxZ))) maxZ++;
RectangularBox largestBox;
for (int extentX = 0; extentX <= maxX; extentX++)
for (int extentY = 0; extentY <= maxY; extentY++)
for (int extentZ = 0; extentZ <= maxZ; extentZ++)
{
int lengthX = extentX + 1;
int lengthY = extentY + 1;
int lengthZ = extentZ + 1;
if (BoxIsFilledWithCubes(origin, lengthX, lengthY, lengthZ))
{
int totalVolume = lengthX * lengthY * lengthZ;
if (totalVolume >= largestBox.ComputeVolume())
largestBox = new RectangularBox(origin, lengthX, lengthY, lengthZ);
}
else
break;
}
return largestBox;
}
private bool BoxIsFilledWithCubes(Coordinate coord,
int lengthX, int lengthY, int lengthZ)
{
for (int gX = 0; gX < lengthX; gX++)
for (int gY = 0; gY < lengthY; gY++)
for (int gZ = 0; gZ < lengthZ; gZ++)
if (!world.Contains(coord.Offset(gX, gY, gZ)))
return false;
return true;
}
মূলত, বিশ্বের প্রতিটি ব্লকের জন্য, এটি প্রথমে তিনটি ইতিবাচক মাত্রার (+ এক্স, + ওয়াই, + জেড) এর মধ্যে কতগুলি কনফিগাসিয়াস ব্লক রয়েছে তা খুঁজে পায়। এবং তারপরে এটি বন্যা পূরণ করে যা পরিমাণ এবং চেকগুলি যা সবচেয়ে বড় ফিলিং যা কোনও ব্লক অনুপস্থিত।
আপডেট: যেহেতু আমার মনে হয়েছে এটি গেমের রেন্ডারিং ইঞ্জিনের জন্য, তাই আমি কেবল স্পষ্ট করে বলতে চাই, এটি কোনও গেমের রেন্ডারিং ইঞ্জিনের জন্য নয়; এটি একটি ফাইল রূপান্তরকারী জন্য; জিইউআই নেই