Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление площади произвольной фигуры 
:(
    Опции темы
Delvish
Дата 17.3.2007, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Ребят, всем здрасьте!))

Имею следующую проблему: на компоненте TChart строю графики из большой таблицы. В итоге графики получаются замкнутыми в одну фигуру. Необходимо найти площадь этой фигуры. Был бы алгоритм построения многоугольника - можно было бы проинтегрировать. А так - даже не знаю как действовать.
Вот пример фигуры 

Присоединённый файл ( Кол-во скачиваний: 33 )
Присоединённый файл  Diagramm1.gif 14,65 Kb
PM MAIL   Вверх
dimazu
Дата 17.3.2007, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Сначала надо сделать интерполяцию верхней и нижней кривых.
Как? Читай про теорему Вейерштрасса, про линейную и квадратичную 
интерполяции, матан, короче...    smile 

Потом просто вычислить интегралы верхней и нижней функций и
взять их разность. Эта разность и будет искомой площадью.
С определенной погрешностью, естессна...

Я бы делал так:

1. Соединил бы 2 соседние точки прямой линией. 
    Это линейная интерполяция. 
    Далее плошадь вычисляется легко.
    Соединяем все пары точек и суммируем интегралы.
    Если надо оценить погрешность, то делай пункт 2.

2. Соединил бы 3 соседние точки параболой. 
   Далее интегралы вичисляются просто и плошадь тоже. 
  Я думаю, что разность результатов от этих двух подходов даст 
  тебе оценку погрешности.

Однако, судя по картинке линейной интерполяции будет более чем
достаточно  smile  

 ЗЫ. Я просмотрел, если тебе надо площадь многогранника, то пункт 2 
       тебе вообще не нужен.

Это сообщение отредактировал(а) dimazu - 17.3.2007, 08:03
PM MAIL   Вверх
Неопытный
Дата 17.3.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Цитата

Сначала надо сделать интерполяцию верхней и нижней кривых.
Как? Читай про теорему Вейерштрасса, про линейную и квадратичную 
интерполяции,

Чего то я не припомню такой теоремы!? Напомните пожалуйста.

PM MAIL   Вверх
Snowy
Дата 17.3.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А я бы сделал шот с этой картинки, залил бы внутри одним цветом, снаружи другим, а потом бы просто посчитак кол-во пикселей внутри smile
PM MAIL   Вверх
SparF
Дата 17.3.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



Snowy, это очень грубо. Точность сразу же привязывается к разрешению картинки....


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
Delvish
Дата 17.3.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



dimazu, спасибо за совет, но первый курс математики вспоминается с трудом... smile не мог бы по подробней рассказать как это сделать? Кстати, метод, предложеный Snowy, не есть ли столь же верный путь к нахождению площади? Но и этот метод мне никак не удается вспомнить...
Кто нибудь сможет помочь? А то уже приличная часть курсовика просчитана, бросать жалко... Да и никто кроме меня за него не возмется...
PM MAIL   Вверх
Delvish
Дата 17.3.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Кстати, dimazu, если использовать твой способ, то мне необходимо знать функции для каждой линии. Но у меня есть только координаты точек. Как из координат вычислить функцию?
PM MAIL   Вверх
SparF
Дата 17.3.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 14.9.2006
Где: Санкт-Петербург/М осква

Репутация: нет
Всего: 18



Если есть точки, значит есть многоугольник))
Решение обсуждалось здесь


--------------------
Люди, не пользуйтесь пиратским программным обеспечением - переходите на Linux!
PM MAIL ICQ   Вверх
dimazu
Дата 18.3.2007, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Цитата(Delvish @ 17.3.2007,  17:48)
Кстати, dimazu, если использовать твой способ, то мне необходимо знать функции для каждой линии. Но у меня есть только координаты точек. Как из координат вычислить функцию?

Oй как все запущено... smile 

По-моему это школьная программа... smile 

Нам известны 2 точки с координатами (х1,у1) и (х2, у2)
и неизвестен угловой коэффициент.

Получим нужную функцию:

y = y1 + (x - x1)*(y2 - y1) / (x2 - x1)

ЗЫ. А насчет интегрирования ты уж давай сам.  smile 




Это сообщение отредактировал(а) dimazu - 18.3.2007, 08:33
PM MAIL   Вверх
Delvish
Дата 18.3.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



dimazu, спасибо за помощь, но поздно smile я уже вспомнил эту формулу smile
и интеграл пришлось самому писать... точнее, функцию. в общем, с этой бедой разделался. теперь новая появилась... smile

Добавлено @ 22:57 
И всем остальным тоже огромное спасибо за помощь smile
PM MAIL   Вверх
FireSnake
Дата 19.3.2007, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 15.9.2006
Где: Украина, Донецк

Репутация: 1
Всего: 1



Насколько я понял, фигура без самопересечений и нам известны координаты вершин. Тогда все просто. Считаем площадь методом трапеций. А именно:
1.  задаем вершины в порядке обхода (1 вершина = последней).
2. по каждым двум подряд идущим точкам (циклом) строим трапецию, считаем ее площадь и прибавляеем к некой переменной скажем S.
Все, S это и есть искомая площадь.

Как строится трапеция.
Как известно, Sтрапеции=(средняя линия)*(высоту).
Звездочки - точки, координаты их известны.
Две точкки нам известны, еще две - это с координатами (x1,0); (x2,0);
По ним строим трапецию.

       *
     / |
    /  |  
   /|  |
  / |  |
*  |  |
|   |  |
|   |  |
|   |  |
|_ |_|_______->(ox)

Высота это x1-x2

ср.линия это: 
Xcл1:=x1-x2;
Xcл2:=x1-x2;
Yсл1:=0;
Yсл2:=(y1+y2)/2;

Длина средней линнии это длина отрезка (Хсл1,Yсл1,Xсл2,Ycл2);

В процессе обхода площадь тех трапеций , которую надо вычитать из полученной, будет отрицательной, а тех что прибавлять - положительной. Так же еще задавать обход надо всегда строго в одном порядке - по часовой, или против. Иначе итоговая площадь может выйти со знаком  минус.

P.S. Пока писал пост, опаздал на 2 паруsmile надеюсь не сильно будут крепитьsmile

Это сообщение отредактировал(а) FireSnake - 19.3.2007, 09:59
PM MAIL ICQ   Вверх
Delvish
Дата 20.3.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



FireSnake, спасибо, но как то ты запутанно объяснил.... Я сделал проще.
Коэффициент k (для уравнения прямой) это (y2-y1)/(x2-x1) 
Коэффициент b = y1 - k*x1
После этого простое интегрирование с пределами от x2 до x1 по формуле Ньютона-Лейбница smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.