Консультация № 183163
13.05.2011, 23:35
51.87 руб.
0 18 1
Здравствуйте! Прошу помощи в следующем вопросе:
написать программу на Delphi7 которая будет генерировать улучшенное изображение произвольного эллипса методом Руа. Описание алгоритма преведено в архиве по ссылке : алгоритм

Обсуждение

давно
Профессионал
304622
583
14.05.2011, 21:17
общий
Выложите, пожалуйста, алгоритм в хранилище файлов здесь, на сайте RPpro. Что-то мне хочется начинать всю эту мороку со скачиванием с депосита. Спросите админов, как здесь выкладывать.
Неизвестный
14.05.2011, 21:52
общий
Вот, залил здесь : https://rfpro.ru/upload/5533
давно
Профессионал
304622
583
16.05.2011, 23:07
общий
Не разобрался.

Что значит Ip и Is в команде "отобразить точку"?
Неизвестный
16.05.2011, 23:20
общий
Ір - это интенсивность текущей точки, Іs - интенсивность дополнительной точки.

вот еще немного теории и блок-схема : https://rfpro.ru/upload/5558

давно
Профессионал
304622
583
17.05.2011, 20:47
общий
Ір - это интенсивность текущей точки, Іs - интенсивность дополнительной точки.


Т.е. это цвет? Или, например, яркость?
давно
Профессионал
304622
583
17.05.2011, 20:48
общий
Прошу сильно на меня не рассчитывать. Разберусь, может быть, по возможности.
Неизвестный
17.05.2011, 22:42
общий
А кто-то еще может посмотреть?
давно
Профессионал
304622
583
19.05.2011, 04:31
общий
А кто-то еще может посмотреть?

А вы на мой вопрос ответить не хотите? Я ж не сказал, что вообще отказываюсь.
Неизвестный
19.05.2011, 11:12
общий
Извините, это яркость.
Я вот нагуглил реализацию похожей задачи, но что-то у меня не работает. Вот линк, может Вы сможете разобраться : http://www.enlight.ru/demo/faq/smth.phtml?query=alg_line_aa#3
давно
Профессионал
304622
583
21.05.2011, 01:51
общий
В субботу у меня будет время, я разберусь и отвечу, сделаю я её или нет.
давно
Профессионал
304622
583
21.05.2011, 14:14
общий
Сделать это я смогу. Если время будет, в начале недели. Иначе четверг/пятница.
Неизвестный
21.05.2011, 14:24
общий
Хорошо, спасибо. Очень желательно в начале недели.
Неизвестный
22.05.2011, 16:53
общий
Я вот пытался сам написать : https://rfpro.ru/upload/5642
Но вместо эллипса рисует какие-то крывые, не могу понять в чём проблема...
Неизвестный
24.05.2011, 18:46
общий
Кстати, незнаю почему, но Sqr в книге это не квадрат, а корень.
давно
Профессионал
304622
583
25.05.2011, 02:18
общий
25.05.2011, 11:08
Это очень хорошо, что вы написали программу. Я изначально также собирался написать то же самое. Теперь я просмотрел код и не нашёл никаких расхождений со сканированным текстом. Но рисовалась чушь.

Потом вы сообщили, что sqr -- это корень. Соответственно, я полез в программу и заменил в нужных местах sqr на sqrt. Тут получилась очень важная вещь: произошла ошибка в вычислении Dxt2, в частности, корень из отрицательного числа. Очевидно, что этого быть не должно -- алгоритм всё-таки не из пальца высосан. Это значит, что сами вычисления происходят неправильно. В чём я и убедился, персчитав подкоренное значение независимо, в Excel'е. Это значит, что ошибка происходит в вычислениях целых чисел (такое бывает). Я присвоил alpha, beta и т.д. в переменные типа real и у меня нарисовался овал. Правда, чуть поменяв даные (30 на 35) я снова получил ошибку в вычислениях -- это уже происходит ниже по тексту программы. Сейчас надо взвесить, какие переменные должны остаться целочисленными, а какие можно переделать в real. Предполагаю, что после этого ваша программа заработает.

Завтра или послезавтра займусь.
давно
Профессионал
304622
583
27.05.2011, 00:31
общий
это ответ
Здравствуйте, Faraon!

Итак. Вот что я получил. Проблема, как я уже отвечал в целочисленной арифметике. Там очень быстро растут значения переменных. Например, при тех данных, которые вы задали в своей программе (радиусы -- 30 и 20, угловые параметры -- 9 и 6), alpha составляет 64800, beta -- 87300. а k -- вообще 42120000. В результате при вычислении Dxt1 в выражении rk*sqr(rbeta-rgamma0) получается промежуточный результат имеет порядок выше, чем 10^16. А максимальное значение 32-разрядного integer примерно 2*10^9. Поэтому там некорректно вычисляются значения и рисуется ерунда. (Если же включить Run-time error checking, то код будет просто прерываться.)

Я как-то думал, что вам предписано делать строго по теории. Поэтому пытался выкрутиться с целыми числами -- в Delphi есть тип данных int64, у него побольше диапазон. Всё равно плохо или вообще не работало. Есть там много мест и ситуаций, где код понимается не так. Только время потерял.

В общем, решение то, о котором я писал в прошлый раз. Я присвоил значения в real-переменные rk, rbeta, rgamma0, ralpha и rgamma и перевёл на них расчёты Dxt1, Dxt2, Dxt0, U, dyn и d1. Короче работает, хотя пару раз сбоило -- потом снова заработало. Проект в приложении. Задавайте вопросы.
Прикрепленные файлы:
Неизвестный
27.05.2011, 06:26
общий
Большое спасибо за помощь!
По поводу вопросов, то в реализации самого алгоритма я разобрался, была только проблема с переполнениями, а вот с математической точки зрения не совсем понимаю как этот алгоритм работает, если можете - обьясните пожалуйста.
давно
Профессионал
304622
583
07.06.2011, 12:08
общий
Как успехи? Ещё не разобрались с математической точки зрения?
Форма ответа