Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)
как исправить это , сделал все по инструкции
Timer1 - выдает ошибку. Использовал IdleTimer1, работает! unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 =...
в коде присутствуют ошибки! // Считываем координаты procedure TForm1.getCoords(Sender: TObject); var j1:longint; begin n:= StrToInt(Edit2.Text); //число точек s1:=Edit1.Text; s2:=''; i := 1; j:=1; k:=0...

Счетчики и рейтинг

Яндекс.Метрика Рейтинг@Mail.ru

Система частиц – широко используемый в компьютерной графике метод представления объектов, не имеющих четки геометрических границ. Облака, туманности, дым, снег – все эти объекты моделируются с помощью систем частиц.
Мы попробуем организовать примитивную систему, моделирующую взаимодействие множества частиц с некоторой точечной силой. При этом под «точечной силой» может подразумеваться гравитационное, электромагнитное или другое взаимодействие похожего рода. При этом наша сила будет появляться и исчезать по нашему желанию.

Итак, необходимо чтобы некоторая сила, воздействовала на каждую точку.
В данном случае я задаю силу весьма тривиально: чем ближе частица в источнику, тем сильнее воздействие. То есть F = G \ D^2. Где G – некоторая константа, с помощью которой мы сможем регулировать взаимодействие, D – расстояние между источником силы и частицей. Сразу оговорюсь что в этой формуле не хватает маленькой детали – не понятно в каком направлении должна действовать сила, то есть надо дополнить формулу так, чтобы F стала векторной величиной, дополним формулу еще одним, на этот раз векторным множителем N = {x, y}, равному разности между координатами источника силы, и координатами нашей точки. Конечный вид формулы F = (G * N) / D^2 .
К слову, если модифицировать формулу знаком минус: F = - (G * N) / D^2, источник силы начнет отталкивать частицы от себя.
Однако, воздействие всего одной силы на точку будет давать слишком «идеальное» движение. Создадим некую силу сопротивления или тормозящую силу, кому как больше нравится. Формула силы сопротивления, в нашем случае, выглядит еще проще Fc = -V * K, где V – вектор скорости, а K – опять-таки, некоторый коэффициент.
Теперь на нашу частицу воздействует по меньшей мере две силы. Следующий шаг – нахождение ускорения.
Вспоминает школьный курс физики (привет, Ньютон) F = m*a a = F/m. Где F – равнодействующая сила, то есть сумма всех сил, действующих на объект.
Напомню вам пару незатейливых фактов:
1. Ускорение характеризует быстроту изменения скорости.
2. Производная от перемещения по времени – скорость.

Также замечу, что мы получили ускорении только на отдельно взятом кадре.
Найдем скорость на данном кадре следующим образом: V(t) = a*dt + V(t - 1) . Здесь dt - это время, которое было потрачено на обработку и прорисовку предыдущего кадра, V(t – 1) – скорость, на прошлом кадре. Для нахождения новых координат частицы осталось воспользоваться вторым фактом, вернее следствием из него. А следствие из него следующее – интеграл от скорости – перемещение. Так что просто находим первообразную нашей скорость по dt. Получаем: x(dt) = ½ * a * dt^2 + V(t – 1) * dt . Таким образом мы нашли перемещение на данном кадре, теперь прибавляем к текущим координатам перемещение, и получаем координаты частицы на данном кадре. X(t) = ½ * a * dt^2 + V(t – 1) * dt + X(t-1).
Напоследок замечу, что новую скорость нашей частицы можно определить как V = (X(t) – X(t – 1)) / dt где X – координаты точки на новом и предыдущем кадре соответственно. В коде, такой вариант работает немного быстрее.