/** * Methode waehlt den Ergebnisstrahl aus dem uebergebenen Vektor aus und gibt diesen zurueck. * Dadurch kapselt die Methode die gesamte Auswahllogik. * * @param hits Liste mit saemtlichen Trefferinstanzen * @param current Strahl, fuer den nach Schnitten mit allen anderen Strahlen gesucht wird * @param bucket Eimer, fuer den aktuell ein gemergter Grundriss erstellt wird * @return Hit-Datenstruktur, die als Ausgangspunkt der naechsten Iteration dient */ private Hit chooseResultRay( final List<Hit> hits, final Ray current, final FootprintBucket bucket) { Hit currentHit = null; // kommen mehrere Hits mit gleicher Distanz vor, fuellt man diese // zunaechst in einen Buffer-Vector um List<Hit> buffer = new ArrayList<Hit>(); sortHitsByDistance(hits); float distance = Float.MAX_VALUE; // befuelle den Buffer-Vector mit allen Hits, die die minimale Distanz // besitzen // 1. Hit nehmen und distance initialisieren buffer.add(hits.get(0)); distance = hits.get(0).getDistance(); for (int i = 1; i < hits.size(); i++) { currentHit = hits.get(i); if (currentHit.getDistance() > distance) break; else buffer.add(currentHit); } hits.clear(); // wurde nur ein Hit mit dieser Distanz gefunden, gebe diesen als // Ergebnis zurueck if (buffer.size() == 1) return buffer.get(0); // an diesem Punkt hat man mehrere Strahlen mit gleicher Distanz // fuehre einen Votingansatz durch, bei dem fuer jeden Strahl Tests // gerechnet werden => je nach Ausgang dieser Tests wird der Vote-Count // fuer den jeweiligen Treffer erhoeht, am Ende waehlt man den Strahl // mit den meisten Stimmen Iterator<Hit> hitIter = buffer.iterator(); while (hitIter.hasNext()) { currentHit = hitIter.next(); // bevorzuge Strahlen mit unterschiedlicher Richtung if (!hasSameDirection(currentHit, current)) currentHit.vote(1); // bevorzuge Strahlen, die nicht zum gleichen Objekt gehoeren, wie // der Ausgangsstrahl // es ist wichtiger, dass der Strahl nicht zum gleichen Objekt // gehoert, darum 2 Stimmen! if (!isPartOfSameObject(currentHit, current, bucket)) { currentHit.vote(2); } } // sortiere die Strahlen anhand der Stimmen, die sie durch die // Votingmethoden bekommen haben sortHitsByVoteCount(buffer); /* * logger.debug("Gevotete Hits: "); for (int i = 0; i < buffer.size(); * i++) logger.debug(buffer.get(i)); */ return buffer.get(buffer.size() - 1); }