Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

вопрос по геометрии   Найти похожие ветки 

 
beglec ©   (2005-12-08 00:31) [0]

Видимо в школе плохо учился, не помню что и как.
Подскажи, как найти площадь любого плоского объекта.
Объект может быть не только квадратом, треугольников или кругом, а может быть в различной формы - типа многоугольник.
Как показано на картинки требуется найти площадь каждого "квадрата".
www.agroecolog.hut1.ru/layer2.gif

ответик лучше с кодом, ходя теоретического объяснения будет достаточно. Возможно есть уже готовые функции, за указания пальцем на указатель функции буду признателен.


 
Джо ©   (2005-12-08 00:58) [1]

Как задается фигура? И - всегда ли это именно многоугольник - или может быть, например, эллипс?


 
Kerk ©   (2005-12-08 01:05) [2]

Разбивай многоугольник на треугольники. Найти площадь треугольника по трем координатам легко.


 
Кефир87 ©   (2005-12-08 01:06) [3]

Численное интегрирование? Хы-хы-хы 8)


 
Джо ©   (2005-12-08 01:10) [4]

Зачем такие сложности? Есть простой общий способ для любых многоугольников (без самопересечений).
Словами объяснять лень, вот простой неоптимизированный код, он предельно ясен :)

type
 TNode = record
   X,Y: Double;
 end;

 TNodes = array of TNode;

function GetSquare (Nodes: TNodes): Double;
var
 I,I_next,I_prev: Integer;
 Summ: Double;
begin
 Summ := 0;
 for I := Low (Nodes) to High(Nodes) do
 begin
   I_next := I+1;
   I_prev := I-1;
   if I_next > High(Nodes) then
     I_next := 0;
   if I_prev < 0 then
     I_prev := High(Nodes);

   Summ :=
     Summ + ( (Nodes[I_next].Y - Nodes[I_prev].Y) * Nodes[I].X );
 end;

 Result := Abs(Summ/2);
end;

Написал только-что "на колене", но долж0н работать :)


 
beglec ©   (2005-12-08 01:26) [5]

>> Джо ©   (08.12.05 00:58) [1]
Сомневаюсь, что поля в россии, да и в мире могут быть ввиде эллипса, но в нашей хреновой жизни возможно все :)

>> Kerk ©   (08.12.05 01:05) [2]
Я думал на счет этого, но как это сделать? Даже в теории продумать не могу.

>> Кефир87 ©   (08.12.05 01:06) [3]
>> Численное интегрирование? Хы-хы-хы 8)
А если на русский ? :)

>> Джо ©   (08.12.05 01:10) [4]
спасибо за примерчик, буду разбираться.
Взгляни на картинку, может еще какие идеи появятся.


 
Джо ©   (2005-12-08 01:27) [6]

[5] beglec ©   (08.12.05 01:26)
> Взгляни на картинку, может еще какие идеи появятся.

Какие идеи еще? Я же привел стандартную формулу.


 
beglec ©   (2005-12-08 01:36) [7]

да я так спросил


 
Кефир87 ©   (2005-12-08 01:43) [8]


> А если на русский ? :)


Ну в общем численное интегрирование и сводится к разделению сложных фигур на более простые и дальнейшиму подсчету площади этих простых фигур (тропеций, треугольников тех-же...). Но это все, естественно, работает с определенной точностью... Может я что-то и напутал. Ведь именно "численное интегрирование" подразумивает нахождение площади функций 8) Просто уж больно термин страшный 8)


 
uw ©   (2005-12-08 02:08) [9]

Джо ©   (08.12.05 01:10) [4]
Написал только-что "на колене", но долж0н работать :)


И в самом деле работает. Ё-о!


 
beglec ©   (2005-12-08 02:23) [10]

Я не сомневался
>> Джо ©   (08.12.05 01:27) [6]
гений ;)


 
Юрий Зотов ©   (2005-12-08 09:29) [11]

> beglec ©   (08.12.05 00:31)  

> как найти площадь любого плоского объекта.

Любой плоский объект не всегда удастся разбить на простые фигуры (например, если его граница содержит произвольные кривые). В таком случае можно использовать метод Монте-Карло. Суть его вот в чем.

Обводим объект произвольным прямоугольником известных размеров (его площаль обозначим через F). Берем случайную точку внутри этого прямоугольника и смотрим, попадает ли она также и внутрь объекта, или лежит вне него. Если да - увеличиваем счетчик M. То же самое делаем с другой случайной точкой - и т.д. При большом числе N таких испытаний (точек) получаем площадь объекта по формуле:

S = F * M / N

Для реализации этого метода в виде программы Win32 удобно использовать регионы и функцию PtInRegion. Или можно залить прямоугольник одним цветом, а объект - другим, а затем подсчитать отношение количества пикселей с разными цветами.


 
syte_ser78 ©   (2005-12-08 09:36) [12]

переносиш рисунок на мелиметровку. Считаешь колво вошедших квадратиков.


 
Думкин ©   (2005-12-08 09:38) [13]

> syte_ser78 ©   (08.12.05 09:36) [12]

Выпиливаешь лобзиком и взвешиваешь.


 
uw ©   (2005-12-08 09:43) [14]

syte_ser78 ©   (08.12.05 09:36) [12]

Сумму квадратиков, которые пересекаются границей, делишь пополам...


 
syte_ser78 ©   (2005-12-08 10:18) [15]

вырезаеш все квадратики ставиш их столбиком. Делиш высоту столбика на толщину бумаги


 
wal ©   (2005-12-08 10:40) [16]


> переносиш рисунок на мелиметровку.
В масштабе 1:1 (я так понял, речь о полях идет)  ;)



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
3-1131532901
root
2005-11-09 13:41
2006.01.01
Как сохранить JPG в базу Access через ADO


1-1133506111
Михаил_
2005-12-02 09:48
2006.01.01
Создание окон с отдельными кнопками на панели задач


1-1133789961
Экспериментатор
2005-12-05 16:39
2006.01.01
Как в MDI приложении сделать чтобы MDI-child окно максимизировало


14-1134113810
syte_ser78
2005-12-09 10:36
2006.01.01
Косяки при настройке


2-1134452961
Alex_C
2005-12-13 08:49
2006.01.01
Определение строчки в RichEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский