Страница: 1 | 2 |
|
Вопрос: Скорость света vs Гравитация
|
Добавлено: 19.05.07 03:23
|
|
Номер ответа: 20 Автор ответа:
ZagZag
![](images/starGold.gif) ![](images/starGold.gif)
ICQ: 295002202 ![номер 295002202](http://wwp.icq.com/scripts/online.dll?icq=295002202&img=5)
Вопросов: 87 Ответов: 1684
|
Профиль | | #20
|
Добавлено: 21.05.07 12:55
|
Вот хотел еще спросить тех кто интересуется космосом, внеземной жизнью и т.п.
Дайте пожалуйста ссылки по этой теме (желательно на русском). Мне это очень интересно.
Еще интересует инфа по физике этих самых частиц.
Вот, написал че-то. Вижу что не так работает. Все частицы должны к белой - свермассивной точке лететь, но они разлетаются кто куда =(
Подскажите, плз что не так делаю.
На форму кнопку cmdStart и пикчур picField
Option Explicit
Private Type ATOM
dblX As Double
dblY As Double
dblXK As Double
dblYK As Double
dblMass As Double
End Type
Private arAtoms() As ATOM
Private Const ATOMS_COUNT As Long = 50
Private Sub cmdStart_Click()
Do Until False
MoveAtoms
  ![;D](./smiles/animated/46.gif) rawAtoms
DoEvents
Loop
End Sub
Private Sub Form_Load()
Dim lngIndex As Long
ReDim arAtoms(1 To ATOMS_COUNT)
For lngIndex = 1 To ATOMS_COUNT
With arAtoms(lngIndex)
.dblMass = 5
.dblX = picField.ScaleWidth / 2 + Rnd * 5 - 2.5
.dblY = picField.ScaleHeight / 2 + Rnd * 5 - 2.5
.dblX = picField.ScaleWidth / 2 + Rnd * 5 - 2.5
.dblY = picField.ScaleWidth / 2 + Rnd * 5 - 2.5
End With
Next
arAtoms(1).dblMass = 50000
arAtoms(1).dblX = 100
arAtoms(1).dblY = 100
End Sub
Private Sub DrawAtoms()
Dim lngIndex As Long, lngCount As Long
Dim bi24BitInfo As BITMAPINFO
Dim iBitmap As Long, iDC As Long
Dim arPixels() As Byte
With bi24BitInfo.bmiHeader
.biBitCount = 32
.biCompression = BI_RGB
.biPlanes = 1
.biSize = Len(bi24BitInfo.bmiHeader)
.biWidth = picField.ScaleWidth
.biHeight = picField.ScaleHeight
End With
ReDim arPixels(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 4)
lngCount = UBound(arPixels)
iDC = CreateCompatibleDC(picField.hdc)
iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&
SelectObject iDC, iBitmap
BitBlt iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, picField.hdc, 0, 0, vbSrcCopy
'CLS
For lngIndex = 1 To lngCount
arPixels(lngIndex) = 0
Next
For lngIndex = 1 To ATOMS_COUNT
With arAtoms(lngIndex)
If CLng(.dblX) > 0 And CLng(.dblY) > 0 And CLng(.dblX) < bi24BitInfo.bmiHeader.biWidth And CLng(.dblY) < bi24BitInfo.bmiHeader.biHeight Then
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 3) = 255
If lngIndex = 1 Then
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 2) = 255
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 1) = 255
End If
End If
End With
Next
SetDIBitsToDevice picField.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, arPixels(1), bi24BitInfo, DIB_RGB_COLORS
  ![;D](./smiles/animated/46.gif) eleteDC iDC
  ![;D](./smiles/animated/46.gif) eleteObject iBitmap
