feat(markarbejde): genbrug Courseplay-kurser — markform-signatur + kursus-register pr. maskine; genbrug/kopi i stedet for ny beregning, glemmes ved ændret mark (v1.34.0.0)
This commit is contained in:
@@ -194,6 +194,33 @@ function ADFields.readPolygon(field)
|
||||
return verts
|
||||
end
|
||||
|
||||
-- Markens form-fingeraftryk: antal hjørner, areal (shoelace, nærmeste 10 m²) og tyngdepunkt (nærmeste meter).
|
||||
-- Samme mark giver samme streng trods små float-forskelle; en ændret mark (hjørne/kant) giver en ny.
|
||||
-- Bruges til at genbruge Courseplay-kurser (ADCourseCache). nil uden en flade (under 3 hjørner).
|
||||
ADFields.SHAPE_AREA_STEP = 10
|
||||
local function roundTo(value, step)
|
||||
return math.floor(value / step + 0.5) * step
|
||||
end
|
||||
function ADFields.shapeSignature(verts)
|
||||
if type(verts) ~= "table" or #verts < 3 then return nil end
|
||||
local n = #verts
|
||||
local twiceArea, sx, sz = 0, 0, 0
|
||||
for index = 1, n do
|
||||
local a, b = verts[index], verts[index % n + 1]
|
||||
local cross = a.x * b.z - b.x * a.z
|
||||
twiceArea = twiceArea + cross
|
||||
sx, sz = sx + (a.x + b.x) * cross, sz + (a.z + b.z) * cross
|
||||
end
|
||||
local cx, cz
|
||||
if math.abs(twiceArea) > 1e-6 then
|
||||
cx, cz = sx / (3 * twiceArea), sz / (3 * twiceArea)
|
||||
else
|
||||
cx, cz = ADFields.polygonCenter(verts)
|
||||
end
|
||||
return string.format("n=%d;a=%d;c=%d,%d", n, roundTo(math.abs(twiceArea) / 2, ADFields.SHAPE_AREA_STEP),
|
||||
roundTo(cx, 1), roundTo(cz, 1))
|
||||
end
|
||||
|
||||
-- Hjørnernes gennemsnit (nil uden hjørner).
|
||||
function ADFields.polygonCenter(verts)
|
||||
if verts == nil or #verts == 0 then return nil end
|
||||
@@ -393,6 +420,9 @@ local function finishScan(adEnv, scan)
|
||||
info.markerDistance = distance
|
||||
info.markerCheckedAt = ADFields.now
|
||||
end
|
||||
-- markens form: ændret mark (anden signatur end kursus-registret) -> gemte kurser til marken glemmes
|
||||
info.shapeSig = ADFields.shapeSignature(info.verts)
|
||||
if ADCourseCache ~= nil and ADCourseCache.checkField ~= nil then pcall(ADCourseCache.checkField, info.id, info.shapeSig) end
|
||||
ADFields.cache[info.id] = info
|
||||
ADFields.listCache = nil
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user