Re: Вычисление площади сложной фигуры.
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.05.23 07:04
Оценка:
Здравствуйте, Bitman72, Вы писали:


B>Есть что-то иное?

Самый главный вопрос — что за точки? Если они расположены на границе территории — это одно.
По углам — другое.
По всей площади — третье.
Третий случай — самый тяжёлый. Как по точкам воостановить площадь фигуры?


Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Вычисление площади сложной фигуры.
От: kov_serg Россия  
Дата: 13.05.23 16:09
Оценка:
Здравствуйте, Bitman72, Вы писали:

B>Проблема такова: есть территория, ограниченная GPS координатами. Нужно вычислить площадь участков.

B>Основная масса фигур — почти прямоугольники, но встречаются очень замысловатые формы. Вот с ними — проблема.
B>Геодезическая точность при вычислении не нужна. Можно считать на сфере. Наверное, можно даже и на плоской проекции.

B>Из того, что уже пробовал: прямоугольник, в который вписана фигура. Разбиение на квадраты. Работает, но долго. В принципе, Монте-Карло работает так же и не значительно быстрее.


B>Есть что-то иное?


Можно примерно так:

function wsg84_local(p0) -- https://ru.wikipedia.org/wiki/WGS_84
    local re,rp,g2r=6378137, 6356752.3142, math.pi/180
    local c=math.abs(math.cos(p0.lat*g2r))
    local ka,kb=-g2r*re*math.sqrt(1+c*c*((rp/re)^2-1)), g2r*re*c
    return function(p) return { x=kb*(p.long-p0.long), y=ka*(p.lat-p0.lat) } end
end
function area(p) local s,n,j=0,#p,#p
    for i=1,n do s=s+p[i].x*p[j].y-p[j].x*p[i].y j=i end
    return math.abs(s)/2
end
function apply(src,fn) local r={} for k,v in pairs(src) do table.insert(r,fn(v)) end return r end
function printf(...) print(string.format(...)) end
function show_gps_points(p) print "{" for k,v in pairs(p) do printf("\t{ lat=%.7f, long=%.7f },",v.lat,v.long) end print "}" end
function show_points(p) io.write'<path d="M' for k,v in pairs(p) do io.write(("%.1f,%.1f "):format(v.x,v.y)) end print 'z"/>' end
function from_yandex_map(url) local res,p,h,t,long,lat,dlong,dlat={},1
    h,t,long,lat=url:find("rl=([^%%]+)%%2C([^~&]+)",p) if not t then error() end
    lat=tonumber(lat) long=tonumber(long) table.insert(res,{lat=lat,long=long})
    while t do
        p=t+1 h,t,dlong,dlat=url:find("^~([^%%]+)%%2C([^~&]+)",p) if not t then break end
        lat=lat+tonumber(dlat) long=long+tonumber(dlong)
        table.insert(res,{lat=lat,long=long})
    end
    return res
end

gps_points=from_yandex_map[[
https://yandex.ru/maps/?ll=37.602844%2C55.730905&rl=37.602660%2C55.731591~0.001375%2C-0.000459~-0.001035%2C-0.000917~-0.001350%2C0.000483&rlt=area&z=18.92
]]
-- show_gps_points(gps_points)
points=apply(gps_points, wsg84_local( gps_points[1] ) )
-- show_points(points)
printf("S=%.0f [m^2]",area(points))

S=11951 [m^2]
Re: Вычисление площади сложной фигуры.
От: barrett Россия  
Дата: 05.04.24 13:53
Оценка:
Здравствуйте, Bitman72, Вы писали:

B>Добрый вечер всем.


B>Проблема такова: есть территория, ограниченная GPS координатами. Нужно вычислить площадь участков.

B>Основная масса фигур — почти прямоугольники, но встречаются очень замысловатые формы. Вот с ними — проблема.

Разбейте фигуру на треугольники с помощью триангуляции Делоне. Потом найдёте площади треугольников через их стороны.
Re[3]: Вычисление площади сложной фигуры.
От: Alekzander  
Дата: 05.04.24 14:43
Оценка:
Здравствуйте, Bitman72, Вы писали:

B>В общем множестве простых регионов встречаются невероятно сложные. И улиткообразные и какие угодно.


Каково определение "простоты"? Геометрическое определение — замкнутость пути, образованного непересекающимися отрезками, соединёнными попарно. Улиткообразные многоугольники в соответствии с этим определением — простые.
Re[2]: Вычисление площади сложной фигуры.
От: kov_serg Россия  
Дата: 05.04.24 16:20
Оценка: +1
Здравствуйте, barrett, Вы писали:

B>Разбейте фигуру на треугольники с помощью триангуляции Делоне. Потом найдёте площади треугольников через их стороны.


Нафига?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.