Повышение точности метода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Повышение точности метода

Сообщение XairOn » 19.03.2006 (Вс) 22:25

Здравствуйте господа! Я пишу программу по нахождению площади заданного пользователем многоугольника. Есть 2 способа (вернее рассматриваются 2 способа, на самом деле их наверное больше). Так вот первый способ: расчет по формуле ½*(∑(Xi+Xi+1)*(Yi-Yi+1)) i принимает значения от 1 до N-1 (N - количесво вершин многоугольника) Xn = X0 вобщем не в этом суть, метод довольно хороший и точный, но есть у него один существенный недостаток: порядок обхода должен строго соблюдаться, если пользователь задал многоугольник, а потом между какими-нибудь вершинами решил добавить ещё парочку, данный метод отлетает сразу... о точном значении можно сразу забыть :( . Есть второй способ: отрисованный многоугольник проверяется 2-мя циклами (строки-столбцы) и если встречает не белый пиксель увеличивает счетчик на еденицу:
Код: Выделить всё
...
If GetPixel(hdc, X, Y)<>White Then s=s+1
...

Этот способ лишен недостатков первого, но имеет свои :( Точность в этом методе страдает. Пока рисуются прямые линии (имеется ввиду НЕ наклонные) всё хорошо, но каждая наклонная линия дает погрешность, при чем когда фигура большая и довольно сложная (много линий) погрешность получается нехилая. А вот и вопрос: как можно повысить точность данного метода :?:

P.S. А может быть у кого-нибудь есть соображения о том, как ещё можно расчитать площадь многоугольника?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.03.2006 (Вс) 22:40

Ещё раз, какие исходные данные? Только координаты вершин? Тогда они не задают фигуру однозначно.
Значит, задано что-то ещё?
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 19.03.2006 (Вс) 23:03

tyomitch писал(а):Ещё раз, какие исходные данные? Только координаты вершин?

Да, только координаты вершин, НО в определённом порядке. Вобщем-то порядок вершин которые задают фигуру является ключевым для первого метода. Но он меня не очень-то интересует. Главный вопрос — это второй метод!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.03.2006 (Вс) 23:08

Ещё раз. Если у тебя есть только координаты вершин, то ты не знаешь, что за фигура имелась в виду.
Никакой метод тебе в этом случае не поможет. Особенно такой, хмм... самобытный, как твой второй.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 20.03.2006 (Пн) 0:24

tyomitch писал(а):Никакой метод тебе в этом случае не поможет.


Это одна из задач нейронных сетей.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 20.03.2006 (Пн) 9:19

tyomitch писал(а):Если у тебя есть только координаты вершин, то ты не знаешь, что за фигура имелась в виду.

Да, но если есть порядок в котором они заданы, можно однозначно определить фигуру. А что ещё нужно по-твоему? Вобщем-то проблема не в том, что бы определить фигуру, грубо говоря, пользователь сам её рисует и по MouseUp/MouseDown задает вершины. Нужно найти её площадь, и как можно точнее.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.03.2006 (Пн) 10:11

А почему бы не разбить фигуру на треугольники и не посчитать площади этих треугольников? Единственный момент, на который надо будет обрадить внимание -- если многоугольник не выпуклый, то надо будет вычитать "внутренние" треугольники.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.03.2006 (Пн) 11:16

XairOn писал(а):
tyomitch писал(а):Если у тебя есть только координаты вершин, то ты не знаешь, что за фигура имелась в виду.

Да, но если есть порядок в котором они заданы, можно однозначно определить фигуру. А что ещё нужно по-твоему?

Если есть порядок, тогда можно применить первый метод, безупречно точный, и не маяться с пересчётом пикселов.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.03.2006 (Пн) 11:18

alibek писал(а):А почему бы не разбить фигуру на треугольники и не посчитать площади этих треугольников? Единственный момент, на который надо будет обрадить внимание -- если многоугольник не выпуклый, то надо будет вычитать "внутренние" треугольники.

Зачем на треугольники, когда можно на трапеции? Тогда невыпуклые многоугольники не потребуют особой обработки.
Первый метод XairOn-а именно в этом и состоит.
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 20.03.2006 (Пн) 12:20

Насчет треугольников: метод неплохой и имеет место быть... НО опять, но... если фигура сложная (много вершин) не будет ли каждый треугольник (трапеция) добавлять погрешность?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.03.2006 (Пн) 12:35

Будет. Но точнее ты на компьютере вычислить всё равно не сможешь.
И точность всё равно будет на много порядков выше, чем при пересчёте пикселов.
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 20.03.2006 (Пн) 12:51

Да пересчет пикселей - это бред, на точность можно не расчитывать. Вот идея с треугольниками у меня давно в голове крутилась, только я вот не могу сообразить по каким критерям определять из какой вершины в какую, строить эти треугольники. Сдаётся мне: этот процесс сопровождается особо крупными дозами геммороя :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.03.2006 (Пн) 12:58

Нет. Триангуляция давно решена и активно используется 3D-шниками. Поищи в разделе "VB и 3D" алгоритмы, там были.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.03.2006 (Пн) 17:36

XairOn писал(а):Да пересчет пикселей - это бред, на точность можно не расчитывать. Вот идея с треугольниками у меня давно в голове крутилась, только я вот не могу сообразить по каким критерям определять из какой вершины в какую, строить эти треугольники. Сдаётся мне: этот процесс сопровождается особо крупными дозами геммороя :(

Ещё раз: твой первый метод -- это готовое, формализованное, проверенно работоспособное разбиение фигуры на трапеции.
Хочешь геморроя с треугольниками -- выбор твой.
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 20.03.2006 (Пн) 17:47

tyomitch писал(а):Хочешь геморроя с треугольниками -- выбор твой.

Не хочу я никакого геммороя, но сдаётся мне что с треугольниками, что с трапециями он мен обеспечен (что-то я не думаю, что разбивать полигон на трапеции на много легче чем на треугольники... если вообще легче). И вообще, ты уверен, что любой многоуголник можно разбить на трапеции... и ещё: как быть с таким моментом, если многоугольник не выпуклый, т.е. имеет тупые углы (если изнутри смотреть конечно) я уже молчу о ситуации, когда этот многоугольник имеет "дырки". Самый яркий и наглядный пример - пятиугольная звезда у которой по центру пятиугольная дырка получается, и вообще. что-то представить себе не могу, как например звезду можно разбить на трапеции.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.03.2006 (Пн) 17:53

Хорошо. Тогда предельно конкретный вопрос:
если у тебя уже есть список вершин в порядке обхода, то что тебе мешает просто воспользоваться теми формулами?


Обоснование этого метода, если тебе интересно, есть на http://algolist.manual.ru/maths/geom/polygon/area.php
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 20.03.2006 (Пн) 19:35

2 tyomitch, мешает мне вот что: метод имеет свои недостатки, например вычисляется площадь замкнутой ломаной без самопересечений, а если вдруг самопересечения будут, что тогда делать? Кстати тут резонный вопрос, а триангуляция возможна для замкнутой ломанной с самопересечениями???
tyomitch писал(а):Хорошо. Тогда предельно конкретный вопрос:
если у тебя уже есть список вершин в порядке обхода, то что тебе мешает просто воспользоваться теми формулами?

Если пользователь добавил вершины и нарушил порядок обхода, метод отлетает.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 20.03.2006 (Пн) 20:59

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.03.2006 (Пн) 22:01

XairOn писал(а):2 tyomitch, мешает мне вот что: метод имеет свои недостатки, например вычисляется площадь замкнутой ломаной без самопересечений, а если вдруг самопересечения будут, что тогда делать? Кстати тут резонный вопрос, а триангуляция возможна для замкнутой ломанной с самопересечениями???

Вряд ли. Многоугольник, по определению, -- это замкнутая ломаная без самопересечений; значит, все алгоритмы на многоугольниках тебе не подойдут.

Например, нетривиальный вопрос -- что для такой самопересекающейся кривой будет "внутрь", и что "наружа". Что именно ты собрался триангулировать?

XairOn писал(а):
tyomitch писал(а):Хорошо. Тогда предельно конкретный вопрос:
если у тебя уже есть список вершин в порядке обхода, то что тебе мешает просто воспользоваться теми формулами?

Если пользователь добавил вершины и нарушил порядок обхода, метод отлетает.

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

А если у тебя есть ломаная (самопересекающаяся или иная), то значит порядок обхода известен.
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 20.03.2006 (Пн) 22:48

tyomitch писал(а):Например, нетривиальный вопрос -- что для такой самопересекающейся кривой будет "внутрь", и что "наружа". Что именно ты собрался триангулировать?

Мне вот тоже ОЧЕНЬ интересно было бы это узнать, вот например как работает FillRgn работает... порой так интересно работает... в жизни б не подумал, что так бывает )
tyomitch писал(а):если порядок обхода нарушен, и ты не можешь его восстановить, то ты не можешь определить площадь фигуры никаким способом

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.03.2006 (Пн) 23:24

XairOn писал(а):Ты в этом почему так уверен? Ты это твёрдо знаешь и при желании сможешь доказать или это тебе так кажется просто?

Ох уж эти сказочки, ох уж эти сказочники :roll:
http://users.isnet.ru/tyomitch/Sample01.png
Отмечены вершины многоугольника. Найди его площадь.
Потом посмотри на Sample02.png и Sample03.png ;-)
Изображение

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 21.03.2006 (Вт) 1:21

tyomitch писал(а):
XairOn писал(а):Ты в этом почему так уверен? Ты это твёрдо знаешь и при желании сможешь доказать или это тебе так кажется просто?

Ох уж эти сказочки, ох уж эти сказочники :roll:
http://users.isnet.ru/tyomitch/Sample01.png
Отмечены вершины многоугольника. Найди его площадь.
Потом посмотри на Sample02.png и Sample03.png ;-)


Тём, ты как бы неправ. XairOn как бы говорил и не раз, что порядок точек указан. А раз так, то как бы можно спокойно построить фигуру, причем как бы однозначно и как как бы только одну.

Если я как бы не прав, поправьте меня...
ХЎ

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.03.2006 (Вт) 1:32

Да что ли мы на разных языках говорим?
Если порядок есть, первый метод применим без ограничений.
Если порядка нет, неприменим никакой метод.

Зачем пересчёт пикселов? зачем триангуляция? зачем столько геморроя в пустячной задаче?
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 42

    TopList  
cron