在一個遊戲中,我需要堆疊一堆不同半徑的圓圈,以避免堆疊重疊。圓圈堆疊,以便重疊的圓形成一個堆疊,最大半徑的圓在頂部。圓圈隨機放置在連續的2D平面上。可以有相同半徑的圓。圓圈堆碼算法
我使用C++。圓圈存儲在向量中。乘飛機我只是說圓圈有(雙)x和y座標。堆棧基本上是使用最頂層的位置和半徑的圓圈矢量(它應該是最大的)。通過「沒有堆疊重疊」我的意思是堆疊後的堆疊不應該重疊。
我所做的:
- 排序半徑
- 對於第一個圓(最大的一個)的圈子中的所有重疊圓添加到它的堆棧,從圓列表中刪除它們。
- 重複,直到圓圈列表爲空。
- 排序所有堆棧以獲得最大的堆棧。
爲什麼它不工作(總是)。有時3個相等的半徑圓圈重疊,以便兩個圓圈共用一個圓圈(但它們本身並不重疊)。其中一個圈子獲得共享圈,然後偶然選擇該圈作爲導致兩個重疊棧的最高圈。
我給了它很多想法,但我能想到的所有方法似乎都需要非常複雜的循環和ifs來手動檢查哪些圈子是共享的以及如何移動它們,或者通過隨機重新排列棧。
是否有一些通用的方法來解決這樣的問題?如果堆棧是「最優」的,那麼所有堆棧將它們的「能量」最小化(如拉入節點的距離最小),這也是很酷的。
在情況1中,選擇了中心圓(假設所有三個大圓都具有相同的半徑),因爲它最小化堆的數量。在情況2中,最大的圓圈正確地位於堆棧頂部。在情況3中,一切都按預期進行。在情況4中,小圓圈錯誤地位於堆棧頂部。另外,如果其他兩個圓圈的大小相同,則應該只有一個堆疊,如情況1所示。在情況5中,錯誤的圓圈位於頂部,導致堆疊重疊。
謝謝!
的工作蠻力版本:
std::vector<std::vector<Symbol>::iterator >symPos; std::vector<int> cons;std::vector<Symbol> selVec; Symbol start; SymbolStack stack;
while(symbols.size()){
std::sort(symbols.begin(),symbols.end(),std::greater<Symbol>());
start = symbols.front();
for(int i = 0;i<symbols.size();i++){
if(symbols[i].getRadius() == start.getRadius()){
selVec.push_back(symbols[i]); cons.push_back(0); symPos.push_back(symbols.begin()+i);
}
}
for(int i = 0;i<selVec.size();i++){
for(int j = i+1;j<selVec.size();j++){
if((selVec[i].getPos()-selVec[j].getPos()).len() < 2*(selVec[i].getRadius()+selVec[j].getRadius())){
cons[i]++;cons[j]++;
}
}
}
int maxCons = 0; int selected;
for(int i = 0;i<cons.size();i++){
if(cons[i] >= maxCons){selected = i;maxCons = cons[i];}
}
start = selVec[selected];
stack.addSymbol(start); symbols.erase(symPos[selected]);
for(auto it = symbols.begin();it!=symbols.end();){
if((it->getPos()-start.getPos()).len() < 1.5*(it->getRadius()+start.getRadius())){
stack.addSymbol(*it);
it = symbols.erase(it);
}else{
it++;
}
}
stacks.push_back(stack);
stack.clear();
selVec.clear();
symPos.clear();
cons.clear();
}
其中symbol是一個圓的對象。堆棧是一個std :: vector。根本沒有效率,但它的工作原理。我會嘗試像Nico建議的那樣優化它。符號對象包含一個vector2位置(getPos())和一個半徑(getRadius())。 len()方法獲取vector2的長度。
需要更多信息。 「沒有堆疊重疊」是什麼意思?有多個堆棧?如果是,有多少? .. 什麼是算法步驟2中的符號列表?它是一個數據結構,你使用紅寶石嗎? .. 你使用什麼樣的數據結構來表示圓圈,堆棧和飛機.. 你是什麼意思的共享圈.. 我讀它完全錯了,我需要一些特定的主題知識來理解這個行話? – Vasif
編輯該問題以回答。沒有行話,我只是沒有太大的解釋明顯:( – maxx
有多少個圈子需要處理? –