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