|
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
|
||||||
Растеризация кривой второго порядка22.09.2010, 18:51. Показов 4062. Ответов 11
Метки нет (Все метки)
Есть функция, к примеру ax^2+bx+c, необходимо растеризовать ее с устранением ступенчатости. Подскажите каким алгоритмом это осуществлять?
Отобразить изображение функции в массиве пикселей. P.S. заодно скажите как управлять цветом пикселя (в формате 0x00000000) с помощью сдвигов? К примеру:
0
|
||||||
| 22.09.2010, 18:51 | |
|
Ответы с готовыми решениями:
11
Построение кривой 2-го порядка
Ругне-Кутта второго порядка |
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 22.09.2010, 19:07 | |
|
Во-первых, можно воспользоваться алгоритмами построения сглаженных линий или даже воспользоваться аппаратной поддержкой, через OpenGL. Далее - как обычно: строим массив точек и проводим соединяющие линии.
Во-вторых, можно решить задачу в лоб: определить в аналитическом виде функцию от координат пикселя, которая даёт интенсивность окраски пикселя в зависимости от того, насколько близко он расположен к кривой. Тут есть, конечно, сильная зависимость от отображаемой функции, что невыгодно отличает этот подход от первого. Зато картинка получится максимально точной. Можно и скомбинировать эти подходы, реализовав алгоритм построения прямой линии со сглаживанием, вычисляющий интенсивность пикселей в зависимости от их близости к линии.
1
|
|
|
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
|
||
| 22.09.2010, 19:13 [ТС] | ||
|
0
|
||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 22.09.2010, 19:36 | |
|
На практике придётся решать уравнения, что не всегда осуществимо. Надо будет выразить кривую параметрически (зависимость x и y от новой переменной t, простейший случай x = t, но он не всегда применим), взять частные производные, которые дадут вектор касательной, и найти к нему нормаль. Всё это в аналитическом виде. Получим уравнение прямой, перпендикулярной нашей кривой в точке t с коэффициентами, выраженными через t. Решив это уравнение опять же аналитически, мы сможем находить t по координатам данной точки (не точки на кривой, а любой точки в пространстве, лежащей на перпендикуляре), а из него уже найдём x, y наиболее близкой точки на кривой. Для некоторых кривых (например, для спирали) может быть множество решений, тогда надо выбрать ближайшую из точек. Ну а дальше остаётся банально найти расстояние между двумя точками.
1
|
|
|
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
|
|
| 22.09.2010, 21:01 [ТС] | |
|
Звучит ну оочень сложно.. Попробую разобраться...
0
|
|
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 22.09.2010, 22:40 | |
|
Ну тогда поясню на примере.
Дана кривая y = A*x^2 + B*x + C Выразим её параметрически: x = t y = A*t^2 + B*t + C Вектор касательной в точке t: N(t) = {x'(t); y'(t)} = {1; 2*A*t + B} (это обычные производные dx/dt и dy/dt, не совсем то, что в мат. анализе называется частными производными). Перпендикулярный ему вектор получаем перестановкой компонент и сменой знака у одного из них (любого): P(t) = {2*A*t + B; -1} Уравнение прямой, параллельной вектору V = {D; E} выглядит так: D*x + E*y + F = 0 Подставив P(t), получаем уравнение перпендикуляра к точке t: (2*A*t + B) * x - y + F = 0, при этом мы пока не знаем F. Воспользуемся тем фактом, что перпендикуляр заведомо проходит через точку x(t), y(t): (2*A*t + B) * t - (A*t^2 + B*t + C) + F = 0 -> A*t^2 - C + F = 0 -> F = C - A*t^2 Окончательное уравнение перпендикуляра: (2*A*t + B) * x - y + C - A*t^2 = 0 Теперь, если нам по данной точке {X; Y} надо найти ближайшую точку на кривой, необходимо решить это уравнение относительно t (то есть, выразить t через X и Y): (2*A*t + B) * X - Y + C - A*t^2 = 0 -> A*t^2 - 2*A*t*X - B*X + Y - C = 0 t(X, Y) = (2*A*X +- sqrt(4*A^2*X^2-4*A*(Y - B*X - C)) ) / (4*A) Исходя из здравого смысла, у этого уравнения всегда должен иметься хотя бы один корень. Хотя, я мог и что-то напутать в своих выкладках. В общем случае мы имеем два корня и две точки: {x(t1); y(t1)} и {x(t2); y(t2)}, которые легко можем посчитать по тем параметрическим формулам, с которых начали. Нам остаётся посчитать два расстояния R1 = {x(t1); y(t1)} - {X; Y} и R2 = {x(t2); y(t2)} - {X; Y} и выбрать наименьшее.
2
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 22.09.2010, 23:02 | |
|
ищите реализации алгоритма Брезенхэма, там есть алгоритмы для прямых, окружностей и кривых
0
|
|
|
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
|
|
| 22.09.2010, 23:59 [ТС] | |
|
Nick Alte, спасибо огромное, теперь понял, осталось проверить.
alex_x_x, метод брезенхема мне не совсем подходит, т.к. там не тот принцим сглаживания, который нужен мне.
0
|
|
|
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
|
||||||
| 23.09.2010, 23:08 [ТС] | ||||||
|
Ну в общем не очень то и получилось...
Вот такая функция получилась в итоге для определения расстояния:
а вот что при if(distance(0.01,0,1,x,y)<50) собственно фиолетовый - область этой функции при заданных параметрах, координатные оси и приблизительный график функции. Также эта функция не вычисляет вообще ничего если точка попадает внутрь графика... что делать?
0
|
||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
| 24.09.2010, 17:33 | ||||||
|
Для начала надо было проверить мои выкладки - я вполне мог по пути что-то напутать.
Считать расстояние между точками надо правильно: D ({x1; y1} - {x2; y2}) = sqrt((x2-x1)^2 + (y2-y1)^2) Ну и написать функцию более внятно, примерно так:
1
|
||||||
|
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
|
|
| 24.09.2010, 21:48 [ТС] | |
|
Ну в общем с вашей функцией лучше, но все равно неправильно (if(distance(0.01,0.1,10,x+1,y)<100))
Вывод формулы я проверял, вроде все правильно.
0
|
|
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
| 25.09.2010, 18:11 | ||||||
|
Плохо проверял, я в уравнении прямой накосячил.
Уравнение прямой, параллельной вектору V = {D; E} выглядит так: E*x - D*y + F = 0 Тогда уравнение перпендикуляра x + (2*A*t + B) * y + F = 0 Подставив x(t), y(t) получим t + (2*A*t + B) * (A*t^2 + B*t + C) + F = 0 и F = - (2*A^2*t^3 + 3*A*t^2*B + (1+2*A*C+B^2)*t + B*C) Получается кубическое уравнение, которое всегда имеет хотя бы один вещественный корень (что соответствует смыслу - для любой точки P0 на плоскости найдётся как минимум одна точка P1 на параболе, из которой можно провести перпендикуляр, проходящий через P0). Оно решается по формуле Кардано, ну и далее как раньше. Далее, о закраске. Интенсивность должна зависеть от расстояния до кривой не пороговым образом. Простейший случай - линейная зависимость, когда для линии толщиной 2*r0 интенсивность закраски, измеряемая по шкале от 0 до 1 (от пустого пикселя до наиболее интенсивного) вычисляется как I(r) = (r<r0) ? (r0-r)/r0 : 0; С цветом пикселя удобнее работать, "разобрав" его на отдельные целочисленные компоненты, которые после нужных преобразований приводятся в диапазон от 0 до 255 и "собираются" вместе.
2
|
||||||
| 25.09.2010, 18:11 | |
|
Помогаю со студенческими работами здесь
12
C++ Метод Милна для диффуры второго порядка
Алгоритм Рунге-Кутта для производной второго порядка Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|