forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PureBasic (http://forum.boolean.name/forumdisplay.php?f=90)
-   -   Слипание объектов (http://forum.boolean.name/showthread.php?t=18725)

Devilox 17.11.2013 00:05

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

Код:

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. Проблема решена.

Кирпи4 20.11.2013 21:22

Ответ: Слипание объектов
 
Раз проблема решена, будь добр, напиши решение, вдруг кому пригодится =)

Devilox 21.11.2013 18:46

Ответ: Слипание объектов
 
Да, точно) Вот только не знаю, правильно ли я решил эту проблему, однако всё работает)
Код:

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()\xSp = NEWvxA
          Objects()\ySp = NEWvyA
          Objects()\zSp = NEWvzA 
         
          Objects()\xPos = Objects()\xPos + Objects()\xSp
          Objects()\yPos = Objects()\yPos + Objects()\ySp
          Objects()\zPos = Objects()\zPos + Objects()\zSp
         
          FindMapElement(Objects(),Str(numB))
         
          NEWvxB.f = ((massB - massA) * vxB + 2 * massA * vxA) / (massA + massB)
          NEWvyB.f = ((massB - massA) * vyB + 2 * massA * vyA) / (massA + massB)
          NEWvzB.f = ((massB - massA) * vzB + 2 * massA * vzA) / (massA + massB)     
         
          Objects()\xSp = NEWvxB
          Objects()\ySp = NEWvyB
          Objects()\zSp = NEWvzB
         
          Objects()\xPos = Objects()\xPos + Objects()\xSp
          Objects()\yPos = Objects()\yPos + Objects()\ySp
          Objects()\zPos = Objects()\zPos + Objects()\zSp
        EndIf
      EndIf
    Next
  Next
EndProcedure

Скорость необходимо присваивать сразу обоим телам, а после - отодвигать их на расстояние, равное скорости.


Часовой пояс GMT +4, время: 12:44.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot