Показать сообщение отдельно
Старый 17.11.2013, 00:05   #1
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Слипание объектов

Я написал функцию, описывающую столкновение объектов по закону сохранения импульса. Если заставить объекты двигаться, используя её, то заметно их слипание при преодолении ими определённой скорости.
Это можно как-нибудь исправить?

ProcedureDLL.f dpUpdateCollisions()
  Protected num0.i
  
  For num0 = 0 To (num - 1)
    FindMapElement(Objects(),Str(num0))
    
    Protected numA.i = Objects()\num
    Protected xPosA.f = Objects()\xPos
    Protected yPosA.f = Objects()\yPos
    Protected zPosA.f = Objects()\zPos
    Protected s.f
    
    For numB = 0 To (num - 1)
      FindMapElement(Objects(),Str(numB))
    
      If Not numB = numA
        Protected xPosB.f = Objects()\xPos
        Protected yPosB.f = Objects()\yPos
        Protected zPosB.f = Objects()\zPos
      
        s = Sqr(Pow(xPosA - xPosB,2) + Pow(yPosA - yPosB,2) + Pow(zPosA - zPosB,2))
      
        If s <= 2         
          vxB.f = Objects()\xSp
          vyB.f = Objects()\ySp
          vzB.f = Objects()\zSp
          
          massB.f = Objects()\mass
          
          FindMapElement(Objects(),Str(numA))
          
          vxA.f = Objects()\xSp
          vyA.f = Objects()\ySp
          vzA.f = Objects()\zSp
          
          massA.f = Objects()\mass
          
          NEWvxA.f = ((massA - massB) * vxA + 2 * massB * vxB) / (massA + massB)
          NEWvyA.f = ((massA - massB) * vyA + 2 * massB * vyB) / (massA + massB)
          NEWvzA.f = ((massA - massB) * vzA + 2 * massB * vzB) / (massA + massB) 
          
          Objects()\xPos = Objects()\xPos - Objects()\xSp
          Objects()\yPos = Objects()\yPos - Objects()\ySp
          Objects()\zPos = Objects()\zPos - Objects()\zSp
          
          Objects()\xSp = NEWvxA
          Objects()\ySp = NEWvyA
          Objects()\zSp = NEWvzA      
        EndIf
      EndIf
    Next 
  Next
EndProcedure
P.S. Код ужасен, я знаю.

UPD. Проблема решена.
__________________

Последний раз редактировалось Devilox, 17.11.2013 в 22:58.
(Offline)
 
Ответить с цитированием