• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Wie über die Punkte einer Zone iterieren?

satanklaus

Geomaster
Bei allen Bsp zu dynamischen Zonen, die ich bisher gesehen habe, wurde ein Polygon um einen Mittelpunkt aufgespannt. Ich möchte nun eine beliebig geformte Zone linear verschieben, also deren Form beibehalten.
Leider ist mir die Datenstruktur der Zonen-Klasse nicht so ganz klar.

Das ist mein Code:

Code:
----------------------------------------------------------------------------
function shiftZone(zone)
  zone.Active = false -- Disable zone, active zones cannot be moved
  zone.Points = getNewZonePoints(zone, 20.0, 130.0)
  zone.Active = true -- Enable zone
end
----------------------------------------------------------------------------

function getNewZonePoints(zone, distVal, bearing)
  local dist = Wherigo.Distance(distVal, 'm')
  local pts = {}
  for i,point in ipairs(zone.Points) do
    local newPoint=Wherigo.TranslatePoint(point, dist, bearing)
    pts[newPoint]=i
  end
  return pts
end

Leider haut mir den der Emulator um die Ohren.
Timer Tick method call failed. .../urwigo-src-73b793bd-ec35-4152-9ec5-fd6a7741f45d.lua:328: attempt to index local 'zone' (a nil value)
Ich nehme an, dass diese Zeile nicht passt:
Code:
for i,point in ipairs(zone.Points) do
Wie genau muss die for-Schleife aussehen, um korrekt über die Punkte der als Zone zu iterieren, die als Argument übergeben wurde?

Danke!
 

Charlenni

Geomaster
Nein, da liegst Du nicht richtig. Das Problem ist, dass "zone" nil ist und damit zone.Points undefiniert. Warum das so ist kann ich Dir leider nicht sagen. Allerdings bin ich mir fast sicher, dass in Zeile 328 Deines Codes die Zeile "zone.Active =..." steht und er da schon raus fliegt.
 
OP
satanklaus

satanklaus

Geomaster
Charlenni schrieb:
Das Problem ist, dass "zone" nil ist und damit zone.Points undefiniert.

Genau, steht ja eigentlich genau so auch in der Fehlermeldung ... :roll:
Und der Grund dafür ist, dass ich mal wieder vergessen habe, den automatisch generierten Namen der Zone durch einen explizit vergebenen zu ersetzen. Geändert, funzt.

Hier noch der Code zum Bewegen, allerdings werden im Gegensatz zur ersten Version nur die Keys in der Table mit insert() angelegt, die Values braucht man ja eh nicht.

Code:
function getNewZonePoints(zone, distVal, bearing)
  local dist = Wherigo.Distance(distVal, 'm')
  local pts = {}
  for i,point in ipairs(zone.Points) do
    local newPoint=Wherigo.TranslatePoint(point, dist, bearing)
    table.insert(pts,newPoint)
  end
  return pts
end
 
Oben