End Sub
Public Sub MoveAtoms()
Dim lngIndex As Long, lngIndex2 As Long
Dim dblXC As Double, dblYC As Double
Dim u As Double, F As Double
For lngIndex = 2 To ATOMS_COUNT
With arAtoms(lngIndex)
.dblX = .dblX + .dblXK
.dblY = .dblY + .dblYK
For lngIndex2 = 1 To ATOMS_COUNT
If lngIndex <> lngIndex2 Then
dblXC = .dblX - arAtoms(lngIndex2).dblX
dblYC = .dblY - arAtoms(lngIndex2).dblY
If (Abs(Round(.dblX)) < 0.00001) And (Abs(Round(.dblY)) < 0.00001) Then
Else
F = .dblMass * arAtoms(lngIndex2).dblMass / (Sqr(.dblX ^ 2 + .dblY ^ 2) + 1)
.dblXK = .dblXK - F * Cos(dblXC) / arAtoms(lngIndex2).dblMass
.dblYK = .dblYK - F * Sin(dblYC) / arAtoms(lngIndex2).dblMass
End If
End If
Next
End With
Next
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub
В модуль
Option Explicit
Public Const BI_RGB = 0&
Public Const DIB_RGB_COLORS = 0 ' color table in RGBs
Public Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Public Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
Public Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As RGBQUAD
End Type
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
Public Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function SetDIBitsToDevice Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Public Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Public Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Надо конечно еще коллизии учитывать, но это в следующей версии
Но летают частицы всеравно замысловато
ЗЫ
Не страдайте плагиатом, проект - опенсорс
Ответить
|
Номер ответа: 24 Автор ответа:
ZagZag
![](images/starGold.gif) ![](images/starGold.gif)
ICQ: 295002202 ![номер 295002202](http://wwp.icq.com/scripts/online.dll?icq=295002202&img=5)
Вопросов: 87 Ответов: 1684
|
Профиль | | #24
|
Добавлено: 22.05.07 15:02
|
Физики-математики, помогите пожалуйста! Только формулу доделать осталось. Незнаю я как быть с ней.
Киньте мануалов что-ли (хотя навряд ли такие есть =( )
Вот код формы. Код модуля приведен выше. (В нем только декларации)
Option Explicit
Private Type ATOM
dblX As Double
dblY As Double
dblXK As Double
dblYK As Double
dblMass As Double
lngColorR As Long
lngColorG As Long
lngColorB As Long
End Type
Private arAtoms() As ATOM
Private arPixels() As Byte
Private Const ATOMS_COUNT As Long = 500
Private bi24BitInfo As BITMAPINFO
Private PIXELS_COUNT As Long
Private Sub cmdStart_Click()
Do Until False
MoveAtoms
  ![;D](./smiles/animated/46.gif) rawAtoms
DoEvents
Loop
End Sub
Private Sub Form_Load()
Dim lngIndex As Long
ReDim arAtoms(1 To ATOMS_COUNT)
Randomize Timer
For lngIndex = 1 To ATOMS_COUNT
With arAtoms(lngIndex)
.dblMass = 100 + (Rnd * 3) * 50
.dblX = picField.ScaleWidth / 2 + Rnd * 10 - 5
.dblY = picField.ScaleHeight / 2 + Rnd * 10 - 5
' .dblX = picField.ScaleWidth / 2 + Rnd * 3 - 2
' .dblY = picField.ScaleWidth / 2 + Rnd * 3 - 2
' .lngColorR = (lngIndex * 20) Mod 256
.lngColorG = .dblMass
' .lngColorB = (lngIndex * 20) Mod 256
End With
Next
With bi24BitInfo.bmiHeader
.biBitCount = 32
.biCompression = BI_RGB
.biPlanes = 1
.biSize = Len(bi24BitInfo.bmiHeader)
.biWidth = picField.ScaleWidth
.biHeight = picField.ScaleHeight
End With
arAtoms(1).dblMass = 255
arAtoms(1).lngColorR = 255
ReDim arPixels(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 4)
PIXELS_COUNT = UBound(arPixels)
End Sub
Private Sub DrawAtoms()
Dim lngIndex As Long
Dim iBitmap As Long, iDC As Long
iDC = CreateCompatibleDC(picField.hdc)
iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&
SelectObject iDC, iBitmap
For lngIndex = 1 To ATOMS_COUNT
With arAtoms(lngIndex)
If CLng(.dblX) > 0 And CLng(.dblY) > 0 And CLng(.dblX) < bi24BitInfo.bmiHeader.biWidth And CLng(.dblY) < bi24BitInfo.bmiHeader.biHeight Then
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 3) = .lngColorR
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 2) = .lngColorG
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 1) = .lngColorB
End If
End With
Next
SetDIBitsToDevice picField.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, arPixels(1), bi24BitInfo, DIB_RGB_COLORS
  ![;D](./smiles/animated/46.gif) eleteDC iDC
  ![;D](./smiles/animated/46.gif) eleteObject iBitmap
End Sub
Public Sub MoveAtoms()
Dim lngIndex As Long, lngIndex2 As Long
Dim dblXC As Double, dblYC As Double
Dim u As Double, F As Double
For lngIndex = 1 To ATOMS_COUNT
With arAtoms(lngIndex)
If CLng(.dblX) > 0 And CLng(.dblY) > 0 And CLng(.dblX) < bi24BitInfo.bmiHeader.biWidth And CLng(.dblY) < bi24BitInfo.bmiHeader.biHeight Then
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 3) = 0
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 2) = 0
arPixels((bi24BitInfo.bmiHeader.biWidth * CLng(.dblY) + CLng(.dblX)) * 4 + 1) = 0
End If
.dblX = .dblX + .dblXK
.dblY = .dblY + .dblYK
For lngIndex2 = 1 To ATOMS_COUNT
If lngIndex <> lngIndex2 Then
dblXC = .dblX - arAtoms(lngIndex2).dblX
dblYC = .dblY - arAtoms(lngIndex2).dblY
If (Abs(Round(.dblX)) < 0.00001) And (Abs(Round(.dblY)) < 0.00001) Then
Else
' F = .dblMass * arAtoms(lngIndex2).dblMass / (Sqr(.dblX ^ 2 + .dblY ^ 2) + 1)
' Sqr ((2 - 2) ^ 2 + (1 - 2) ^ 2)
' F = Sqr((.dblX - arAtoms(lngIndex2).dblX) ^ 2 + (.dblY - arAtoms(lngIndex2).dblY) ^ 2)
F = Sqr((.dblX - arAtoms(lngIndex2).dblX) ^ 2 + (.dblY - arAtoms(lngIndex2).dblY) ^ 2)
.dblXK = .dblXK + F * Cos(dblXC) / arAtoms(lngIndex2).dblMass
.dblYK = .dblYK + F * Sin(dblYC) / arAtoms(lngIndex2).dblMass
End If
End If
Next
End With
Next
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub
Или просто зацените. Я добился очень быстрой скорости работы. Без всяких SetPixel'ей и PSet'ов
Вся проблема в заимодействии частиц между собой, они не "магнитятся" =/
ЗЫ
"http://zagzag.nm.ru/Amazing physics - Антигравитация!.flv" (3,32 МБ)
"http://zagzag.nm.ru/Anti-gravity (magnetic toy) - Реальноая антигравитация в дом условиях!.flv" (637 КБ)
Плеер для этих файлов (YouTube) http://zagzag.nm.ru/flvplayer_setup.exe (1,11 МБ)
КТО-НИБУДЬ КАЧАЛ? Меня впечатлило
Файлы доступны. Если по ссылкам все же не качается, то http://zagzag.nm.ru - листинг директории открыт
Ответить
|
Страница: 1 | 2 |
Поиск по форуму