![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
Доброго времени суток!
Срочно нужна помощь. Сейчас занимаюсь дипломом задача: программа расчета электромагнитных полей методом сеток. выходные данные: двумерный массив значений функции в узловых точках сетки. Сам расчет я провел с этим проблем не возникло, но вот проблемы начались когда попросили дописать программу, таким образом, чтобы еще и строились эквипотенциальные поверхности, т.е. кривые проходящие через точки поверхности имеющие одинаковый потенциал. 1. Основная сложность, в том что поверхность расчитываемая мною дискретна и на ней нет расчетных точек с одинаковыми потенциалами. Соответственно эквипотенциальные поверхности должны проходить не через узловые точки, а через каким -то образом апроксимированные или интерполированные. помимо этого количество расчетных точек может колебатся от 12 до 1800, а эквипотенциальных поверхностей должно быть не более 10. 2. К тому же я никогда не работал с графикой в среде дельфи. Прошу помочь с выбором и поиском алгоритмов для первой части и литературы для второй. Если когда либо кому-нибудь попадался код с подобной задачей, прошу показать. Буду рад любой помощи. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Можно поступить хитро, применить графику в помощь физике. Для растяжения картинок часто используют билинейную интерполяцию. Суть ее в том что интерполируется яркость с промежуточных точках. Пусть есть 4 точки
1 2 3 4 В каждой из точек нам известна яркость. Яркость будет у нас значением функции которую нужно интерполировать на плоскости. Сначала делается линейная интерполяция для всех точек расположенных между опорными точками 1 и 3 (т.е. по вертикали). Делается это просто, через 2е точки всегда можно построить прямую по известному уравнению. Теперь для любой точки между 1 и 3 можно вычислить яркость подставив координату У в уравнение прямой. Аналогично действуем с точками 2 и 4. В итоге мы получили интерполяцию по оси У, дальше делаем аналогичным способом для оси Х. Берем точки 1 и 2 и интерполируем все точки между ними, после чего мы можем спустить на ряд пикселей (не ряд опорных точек) ниже, ведь яркость точек на линиях 1 3 и 2 4 нам известна, значит для каждой строки пикселей мы можем теперь сделать свою интерполяцию по яркости. Теперь переходим к физике, вместо яркости у нас другая величина электрический потенциал. Как он меняется в промежуточных точках мы не знаем, потому производим почти такую же билинейную интерполяцию. Почти заключается в том что нам нужны эквипотенциальные линии. Поскольку при билинейной интерполяции у нас появляется множество промежуточных значений, то те значения которые будут ближе всего к нужному потенциалу мы нарисуем цветом отличным от фона, например красным. Признак таков if abs(P(x, y) - P[n]) < err then Pixels[x, y] := clRed; P(x, y) - это будет потенциал в точке соответствующей пикселю, P[n] - массив значений потенциалов для которых нужно рисовать эквипотенциальные линии, err - погрешность, которую прийдеться подобрать руками, от нее будет зависить толщина линий. Чем она больше тем толще будет эквипотенциальная линия. Если она будет слишком маленькой то эквипотенциальная линия будет местами иметь разрывы (где не найдется точки достаточно близкой к нужному потенциалу) Рисовать проще всего на канве (Canvas) используя свойство Pixels присваивая яркости. Это медленно, зато просто. По поводу реализации Билинейной интерполяции можно заглянуть в ФАК, DRKB, или просто погуглить, реализаций есть сотни. Останется только переделать под свою задачу. Более красивые результаты получаться при бикубической интерполяции, там яркость (потенциал) интерполируется по 4м точкам (строиться кубический сплайн). Т.о. При интерполяции одного квадратного фрагмента плоскости участвуют 16 точек и апроксимирующая функция становиться более гладкой (более длинные участки с непрерывной производной). -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
Спсасибо большое. По поводу билинейной интереполяции все понял практически. Единчтвенное P[x,y] - это массив со значениями потенциалов во всех точках, по числу пикселей? то,есть он не маленький получается
А вот как насчет бикубической? Чего то совсем не понятно как с 16 точками быть? как линии проводить? вероятно для моих целей подойдет и билинейная попробую пока реализовать |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Ну не такой уж и большой, пару мегабайт. Кроме того его можно и не создавать. В том месте где идет расчет интерполяции потенциала там же и проверять значение потенциала, если он близок к нужному то рисовать цветом линии иначе рисовать белым. Код я привел для примера. Кстати можно еще улучишь картинку меняя яркость цвета линии в зависимости от погрешности, тогда получаться сглаженные линии Добавлено через 14 минут и 41 секунду Бикубик это фактически построение полинома 3й степени см. http://ru.wikipedia.org/wiki/%D0%9A%D1%83%...%B0%D0%B9%D0%BD -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
Здорово спасибо, а погрешность наверно лучше относительную считать тогда, линия будет без пробелов, ведь значения потенциала могут сильно менятся около одних точек и почти оставаться не изменными у других.
Когда реализую програмнно отпишусь как получилось, если это кому то интересно конечно. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Да, точно, так еще лучше.
Конечно интересно, особенно на скрины посмотреть -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
Блин толи где-то в коде напутал, толи расчет неверный получился. В общем кривые получаются через чур "кривыми". Может быть проблема в расчетах?
![]() Это сообщение отредактировал(а) Alexeis - 26.12.2008, 20:18 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
ElPuzo, хорошо бы еще опорные точки отрисовать, тогда было бы понятнее.
Добавлено через 1 минуту и 36 секунд Кстати где расположены заряды? Тоже было бы неплохо нарисовать для оценки правильности конфигурации поля. Добавлено через 5 минут и 6 секунд Хотя не где точки понятно, они в узлах сетки... стоит проверить еще точность расчетов потенциалов и сам алгоритм интерполяции. Добавлено через 7 минут и 27 секунд Может еще сетка грубовата. Хорошо бы еще уменьшить шаг в расчетах потенциалов. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
потенциалы расчитываются с точностью 0,001 можно и большую сделать. Причем это сто процентов правильные данные по схожим формулам проверял. Потенциалы действительно в узлах сетки. Я грешу на интерполяцию, думаю завтра переделать алгоритм, возможно проблема с разбиением области на квадраты. Т.е. алгоритм разбиения простой между опорными точками по вертикали (включая их) находится 500 div (количество опорных точек по вертикали - 1) а по горизонтали 700 div (количество опорных точек по горизонтали- 1) тут явно из-за округления будет неточность. Я хочу попробывать строго определенное количечтво точек ставить к примеру 20.
Кстати я не учитывал (наверно), что сетка в этом примере прямоугольная с отношением 1:2 правда не знаю как это реализовать, о форме сетки можно судить по коефициентам уравнения, правда коэфициенты могут менятся в конкретное точки если там дополнительные потенциал (в этом не уверен). А прога должна быть универсальна под любые задачи. |
|||
|
||||
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
Тут еще проблема возникла. На примере который я показывал не заметна, а когда стал другую задачу решать, то при закрытии окна программы выскакивает сообщение об ошибки:
![]() а следом за ней: ![]() тут явно какие то проблемы с канвой или большим, динамическим массивом, не знаю точно. Самое забавное для исправление этой ошибки в первой задачи потребывалось, дописать такую строчку при обработке запроса на закрытие окна: image1.canvas.CleanupInstance ; а на вторую задачу в сущность отличающуюся только цифрами: это не действует, получается я не правильно определил источник проблемы? Может кто подскажет, что можно с этим поделать |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
AV бывают он неправильной работы с памятью. Скорее всего выходишь за границы массивов.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
Такие сообщения появляются при закрытии программы, то есть когда все уже начерчено и сделано.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
А это не важно, AV часто возникают при удалении несуществующих объектов, адрес затерся и стал невалидным, попытался удалить вот и AV. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ElPuzo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 24.12.2008 Репутация: нет Всего: нет |
тут еще проблема: я рисую на канве тимиджа. Мне нужго как-то обновлять содержимое, а я не знаю как это делать. Идея состоит в следующем: я хочу после отрисовки графика предоставлять пользователю возможность изменения маштаба сетки. А у меня новая сетка поверх старой рисуется и ширина с высотой почему то не меняется как быть?
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Самый простой способ нарисовать поверх прямоугольник белого цвета размером в картинку. По умолчанию прямоугольник рисуется в заливкой, потому все чтобы будет внутри него будет очищено.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |