Страница: 1 |
Вопрос: Интересные Векторные Поля в Движении | Добавлено: 13.05.08 20:57 |
Автор вопроса: ![]() |
Здравствуйте все!
Кто-нибудь знает какие-нибудь интересные векторные поля для программирования и способы их отрисовки в движении? Я вот тут одно сделал быстренько для примера. Но охота что-нибудь покрасивее. Меня интересуют 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 14.05.08 08:31 |
Если у тебя векторное поле, почему ты компоненты вектора по очереди считаешь, а не одновременно? |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 278109632 Вопросов: 42 Ответов: 3949 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 14.05.08 13:40 |
Потому что так медленнее ![]() |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 224 Ответов: 3777 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 14.05.08 19:37 |
Потому что очень мало процессоров, по крайней мере одноядерных, умеют вообще что то делать одновременно. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 15.05.08 06:34 |
У тебя Y пересчитывается из измененного X, а не из прежнего. Это грубейшая логическая ошибка. Это я и имел ввиду под словом "одновременно". |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 224 Ответов: 3777 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 15.05.08 16:05 |
О, спасибо за нахождение бага. Наверно буфер решит проблему. Надо будет снова попробывать потыкать поля из учебника по математике... |
Страница: 1 |
|