Страница: 1 |
Страница: 1 |
Вопрос: Интересные Векторные Поля в Движении
Добавлено: 13.05.08 20:57
Автор вопроса: Morpheus | Web-сайт:
Здравствуйте все!
Кто-нибудь знает какие-нибудь интересные векторные поля для программирования и способы их отрисовки в движении?
Я вот тут одно сделал быстренько для примера. Но охота что-нибудь покрасивее.
Меня интересуют 2D поля вида F(x,y)=<f(x,y), g(x,y)>, где F - это векторная функция (выдает вектор <a,b>), а f(x,y) и g(x,y) - скалярные функции от двух переменных. Желательно краткое описание как их лучше отрисовывать.
Вот мой пример:
Option Explicit
Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Dim i As Long, j As Long, k As Long
Dim c As Long
Private Type xPOINTAPI
x As Double
y As Double
End Type
Const nx As Long = 200
Const ny As Long = 200
Dim P(0 To nx * ny) As xPOINTAPI
Private Sub Form_Load()
Timer1.Interval = 50
Me.BackColor = vbBlack
Me.AutoRedraw = True
Me.ScaleMode = 3
Me.Width = 700 * Screen.TwipsPerPixelX
Me.Height = 600 * Screen.TwipsPerPixelY
For i = 1 To nx
For j = 0 To ny - 1
P(ny * j + i).x = i * 10 - 500
P(ny * j + i).y = j * 10 - 500
Next j
Next i
End Sub
Private Function f(ByVal x As Double, ByVal y As Double) As Double
f = 100 / (Abs(y - 300.4) + 40) '
'f = y ^ 3 / 100000000
End Function
Private Function g(ByVal x As Double, ByVal y As Double) As Double
g = ((300 - y) * 0.01) * x * 0.001 '10 / (y + 1) '
'g = -x ^ 2 * y / 100000000
End Function
Private Sub Timer1_Timer()
Cls
For i = 1 To nx * ny
P(i).x = P(i).x + f(P(i).x, P(i).y)
P(i).y = P(i).y + g(P(i).x, P(i).y)
SetPixel Me.hdc, P(i).x, P(i).y, vbWhite
Next i
End Sub
код сляпан быстро - ессно никакой оптимизации
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 14.05.08 08:31
Если у тебя векторное поле, почему ты компоненты вектора по очереди считаешь, а не одновременно?
Номер ответа: 2
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #2
Добавлено: 14.05.08 13:40
Потому что так медленнее
Номер ответа: 3
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #3
Добавлено: 14.05.08 19:37
Потому что очень мало процессоров, по крайней мере одноядерных, умеют вообще что то делать одновременно.
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 15.05.08 06:34
У тебя Y пересчитывается из измененного X, а не из прежнего. Это грубейшая логическая ошибка. Это я и имел ввиду под словом "одновременно".
Номер ответа: 5
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #5
Добавлено: 15.05.08 16:05
О, спасибо за нахождение бага. Наверно буфер решит проблему. Надо будет снова попробывать потыкать поля из учебника по математике...