## c't-Projekte - Mailinglisten

[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

### AW: [ct-bot] Erweiterung Pfadplanung

Absender: Frank Menzel
Datum: Mo, 06.04.2009 16:53:06
In-reply-to: <BC6C1115-F2C9-4BDF-A47E-01D666E0B2AE@xxxxxxxxxxxxxxx>

    Hi Timo,
    OK, ich seh's ja ein.
    Aber jedenfalls funktioniert die Routine erst mal, mit avg geht gar
    nix...

    Gruß, Frank

    -----Ursprüngliche Nachricht-----
    Von: ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx
    [mailto:ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx] Im Auftrag von Timo
    Sandmann
    Gesendet: Montag, 6. April 2009 12:57
    An: Entwicklung rund um den c't-bot
    Betreff: Re: [ct-bot] Erweiterung Pfadplanung

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    Hi Frank,

    was ich meinte ist Folgendes: Wenn ich bei deinem Code

      /*!
    + * Map-Umfeldpruefung ob ein bestimmter Wert compare ab einer
    Position xy mit Radius r nicht unterschritten wird
    + * @param x			Map-Koordinate
    + * @param y			Map-Koordinate
    + * @param radius	Radius des Umfeldes
    + * @param compare	Vergleichswert, der nicht unterschritten werden
    darf
    + * @return          True wenn alle Felder wenigstens den
    Vergleichswert haben, False wenn mindestens 1 Feld kleiner dem
    Wergleichswert ist
    + */
    +uint8_t check_value_field_circle(uint16_t x, uint16_t y, int8_t
    radius, int8_t compare) {
    +	int8_t dX, dY;
    +	int16_t h = muls8(radius, radius);
    +	for (dX=-radius; dX<=radius; dX++) {
    +		int16_t dX2 = muls8(dX, dX);
    +		for (dY=-radius; dY<=radius; dY++) {
    +			if (dX2 + muls8(dY, dY) <= h) {
    +				// nur innerhalb des Umkreises
    +				if (access_field(x + dX, y + dY, 0, 0) <
    compare)
    +					return False;
    +			}
    +		}
    +	}
    +	return True;
    +}
    +
    +/*!
    + * prueft ob innerhalb eines Radius-Umfeldes kein Feld den
    Vergleichswert unterschreitet; Falls doch sofortiges Ende der Routine;
    + * Hindernis wird mit MAP_RADIUS_FIELDS eingetragen
    + * @param x		Welt-X-Koordinate
    + * @param y		Welt-Y-Koordinate
    + * @param compare	Vergleichswert, der nicht unterschritten werden
    darf
    + * @return      True wenn alle Felder wenigstens den Vergleichswert
    haben, False wenn mindestens 1 Feld kleiner dem Wergleichswert ist
    + */
    +uint8_t check_value_circle(int16_t x, int16_t y, int8_t compare) {
    +	uint8_t r;
    +	// in Map mit dem Radius um x/y eintragen
    +	for (r=1; r<=MAP_RADIUS_FIELDS; r++) {
    +		if (!check_value_field_circle(world_to_map(x),
    world_to_map(y), r,
    compare))
    +		  return False;
    +	}
    +	return True;
    +}

    die Funktion check_value_circle() aufrufe, werden die meisten Bereiche
    des Kreises doppelt und dreifach auf Hindernisse geprüft. Wenn dort im
    ersten Schleifendurchlauf kein Hindernis war, wird das im zweiten,
    dritten, vierten, ... Durchlauf aber auch nicht der Fall sein. Wenn
    man Zahlen in die Schleifen einsetzt, sieht man schnell, dass der Code
    für einen Kreis mit einem Radius von 6 Pixel 91*pi Vergleiche (und
    access_field()-Aufrufe) durchführt mit Koordinaten innerhalb dieses
    Kreises. Solch ein Kreis besitzt aber insgesamt nur 36*pi Pixel =>
    völlig unnötiger Overhead.
    Dort wo du den Code vermutlich her hast, hat er eine ganz andere
    Aufgabe: Er ist dazu gedacht, in einem Kreis
    Hinderniswahrscheinlichkeiten anhand einer (angenäherten)
    Normalverteilung einzutragen. Für die Auswertung von Map-Daten (zu
    einem festen Zeitpunkt) ist das Vorgehen aber unsinnig.

    Grüße,
    Timo

    Am 04.04.2009 um 15:15 schrieb Frank Menzel:
    > Hallo Timo,
    > die Idee ist, neben dem Ersetzen der fehlerhaften avg-Routine, zu
    > erkennen ob innerhalb eines gewissen Umkreises zu einem Punkt ein
    > Hindernis in der Map eingetragen ist und dann sofort abzubrechen und
    > keinen weiteren Mapzugriff stattfinden zu lassen.
    > Was Du wiederum  meinst, verstehe ich nicht-hatte die Routine
    > abgekupfert aus den Zeilen höher.
    > Gruß, Frank

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.9 (Darwin)

    iEYEARECAAYFAknZ3+UACgkQDH/BX4067fLkXACfbYBg5hJAJS+Xt5klA6gldpuU
    xuMAn2ONBP0J6K28z+3FBkj9f6pw+Jt9
    =10g8
    -----END PGP SIGNATURE-----

    _______________________________________________
    ct-bot-entwickler Mailingliste
    ct-bot-entwickler@xxxxxxxxxxxxxxxxx
    http://www.heise.de/bin/newsletter/listinfo/ct-bot-entwickler

- Antworten:
  - Re: [ct-bot] Erweiterung Pfadplanung
    - From: Timo Sandmann
  - [ct-bot] FIFO kompiliert nicht??
    - From: Fred Ammann

- Referenzen:
  - Re: [ct-bot] Erweiterung Pfadplanung
    - From: Timo Sandmann

- Voriger (Datum): Re: [ct-bot] Erweiterung Pfadplanung, Timo Sandmann
- Nächster (Datum): Re: [ct-bot] Erweiterung Pfadplanung, Timo Sandmann
- Voriger (Thread): Re: [ct-bot] Erweiterung Pfadplanung, Timo Sandmann
- Nächster (Thread): Re: [ct-bot] Erweiterung Pfadplanung, Timo Sandmann
- Indizes:
  - Datum
  - Thread