Вычисление площади сложной фигуры.
От: Bitman72  
Дата: 17.04.23 20:59
Оценка:
Добрый вечер всем.

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

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

Есть что-то иное?
Re: Вычисление площади сложной фигуры.
От: T4r4sB Россия  
Дата: 17.04.23 21:05
Оценка:
Здравствуйте, Bitman72, Вы писали:

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


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


Как участок задаётся? Множеством углов? Или множеством точек?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: Вычисление площади сложной фигуры.
От: apachik  
Дата: 17.04.23 21:42
Оценка:
Здравствуйте, Bitman72, Вы писали:

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


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

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

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


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


есть очень простой способ вычисления площади многоугольника (не важно какой формы, но без самопересечений), заданного координатами своих верших:
http://algolist.ru/maths/geom/polygon/area.php
считают суммы площадей трапеций под всеми отрезками. т.е. что-то типа разницы двух интегралов под верхним контуром и под нижним. Но магия в том, что даже не нужно задумываться где там крайние точки "разворота". Просто считай подряд и будет профит
Re[2]: Вычисление площади сложной фигуры.
От: T4r4sB Россия  
Дата: 17.04.23 21:45
Оценка:
Здравствуйте, apachik, Вы писали:

A>считают суммы площадей трапеций под всеми отрезками.


Слишком сложно, гораздо проще
sum(i=2..n) square_of_triangle(a[i],a[i-1],a[0]);
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: Вычисление площади сложной фигуры.
От: apachik  
Дата: 17.04.23 21:51
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, apachik, Вы писали:


A>>считают суммы площадей трапеций под всеми отрезками.


TB>Слишком сложно, гораздо проще

TB>
TB>sum(i=2..n) square_of_triangle(a[i],a[i-1],a[0]);
TB>


это будет работать только для выпуклых многоугольников.
представьте, что у вас, например, звезда, или просто "буква Г"

Ну и на всякий случай еще отмечу, что площадь треугольника не нужно считать по формуле Герона
Отредактировано 17.04.2023 21:51 apachik . Предыдущая версия .
Re[4]: Вычисление площади сложной фигуры.
От: T4r4sB Россия  
Дата: 17.04.23 21:55
Оценка:
Здравствуйте, apachik, Вы писали:

A>это будет работать только для выпуклых многоугольников.

A>представьте, что у вас, например, звезда, или просто "буква Г"

Ну площадь-то ориентированную надо брать, и всё сойдётся.

A>Ну и на всякий случай еще отмечу, что площадь треугольника не нужно считать по формуле Герона


Само собой, надо брать косое произведение векторов пополам.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[5]: Вычисление площади сложной фигуры.
От: apachik  
Дата: 17.04.23 21:57
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, apachik, Вы писали:


A>>это будет работать только для выпуклых многоугольников.

A>>представьте, что у вас, например, звезда, или просто "буква Г"

TB>Ну площадь-то ориентированную надо брать, и всё сойдётся.


A>>Ну и на всякий случай еще отмечу, что площадь треугольника не нужно считать по формуле Герона


TB>Само собой, надо брать косое произведение векторов пополам.


вот теперь соглашусь
Re[2]: Вычисление площади сложной фигуры.
От: Bitman72  
Дата: 18.04.23 09:00
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Как участок задаётся? Множеством углов? Или множеством точек?

Множеством координат. Т.е. точек.

В общем множестве простых регионов встречаются невероятно сложные. И улиткообразные и какие угодно.
Re[3]: Вычисление площади сложной фигуры.
От: Vzhyk2  
Дата: 19.04.23 07:18
Оценка:
B>Множеством координат. Т.е. точек.
Т.е. в современной терминологии "облаком точек". Самое простое построить convex hull (по-русски, если память не изменяет, выпуклый многоугольник) по облаку и уже посчитать простой формулой площадь фигуры.
Второй путь построить сетку и посчитать площадь квадратиков занятых точками (сложность с подбором шага сетки).
Третий сложнее, по облаку оценить реальную границу объекта (тут методов море и разной сложности и нейронки, в том числе, используются) и использовать любой из двух методов выше.
Re[4]: Вычисление площади сложной фигуры.
От: Vzhyk2  
Дата: 19.04.23 07:37
Оценка:
B>>Множеством координат. Т.е. точек.
V>Т.е. в современной терминологии "облаком точек".
Ну и поскольку я сегодня добрый, то в либе CGAL многое для тебя давно сделано.
Re[5]: Вычисление площади сложной фигуры.
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.04.23 09:26
Оценка:
Здравствуйте, T4r4sB, Вы писали:

