December 04, 2020, 10:50:08 AM

Author Topic: [bb] 2D Particle & Constraints physics with mouse buildmode/interactmode by Jeppe Nielsen [ 1+ years ago ]  (Read 546 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : 2D Particle & Constraints physics with mouse buildmode/interactmode
Author : Jeppe Nielsen
Posted : 1+ years ago

Description : a 2D physics simulation with an interactive demonstration

Code :
Code: BlitzBasic
  1. ;2D Physics by Jeppe Nielsen 2006
  2.  
  3. Graphics3D 800,600,32,2
  4.  
  5. font1=LoadFont("Arial",11)
  6. font2=LoadFont("Courier",10)
  7.  
  8. CreateScene()
  9.  
  10. iterations=10
  11.  
  12. showtext=True
  13.  
  14. Repeat
  15. Cls
  16.  
  17.  
  18. If KeyHit(57)
  19.  
  20.         If mode=0
  21.                
  22.                 PointRemember()
  23.                
  24.         Else
  25.        
  26.                 PointRestore()
  27.                
  28.                 For c.Constraint=Each Constraint
  29.                         ConstraintDisable c,False
  30.                 Next
  31.                                
  32.         EndIf
  33.        
  34.         state=0
  35.  
  36.         hit.Point=Null
  37.         grab.Point=Null
  38.         FlushMouse
  39.         FlushKeys
  40.        
  41.         mode=1-mode
  42.  
  43. EndIf
  44.  
  45.  
  46. mx=MouseX()
  47. my=MouseY()
  48.  
  49.  
  50. Select mode
  51.  
  52. Case 0
  53.  
  54.         Select state
  55.                
  56.                 Case 0
  57.                        
  58.                         If MouseHit(1)
  59.                                
  60.                                 hit.Point=PointHit.Point(mx,my)
  61.                                
  62.                                 grab.Point=hit
  63.                                
  64.                                 remx=mx
  65.                                 remy=my
  66.                                
  67.                                 If grab=Null
  68.                                
  69.                                         point1.Point=PointNew(mx,my)
  70.                                        
  71.                                         grab=point1
  72.                                        
  73.                                         state=1
  74.                                                                                        
  75.                                 Else
  76.                                
  77.                                         state=1
  78.                                                                
  79.                                 EndIf
  80.                                                                        
  81.                         EndIf
  82.                        
  83.                         If MouseHit(2)
  84.                        
  85.                                 hit.Point=PointHit.Point(mx,my)
  86.                        
  87.                                 If hit<>Null
  88.                                
  89.                                         PointLock hit,1-hitlock
  90.                                
  91.                                 Else
  92.                                
  93.                                         grab=Null
  94.                                        
  95.                                         hit=Null
  96.                                        
  97.                                         state=0
  98.                                
  99.                                
  100.                                 EndIf
  101.                        
  102.                        
  103.                         EndIf
  104.                        
  105.                                                
  106.                 Case 1
  107.                
  108.                        
  109.                
  110.                
  111.                         If MouseHit(1)
  112.                        
  113.                                 hit.Point=PointHit.Point(mx,my)
  114.                        
  115.                                 If grab<>Null And hit<>Null And (hit<>grab)
  116.                                                                
  117.                                         constraint.Constraint=ConstraintNew(grab,hit)
  118.                                        
  119.                                 Else
  120.                                
  121.                                         If hit=Null
  122.                                        
  123.                                                 hit.Point=PointNew(mx,my)
  124.                                                
  125.                                                 constraint.Constraint=ConstraintNew(grab,hit)
  126.                                        
  127.                                         EndIf
  128.                                        
  129.                                                
  130.                                 EndIf
  131.                                
  132.                                 grab=Null
  133.                                
  134.                                 state=0
  135.                                
  136.                                 If hit<>Null And (hit<>grab)
  137.                                
  138.                                         grab=hit
  139.                                        
  140.                                         state=1
  141.                                
  142.                                 EndIf
  143.                                        
  144.                                
  145.                         EndIf
  146.                        
  147.                         If MouseHit(2)
  148.                        
  149.                        
  150.                                 grab=Null
  151.                                
  152.                                 hit=Null
  153.                                
  154.                                 state=0
  155.                        
  156.                        
  157.                        
  158.                         EndIf
  159.                        
  160.                         If KeyHit(14) Or KeyHit(211)
  161.                        
  162.                                 If grab<>Null
  163.                                
  164.                                         PointDelete grab
  165.                                        
  166.                                 EndIf
  167.                        
  168.                                 state=0
  169.                        
  170.                         EndIf
  171.  
  172.                        
  173.        
  174.         End Select
  175.  
  176. Case 1
  177.        
  178.         Select state
  179.                
  180.                 Case 0
  181.                        
  182.                         hit.Point=PointHit.Point(mx,my)
  183.                        
  184.                         If hit<>Null
  185.                        
  186.                                 If MouseDown(1)
  187.                                
  188.                                         grab.Point=hit
  189.                                        
  190.                                         MoveMouse grabx,graby
  191.                                        
  192.                                         state=1
  193.                                
  194.                                 EndIf
  195.                        
  196.                         EndIf
  197.                        
  198.                 Case 1
  199.                
  200.                         If MouseDown(1)
  201.                        
  202.                                 If grab<>Null
  203.                        
  204.                
  205.                                         ix#=Float(MouseXSpeed())*0.2
  206.                                         iy#=Float(MouseYSpeed())*0.2
  207.                                
  208.                                         PointImpulse grab,ix,iy
  209.                                        
  210.                                         MoveMouse grabx,graby
  211.                        
  212.                                 EndIf
  213.                                
  214.                         Else
  215.                        
  216.                                 grab=Null
  217.                                
  218.                                 state=0
  219.                                
  220.                         EndIf
  221.        
  222.         End Select
  223.        
  224.        
  225.         time=MilliSecs()
  226.         PointUpdate
  227.         ConstraintUpdate iterations
  228.         physicstime=MilliSecs()-time
  229.        
  230. End Select
  231.  
  232.  
  233.  
  234. Select drawmode
  235.  
  236.         Case 0
  237.  
  238.                 SetFont font1
  239.  
  240.                 ConstraintDraw
  241.                 ConstraintTensionDraw
  242.                 PointDraw
  243.                
  244.         Case 1
  245.        
  246.                 ConstraintDraw
  247.                 PointDraw
  248.  
  249.         Case 2
  250.        
  251.                 SetFont font1
  252.                 ConstraintDraw
  253.                 ConstraintTensionDraw
  254.                
  255.         Case 3
  256.                        
  257.                 ConstraintDraw 
  258.                                
  259.         Case 4
  260.        
  261.                 PointDraw
  262.  
  263. End Select     
  264.  
  265. Color 255,255,255
  266.  
  267. angle#=Float(MilliSecs())/1.0
  268.  
  269. size#=4+Sin(angle)*3
  270.  
  271. Select mode
  272.  
  273.         Case 0
  274.        
  275.                 If grab<>Null
  276.                
  277.                         Oval grabx-size,graby-size,size*2+1,size*2+1,0
  278.                
  279.                 EndIf
  280.        
  281.         Case 1
  282.  
  283.                 If hit<>Null
  284.                
  285.                         Oval hitx-size,hity-size,size*2+1,size*2+1,0
  286.                
  287.                 EndIf
  288.                
  289. End Select
  290.  
  291. SetFont font2
  292.  
  293. wh=GraphicsWidth()/2
  294.  
  295. If showtext=True
  296.  
  297. Text wh,0,"Blitz 2D Physics simulation",1
  298. Text wh,10,"Space to toggle edit/simulation mode",1
  299. Text wh,20,"1, 2, 3, 4, 5 - to set drawing mode :"+(drawmode+1),1
  300. Text wh,30,"Up/down arrow keys - to set simulations iterations :"+iterations,1
  301. Text wh,40,"Physicstime :"+physicstime,1
  302. Text wh,50,"Use mouse to create/edit points and constraints :",1
  303. Text wh,60,"Rightclick a point to make it static, shown in red",1
  304. Text wh,70,"Return to toggle this text",1
  305.  
  306. EndIf
  307.  
  308. If KeyHit(2) Then drawmode=0
  309. If KeyHit(3) Then drawmode=1
  310. If KeyHit(4) Then drawmode=2
  311. If KeyHit(5) Then drawmode=3
  312. If KeyHit(6) Then drawmode=4
  313.  
  314. If KeyDown(208)
  315.  
  316.         iterations=iterations-1
  317.        
  318.         If iterations<1
  319.        
  320.                 iterations=1
  321.        
  322.         EndIf
  323.        
  324. ElseIf KeyDown(200)
  325.  
  326.         iterations=iterations+1
  327.        
  328.        
  329. EndIf
  330.  
  331. If KeyHit(28) Then showtext=1-showtext
  332.  
  333.  
  334. Flip
  335.  
  336. Until KeyDown(1)
  337. End
  338.  
  339.  
  340. Function CreateScene()
  341.        
  342.         i=250
  343.         wh=GraphicsWidth()/2
  344.        
  345.         p1.Point=PointNew(wh-50,100+i)
  346.         p2.Point=PointNew(wh+50,100+i)
  347.        
  348.         p3.Point=PointNew(wh-50,200+i)
  349.         p4.Point=PointNew(wh+50,200+i)
  350.        
  351.         c1.Constraint=ConstraintNew(p1,p2)
  352.         c2.Constraint=ConstraintNew(p2,p3)
  353.         c3.Constraint=ConstraintNew(p3,p4)
  354.         c4.Constraint=ConstraintNew(p4,p1)
  355.         c5.Constraint=ConstraintNew(p1,p3)
  356.         c6.Constraint=ConstraintNew(p2,p4)
  357.        
  358.         f=False
  359.        
  360.         For y#=100 To 300 Step 25
  361.                
  362.                 pp.Point=PointNew(GraphicsWidth()/2,y)
  363.                 If f=False
  364.                        
  365.                         PointLock pp,True
  366.                
  367.                 EndIf
  368.                 If ppp.Point<>Null
  369.                
  370.                         ConstraintNew pp,ppp
  371.                
  372.                 EndIf
  373.                
  374.                 ppp.Point=pp
  375.                
  376.                 f=True
  377.                
  378.         Next
  379.        
  380.         ConstraintNew p1,ppp
  381.        
  382.         CreateWheel(100,200,100,100,12,4)
  383.         CreateWheel(600,200,100,100,5,2)
  384.         CreateWheel(300,200,70,100,10,2)
  385.        
  386. End Function
  387.  
  388. Function CreateWheel(cx,cy,rad1,rad2,points,constraintstep=4)
  389.  
  390.         Local point.Point[100]
  391.        
  392.        
  393.         For po=1 To points
  394.        
  395.                 num=num+1
  396.        
  397.                 a=(360/points)*po
  398.        
  399.                 px=cx+Sin(a)*rad1
  400.                 py=cy+Cos(a)*rad2
  401.                
  402.                 point[num]=PointNew(px,py)
  403.        
  404.         Next   
  405.                
  406.         For n=1 To num
  407.        
  408.                 point1=n
  409.                 point2=n+1
  410.                 If point2>num
  411.                
  412.                         point2=point2-num
  413.                
  414.                 EndIf
  415.                
  416.                 constraintnew(point[point1],point[point2])
  417.        
  418.                 point1=n
  419.                 point2=n+constraintstep
  420.                 If point2>num
  421.                
  422.                         point2=point2-num
  423.                
  424.                 EndIf
  425.                
  426.                 constraintnew(point[point1],point[point2])
  427.        
  428.         Next
  429.        
  430.  
  431.  
  432.  
  433. End Function
  434.  
  435.  
  436.  
  437. Type Point
  438.  
  439.         Field x#,y#
  440.         Field vx#,vy#
  441.         Field mass#
  442.         Field rx#,ry#
  443.         Field lock
  444.         Field rememberx#,remembery#
  445.        
  446. End Type
  447.  
  448. Function PointNew.Point(x#,y#,mass#=1)
  449.  
  450.         p.Point=New Point
  451.        
  452.         PointMove p,x,y
  453.  
  454.         Return p
  455. End Function
  456.  
  457. Function PointDelete(p.Point)
  458.  
  459.         Delete p
  460.        
  461.         ConstraintRefresh
  462.        
  463. End Function
  464.  
  465. Function PointMove(p.Point,x#,y#)
  466.  
  467.         px=x
  468.         py=y
  469.  
  470. End Function
  471.  
  472. Function PointDraw()
  473.  
  474.         For p.Point=Each Point
  475.        
  476.                 If plock=False
  477.                
  478.                         Color 255,255,255
  479.                
  480.                 Else
  481.                
  482.                         Color 255,0,0
  483.                
  484.                 EndIf
  485.  
  486.                 Rect px-2,py-2,5,5,True
  487.        
  488.         Next
  489.  
  490. End Function
  491.  
  492. Function PointImpulse(p.Point,ix#,iy#)
  493.  
  494.         pvx=pvx+ix
  495.         pvy=pvy+iy
  496.  
  497. End Function
  498.  
  499. Function PointUpdate(gravity#=0.5)
  500.  
  501.         For p.Point=Each Point
  502.        
  503.                 PointImpulse p,0,gravity
  504.                
  505.                 pvx=pvx*0.99
  506.                 pvy=pvy*0.99
  507.        
  508.                 If plock=False
  509.        
  510.                         px=px+pvx
  511.                         py=py+pvy
  512.                        
  513.                 EndIf
  514.        
  515.                 PointLimits p
  516.  
  517.        
  518.         Next
  519.  
  520.  
  521.  
  522.  
  523. End Function
  524.  
  525. Function PointLimits(p.Point)
  526.  
  527.         If px<0
  528.  
  529.                 pvx=-pvx*0.5
  530.                 px=0
  531.  
  532.         EndIf
  533.        
  534.         If px>GraphicsWidth()-1
  535.  
  536.                 pvx=-pvx*0.5
  537.                 px=GraphicsWidth()-1
  538.  
  539.         EndIf
  540.  
  541.         If py<0
  542.  
  543.                 pvy=-pvy*0.5
  544.                 py=0
  545.  
  546.         EndIf
  547.        
  548.         If py>GraphicsHeight()-1
  549.  
  550.                 pvy=-pvy*0.5
  551.                 py=GraphicsHeight()-1
  552.  
  553.         EndIf
  554.                
  555. End Function
  556.  
  557. Function PointVelocity(p.Point,vx#,vy#)
  558.  
  559.         pvx=vx
  560.         pvy=vy
  561.  
  562. End Function
  563.  
  564. Function PointLock(p.Point,lock)
  565.  
  566.         plock=lock
  567.         PointVelocity p,0,0
  568.        
  569. End Function
  570.  
  571. Function PointHit.Point(x#,y#,size#=10)
  572.        
  573.         sizesq#=size*size
  574.        
  575.         For p.Point=Each Point
  576.        
  577.                 dx#=x-px
  578.                 dy#=y-py
  579.                
  580.                 d#=dx*dx+dy*dy
  581.                
  582.                 If d<sizesq
  583.        
  584.                         Return p
  585.        
  586.                 EndIf
  587.        
  588.         Next
  589.        
  590. End Function
  591.  
  592. Function PointRemember()
  593.        
  594.         For p.Point=Each Point
  595.        
  596.                 p
  597. ememberx=px
  598.                 p
  599. emembery=py
  600.                
  601.         Next
  602.        
  603. End Function
  604.  
  605. Function PointRestore()
  606.        
  607.         For p.Point=Each Point
  608.        
  609.                 PointVelocity p,0,0
  610.                 PointMove p,p
  611. ememberx,p
  612. emembery
  613.                                        
  614.         Next
  615.        
  616. End Function
  617.  
  618.  
  619. Type Constraint
  620.  
  621.         Field p1.Point
  622.         Field p2.Point
  623.         Field length#
  624.         Field tension#
  625.         Field maxtension#
  626.         Field disable
  627.                
  628. End Type
  629.  
  630. Function ConstraintNew.Constraint(p1.Point,p2.Point,maxtension#=100.0,length#=-1)
  631.  
  632.         If ConstraintSameTest(p1,p2)=True
  633.        
  634.                 Return Null
  635.        
  636.         EndIf
  637.  
  638.         c.Constraint=New Constraint
  639.        
  640.         cp1=p1
  641.         cp2=p2
  642.        
  643.         ConstraintLength(c,length)
  644.         ConstraintTension(c,maxtension)
  645.  
  646.         Return c
  647. End Function
  648.  
  649. Function ConstraintDelete(c.Constraint)
  650.  
  651.         Delete c
  652.  
  653. End Function
  654.  
  655. Function ConstraintSameTest(p1.Point,p2.Point)
  656.  
  657.        
  658.         For c.Constraint=Each Constraint
  659.        
  660.                 If (cp1=p1 And cp2=p2) Or (cp1=p2 And cp2=p1)
  661.                
  662.                         Return True
  663.        
  664.                 EndIf
  665.                
  666.         Next
  667.  
  668.  
  669.  
  670. End Function
  671.  
  672. Function ConstraintLength(c.Constraint,length#=-1)
  673.  
  674.         If length#<=0
  675.  
  676.                 dx#=cp2x-cp1x
  677.                 dy#=cp2y-cp1y
  678.                
  679.                 clength=Sqr(dx*dx+dy*dy)
  680.                
  681.         Else   
  682.  
  683.                 clength=length
  684.  
  685.         EndIf
  686.  
  687. End Function
  688.  
  689. Function ConstraintTension(c.Constraint,maxtension#)
  690.  
  691.         cmaxtension=maxtension
  692.  
  693. End Function
  694.  
  695. Function ConstraintRefresh()
  696.  
  697.         For c.Constraint=Each Constraint
  698.        
  699.                 If cp1=Null Or cp2=Null
  700.                
  701.                         ConstraintDelete c
  702.        
  703.                 EndIf
  704.                
  705.         Next
  706.  
  707. End Function
  708.  
  709. Function ConstraintDraw()
  710.        
  711.        
  712.         For c.Constraint=Each Constraint
  713.                 If cdisable=False
  714.                         tension#=c      ension/cmaxtension
  715.                        
  716.                         If tension>0
  717.                        
  718.                                 green=255-tension*255
  719.                        
  720.                         Else
  721.                        
  722.                                 green=255+tension*255
  723.                        
  724.                         EndIf
  725.                        
  726.                         If green<0
  727.                                
  728.                                 green=0
  729.                                
  730.                         EndIf
  731.                        
  732.                         Color 255,green,green
  733.                                
  734.                         Line cp1x,cp1y,cp2x,cp2y
  735.                
  736.                 EndIf
  737.         Next
  738.  
  739. End Function
  740.        
  741. Function ConstraintTensionDraw()
  742.  
  743.         For c.Constraint=Each Constraint
  744.                 If cdisable=False
  745.                         tension#=c      ension/cmaxtension
  746.                                
  747.                         mx#=(cp1x+cp2x)*0.5
  748.                         my#=(cp1y+cp2y)*0.5
  749.                        
  750.                         wid=StringWidth(Int(tension*100)+"%")
  751.                        
  752.                         Color 0,0,0
  753.                         Rect mx-wid*0.5-2,my-5,wid+4,10,True
  754.                        
  755.                         Color 0,0,255
  756.                         Text mx,my,Int(tension*100)+"%",True,True
  757.                        
  758.                 EndIf
  759.         Next
  760.        
  761. End Function
  762.  
  763. Function ConstraintDisable(c.Constraint,disable)
  764.  
  765.         cdisable=disable
  766.  
  767. End Function
  768.  
  769. Function ConstraintUpdate(iterations=20)
  770.  
  771.         For p.Point=Each Point
  772.        
  773.                 p
  774. x=px
  775.                 p
  776. y=py
  777.        
  778.         Next
  779.        
  780.         For c.Constraint=Each Constraint
  781.        
  782.                 c       ension#=0
  783.        
  784.         Next
  785.        
  786.         For n=1 To iterations
  787.                
  788.                 For c.Constraint=Each Constraint
  789.                         If cdisable=False
  790.                                                        
  791.                                 dx#=cp2x-cp1x
  792.                                 dy#=cp2y-cp1y
  793.                                
  794.                                 l#=Sqr(dx*dx+dy*dy)
  795.                                
  796.                                 nx#=dx/l
  797.                                 ny#=dy/l
  798.                                                
  799.                                 dl#=((l-clength))*0.5
  800.                                
  801.                                 c       ension#=c       ension#+dl*2
  802.                                                                
  803.                                 If cp1lock=False
  804.                                         cp1x=cp1x+dl*nx
  805.                                         cp1y=cp1y+dl*ny
  806.                                         PointLimits cp1
  807.                                 EndIf
  808.                                
  809.                                 If cp2lock=False
  810.                                         cp2x=cp2x-dl*nx
  811.                                         cp2y=cp2y-dl*ny
  812.                                         PointLimits cp2
  813.                                 EndIf
  814.                                
  815.                                
  816.                                                        
  817.                         EndIf
  818.                 Next
  819.                                
  820.         Next
  821.        
  822.         For c.Constraint=Each Constraint
  823.        
  824.                 ;c      ension#=c       ension/iterations
  825.                
  826.                 If c    ension>cmaxtension
  827.                                
  828.                         ConstraintDisable c,True
  829.                        
  830.                 EndIf
  831.  
  832.         Next
  833.        
  834.         For p.Point=Each Point
  835.        
  836.                 pvx=pvx+(px-p
  837. x)
  838.                 pvy=pvy+(py-p
  839. y)
  840.        
  841.         Next
  842.  
  843.  
  844. End Function


Comments :


SillyPutty(Posted 1+ years ago)

 very very cool :)Just incredibly slow for me


Jeppe Nielsen(Posted 1+ years ago)

 It may be all the tension text slowing it down, try pressing 1,2,3,4,5 for different drawing modes. And press return to toggle help text.


Damien Sturdy(Posted 1+ years ago)

 heh, sweet. good timing too- Where did you get the idea from?I wanted to throw together another "Line Racer" program with a bit more added. Not that I have time to do it :(


Subirenihil(Posted 1+ years ago)

 nice


bytecode77(Posted 1+ years ago)

 hey hey some nice work :)i like the wobbeling egg and the hanging thingy


Jerome Squalor(Posted 1+ years ago)

 that is soooooo coool!!!


Santiworld(Posted 1+ years ago)

 thanks for share!, is excelent!!!


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal