/**
   * 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);
  }