Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Интересные Векторные Поля в Движении Добавлено: 13.05.08 20:57  

Автор вопроса:  Morpheus | Web-сайт: xury.zx6.ru
Здравствуйте все!

Кто-нибудь знает какие-нибудь интересные векторные поля для программирования и способы их отрисовки в движении?
Я вот тут одно сделал быстренько для примера. Но охота что-нибудь покрасивее.

Меня интересуют 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-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 14.05.08 08:31
Если у тебя векторное поле, почему ты компоненты вектора по очереди считаешь, а не одновременно?

Ответить

Номер ответа: 2
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #2
Добавлено: 14.05.08 13:40
Потому что так медленнее =)

Ответить

Номер ответа: 3
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 14.05.08 19:37
Потому что очень мало процессоров, по крайней мере одноядерных, умеют вообще что то делать одновременно.

Ответить

Номер ответа: 4
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 15.05.08 06:34
У тебя Y пересчитывается из измененного X, а не из прежнего. Это грубейшая логическая ошибка. Это я и имел ввиду под словом "одновременно".

Ответить

Номер ответа: 5
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #5
Добавлено: 15.05.08 16:05
О, спасибо за нахождение бага. Наверно буфер решит проблему. Надо будет снова попробывать потыкать поля из учебника по математике...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам