Ich habe ein Problem, das darin besteht zu bestimmen, ob zwei Vektorelemente enthalten, die gleich sind. Die Elemente können überall im Vektor sein, aber sie müssen benachbart sein.
FÜR MEHR BEISPIELE BEARBEITET
Zum Beispiel würden die folgenden zwei Vektoren bei Vergleich falsch zurückgeben.
Vektor 1 = [ 0, 1, 2, 3, 4, 6 ]
Vektor 2 = [ 1, 4, 2, 0, 5, 3 ]
Aber die folgenden beiden würden wahr zurückgeben:
Vektor 1 = [ 0, 1, 2, 3, 4, 5 ]
Vektor 2 = [ 4, 2, 1, 5, 0, 3 ]
weil das 1,2 im ersten Vektor mit dem 2,1 im zweiten Vektor übereinstimmen würde.
Wahr:
Vektor 1 = [ 0, 1, 2, 3, 4, 5 ]
Vektor 2 = [ 1, 4, 2, 0, 5, 3 ]
{5,0} ist ein Paar, trotz Rundumloop des Vektors (ich habe ursprünglich gesagt, dass dies falsch ist, vielen Dank, dass du das bemerkt hast, 'Vlad von Moskau').
Wahr:
Vektor 1 = [ 0, 1, 2, 3, 4, 5 ]
Vektor 2 = [ 4, 8, 6, 2, 1, 5, 0, 3 ]
{2,1} ist immer noch ein Paar, auch wenn sie sich nicht an derselben Position befinden
Die tatsächliche Anwendung besteht darin, dass ich ein Polygon (Gesicht) mit N Punkten in einem Vektor habe. Um zu bestimmen, ob eine Reihe von Polygonen ein 3D-Volumen vollständig einschließen, überprüfe ich jedes Gesicht, um sicherzustellen, dass jede Kante von einem anderen Gesicht geteilt wird (wobei eine Kante durch zwei benachbarte Punkte definiert ist).
Also enthält Face einen Vektor von Zeigern auf Punkte...
std::vector points_;
und um zu überprüfen, ob ein Face umgeben ist, enthält Face eine Memberfunktion...
bool isSurrounded(std::vector * neighbours)
{
int count = 0;
for(auto&& i : *neighbours) // für jedes potenzielle Gesicht
if (i != this) // das nicht dieses Gesicht ist
for (int j = 0; j < nPoints(); j++) // und für jeden Punkt in diesem Gesicht
for (int k = 0; k < i->nPoints(); k++ ) // überprüfen, ob der Nachbarpunkt geteilt wird und ob der nächste Punkt (rückwärts oder vorwärts) auch geteilt wird
if ( ( this->at(j) == i->at(k) ) // Punkte sind gleich, prüfen Sie den nächsten und den vorherigen Punkt auch, um ein Paar zu bilden
&& ( ( this->at((j+1)%nPoints()) == i->at((k+1)%(i->nPoints())) )
|| ( this->at((j+1)%nPoints()) == i->at((k+i->nPoints()-1)%(i->nPoints())) )))
{ count++; }
if (count > nPoints() - 1) // Anzahl der Kanten = nPoints -1
return true;
else
return false;
}
Nun, offensichtlich ist dieser Code schrecklich. Wenn ich in 2 Wochen darauf zurückkomme, werde ich ihn wahrscheinlich nicht verstehen. Angesichts des ursprünglichen Problems, wie würden Sie elegant die beiden Vektoren überprüfen?
Beachten Sie, wenn Sie den bereitgestellten Code entschlüsseln möchten. at(int)
gibt den Punkt in einem Gesicht zurück und nPoints()
gibt die Anzahl der Punkte in einem Gesicht zurück.
Vielen Dank.