A>>Ну и на всякий случай еще отмечу, что площадь треугольника не нужно считать по формуле Герона


TB>Само собой, надо брать косое произведение векторов пополам.


А что такое косое произведение векторов пополам? Скалярное что ли? А если вектора перпендикулярны?
Re[6]: Вычисление площади сложной фигуры.
От: Vzhyk2  
Дата: 19.04.23 09:30
Оценка:
P>А что такое косое произведение векторов пополам? Скалярное что ли? А если вектора перпендикулярны?
https://www.google.com/search?client=firefox-b-lm&q=%D0%BA%D0%BE%D1%81%D0%BE%D0%B5+%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2
https://grafika.me/node/1042

З.Ы. До какой же степени деградировал кывт.
Re[7]: Вычисление площади сложной фигуры.
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.04.23 10:17
Оценка: -1 :))
Здравствуйте, Vzhyk2, Вы писали:

P>>А что такое косое произведение векторов пополам? Скалярное что ли? А если вектора перпендикулярны?

V>https://www.google.com/search?client=firefox-b-lm&q=%D0%BA%D0%BE%D1%81%D0%BE%D0%B5+%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2
V>https://grafika.me/node/1042

V>З.Ы. До какой же степени деградировал кывт.


Похоже, один ты не деградировал. Наверное, уже некуда?
Re[8]: Вычисление площади сложной фигуры.
От: Vzhyk2  
Дата: 19.04.23 10:27
Оценка:
P>Похоже, один ты не деградировал.
Похоже на то.
Re[6]: Вычисление площади сложной фигуры.
От: T4r4sB Россия  
Дата: 19.04.23 10:36
Оценка: +1 -1
Здравствуйте, Pauel, Вы писали:

P>А что такое косое произведение векторов пополам? Скалярное что ли? А если вектора перпендикулярны?


Зачем ты задаешь тупые вопросы которые гуглятся на раз?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[4]: Вычисление площади сложной фигуры.
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.04.23 15:28
Оценка:
Здравствуйте, apachik, Вы писали:

A>Ну и на всякий случай еще отмечу, что площадь треугольника не нужно считать по формуле Герона


А можно спросить почему? Никак не могу понять
.
Re[5]: Вычисление площади сложной фигуры.
От: T4r4sB Россия  
Дата: 19.04.23 16:48
Оценка: +1
Здравствуйте, Pauel, Вы писали:

P>А можно спросить почему? Никак не могу понять


Потому что для неё надо знать длины сторон (каждая — это квадратный корень) и ещё в конце взять корень. И ещё она не ориентированная. Косое произведение — это два числовых произведения и одно вычитание.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: Вычисление площади сложной фигуры.
От: Teolog  
Дата: 19.04.23 20:04
Оценка:
Перевести всю пачку в декартовы координаты относительно середины, либо одной из точек если середину лень искать
Разбить многоугольник га треугольники триангуляцией делоне
Посчитать сумму площадей треугольников по вершинам
Re: Вычисление площади сложной фигуры.
От: о_О
Дата: 19.04.23 21:25
Оценка:
Здравствуйте, Bitman72, Вы писали:

А есть инструмент для подсчета? Чтобы векторный ыормат скормить, а он подсчитал?
Re[2]: Вычисление площади сложной фигуры.
От: Vzhyk2  
Дата: 20.04.23 08:21
Оценка:
T>Перевести всю пачку в декартовы координаты относительно середины, либо одной из точек если середину лень искать
T>Разбить многоугольник га треугольники триангуляцией делоне
T>Посчитать сумму площадей треугольников по вершинам
Только не забывать, что получишь тот самый convex hull.
Но да, иногда такой путь быстрее, иногда быстрее построить convex hull и его площадь посчитать.
Кстати подходит любая триангуляция (покрытие треугольниками без пересечений), не обязательно делоне.

Ну и ТС может взять за основу какой алгоритм построения convex и переработать его так, чтобы строить unconvex. И если в интернете посмотрит, то таких алгоритмов там много есть.
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...
Пока на собственное сообщение не было ответов, его можно удалить.