Ich muss 1 Million räumliche Polygone (spezifiziert mit ihren Minimum Bounding Rectangles) mit 4 völlig disjunkten MBRs (MBR1, MBR2, MBR3, MBR4) im Raum schneiden. MBR1, MBR2, MBR3 und MBR4 teilen den gesamten Raum in vier disjunkte Teile. Dafür habe ich den folgenden Code geschrieben. Es stellt sich jedoch heraus, dass der Code für 1 Million Punkte sehr langsam läuft. Gibt es eine Möglichkeit, den Code zu verbessern, damit er etwas schneller läuft? Wenn ja, kann jemand bitte mit dem gleichen helfenÜberschneidende Rechtecke im Raum
//---------------------------------------------------------------------------
struct MBR
{
double xRight, xLeft, yBottom, yTop;
};
bool intersects(MBR spatialId,MBR mbr)
{
if (mbr.yBottom > spatialId.yTop || mbr.yTop < spatialId.yBottom) return false;
if (mbr.xLeft > spatialId.xRight || mbr.xRight < spatialId.xLeft) return false;
return true;
}
//---------------------------------------------------------------------------
bool contains(MBR spatialId,MBR mbr)
{
if (mbr.yBottom > spatialId.yBottom || mbr.yTop < spatialId.yTop) return false;
if (mbr.xLeft > spatialId.xLeft || mbr.xRight < spatialId.xRight) return false;
return true;
}
//---------------------------------------------------------------------------
bool touches(MBR spatialId,MBR mbr)
{
if ( (mbr.yBottom >= spatialId.yBottom + std::numeric_limits<double>::epsilon() &&
mbr.yBottom <= spatialId.yBottom - std::numeric_limits<double>::epsilon()) ||
(mbr.yTop >= spatialId.yTop + std::numeric_limits<double>::epsilon() &&
mbr.yTop <= spatialId.yTop - std::numeric_limits<double>::epsilon()))
return true;
if ( (mbr.xLeft >= spatialId.xLeft + std::numeric_limits<double>::epsilon() &&
mbr.xLeft <= spatialId.xLeft - std::numeric_limits<double>::epsilon()) ||
(mbr.xRight >= spatialId.xRight + std::numeric_limits<double>::epsilon() &&
mbr.xRight <= spatialId.xRight - std::numeric_limits<double>::epsilon()))
return true;
return false;
}
//---------------------------------------------------------------------------
MBR MBR1,MBR2,MBR3,MBR4;
vector<unsigned> spatialIds; //contain 1 million spatial identifiers which are intersected with MBR1, MBR2, MBR3, MBR4
//MBR1, MBR2, MBR3, MBR4 are again specified using their Minimum Bounding Rectangles
vector<unsigned> result; //contains the resulting intersecting spatial ids
for(vector<MBR>::iterator itSpatialId=spatialIds.begin(),lSpatialId=spatialIds.end();itSpatialId!=lSpatialId;++itSpatialId)
{
if(intersects((*itSpatialId),MBR1)||contains((*itSpatialId),MBR1)||touches((*itSpatialId),MBR1))
{
result.push_back((*itSpatialId));
}
if(intersects((*itSpatialId),MBR2)||contains((*itSpatialId),MBR2)||touches((*itSpatialId),MBR2))
{
result.push_back((*itSpatialId));
}
if(intersects((*itSpatialId),MBR3)||contains((*itSpatialId),MBR3)||touches((*itSpatialId),MBR3))
{
result.push_back((*itSpatialId));
}
if(intersects((*itSpatialId),MBR4)||contains((*itSpatialId),MBR4)||touches((*itSpatialId),MBR4))
{
result.push_back((*itSpatialId));
}
}
Diese Frage ist zu breit.Es gibt Dutzende Möglichkeiten, die Zeit zu verbessern.Wenn Ihre 1 Million MBRs relativ fest sind (ich nehme an, Asteroiden oder Ähnliches), können Sie ihre Speicherorte sortieren und Binärraum-Partitionierungverwenden und trivial große Zahlen ablehnen von möglichen Kollisionen. StackOverflow ist für Fragen, die genau, spec Antwort. So wie es ist, kann keine Antwort als "korrekt" markiert werden. –
@StevenHansen Vielen Dank für Ihre Hilfe. Wie kann ich die Standorte sortieren und binäre Suche anwenden? Ich bin ein Neuling in der räumlichen Domäne. Wenn es möglich ist, werde ich dankbar sein, wenn Sie ein wenig dazu beitragen können. Ich habe viel selbst versucht, aber ich kann nicht herausfinden, –
Es gibt * Tonnen * von Artikeln und Tutorials über das Internet. Versuchen Sie Google für "Binary Space Partitioning Tutorial". Wenn Sie an einem bestimmten Punkt in Ihrer Implementierung hängen bleiben, * würde * das sein, wo Beiträge auf StackOverflow nützlich werden; obwohl ich http://gamedev.stackexchange.com/ in Betracht ziehen würde, da BSP eher ein Spielprogramm ist. –