## Physics question

Game development specific discussions.
BasicCoder2
Posts: 3403
Joined: Jan 01, 2009 7:03

### Re: Physics question

fig. 4 and fig. 5 and fig. 6 are taken from my latest program where I am using a single rocket motor that can be rotated.
fig. 6 I would suggest is equivalent to your first example where you have two fixed motors with one not firing.
I would suggest that the vector force would be divided up as shown in fig. 3 deltarho
Posts: 2090
Joined: Jan 02, 2017 0:34
Location: UK

### Re: Physics question

With sin(0) = 0, cos(0) = 1, sin(90) = 1 and cos(90) = 0

From second post with beta = 0 we have

towards centre = F
angular momentum = 0

This corresponds to BasicCoder2's fig. 5

With beta = 90 we have

towards centre = 0
angular momentum = F

This corresponds to BsicCoder2's fig. 4

fig. 3 corresponds with the second post.

I cannot see what BasicCoder2's last post is adding more to the conversation than the second post did; or am I missing something?
Posts: 1583
Joined: May 24, 2007 22:10
Location: The Netherlands

### Re: Physics question

deltarho wrote:I cannot see what BasicCoder2's last post is adding more to the conversation than the second post did; or am I missing something?
Neither did I.

As I don't see a real difference between the flying saucer and the borg cube, I expect both to move in y-direction only while rotating. (assuming the thruster fires shortly, like impulse). Working on some code now...

Actually I build a test setup: A piece of wood (40 cm long), hanging on a thin flexible wire (2 m long), with the wire connected to the center so the the piece of wood is exactly balanced. Then I hit it with an wooden spoon firmly, but short "tak". Although difficult to perform accurately, the suspended piece of wood seems to start swinging only in the direction of the wooden spoon movement. Plus rotation.
Last edited by badidea on Jul 18, 2019 22:24, edited 1 time in total.
BasicCoder2
Posts: 3403
Joined: Jan 01, 2009 7:03

### Re: Physics question

deltarho wrote:I cannot see what BasicCoder2's last post is adding more to the conversation than the second post did; or am I missing something?
Neither did I.

As I don't see a real difference between the flying saucer and the borg cube, I expect both to move in y-direction only while rotating. (assuming the thruster fires shortly, like impulse). Working on some code now...

Some nice pictures to reference :) I tend to think visually.

Last night I was watching a documentary about Michael Faraday and how his lack of math limited his genius. Instead it was Maxwell that wrote the famous equations after reading the works of Faraday.

What I was hoping to do next is instead of having keys for linear and angular velocity control of separate rocket engines (which I think they use to work the lunar lander mother module) have keys that swivel the rocket engine and then fire an impulse from the rocket engine with a tap of the space bar to see how it looks. As I alluded to before, like outboard motors on a speed boat.

The borg cube is of course 3d and a lot more complicated. Hitting a circle is the same at any point. The angle you hit a square will depend on the orientation of the square. A frictional contact is also required I think to add angular momentum otherwise the force is entirely through the centre of mass. An attached rocket engine has 100% frictional contact.

Ideally someone who has done a course in math and physics should be able to write the code that can be used in an actual game.
Posts: 1583
Joined: May 24, 2007 22:10
Location: The Netherlands

### Re: Physics question

BasicCoder2 wrote:The borg cube is of course 3d and a lot more complicated.

You are allowed to squeeze to borg cube to a height of nearly nothing :-)

BasicCoder2 wrote:Hitting a circle is the same at any point.

I am not hitting the circle. I have attached engine which shortly applies thrust in y-direction.

BasicCoder2 wrote:The angle you hit a square will depend on the orientation of the square.

I hit the cube perpendicular. Haven't decided between firing a billiard ball at it or a picee of sticky gum.
Posts: 1583
Joined: May 24, 2007 22:10
Location: The Netherlands

### Re: Physics question

dodicat wrote:Here is a general strike.
I have used the property of mass of a disc and moment of inertia of a disc.
...

Looking at you code, but I is a bit hard to follow. Not written for a beauty contest :-)

Code: Select all

`linearimpulse = impulse * Cos(a) / massangularimpulse = impulse * Sin(a) / anginertia`

You assume that linear impulse is in cos(a) direction and angular impulse in sin(a) direction. But that is were a have my doubts, unless simulation pool billiard.
D.J.Peters
Posts: 7838
Joined: May 28, 2005 3:28

### Re: Physics question

dodicat wrote:(The laws of physics apply everywhere), maybe not here.
May be force are not with you if you don't understand :lol:

Again the cross product (d,F) was and is the key

d=direction from center to point of interaction

F = the force acting on the point

In 3D space the result of the cross product is an vector and the most important property of this vector are the magnitude.
if
Speed = magnitude(velocity)/timestep
then
AngularVelocity = magnitude( cross(d, F) ) ' in radiant per second
here from my code:

Code: Select all

` ...' german: Winkelgeschwindigkeit  type tAngularVelocity  as tReal ' = cross(d,F)' german: Drehmoment' Torque is a measure of how much a force acting on an object causes that object to rotate.type tTorque           as tVector ' = angular acceleration... `
The tricky part is only how to get the cross product in 2D space ?
here from my 2d vector class

Code: Select all

`' pseudo cross product last row from 3D cross product !operator \(l as tVector, r as tVector) as tReal  return l.x*r.y - l.y*r.xend operator`
AngularVelocity = magnitude(d \ F) ' "\" overloaded operator for cross product

Joshy

Do you know ?
from: Video Game Physics Tutorial - Part I: An Introduction to Rigid Body Dynamics BasicCoder2
Posts: 3403
Joined: Jan 01, 2009 7:03

### Re: Physics question

badidea wrote:I expect both to move in y-direction only while rotating.

You may be right with an object hitting a Borg ship. The boat and it's motor interacts with the water it is not skidding along a frictionless frozen lake with a rocket for propulsion.
However if there was a rocket engine on the block it would turn with the block and thus change the direction of the force in absolute space?
So to test this you would need to have a rocket of some kind (water bottle with vinegar and baking soda dissolved in water?) and a low friction setup such as a disc on an ice rink.
dodicat
Posts: 5988
Joined: Jan 10, 2006 20:30
Location: Scotland

### Re: Physics question

dodicat wrote:Here is a general strike.
I have used the property of mass of a disc and moment of inertia of a disc.
...

Looking at you code, but I is a bit hard to follow. Not written for a beauty contest :-)

Code: Select all

`linearimpulse = impulse * Cos(a) / massangularimpulse = impulse * Sin(a) / anginertia`

You assume that linear impulse is in cos(a) direction and angular impulse in sin(a) direction. But that is were a have my doubts, unless simulation pool billiard.

When the angle is zero all goes into the linear, so cos.
When the angle is 90 all goes into the turning so sin.
To use a cross product in I just add a .z component.
I only use the vector products here to deduce an angle in the range 0 to 360.
The cross product uses a bit more cpu, but with the cross product the dot product is not really needed to return an angle.
Angle example:

Code: Select all

`  Type pt    As Single x,y,zEnd TypeFunction length(p1 As pt) As Single    Return Sqr( (p1.x)^2 + (p1.y)^2+ (p1.z)^2)End FunctionFunction unit(p1 As pt) As pt  '=normalize    Dim As Single L=length(p1)    Return Type(p1.x/L,p1.y/L,p1.z/L)End Function#define dround(n,places) mid((str(int((n)*10^(places)+.5)/10^(places))),1,instr(ltrim(str((n)),"-"),".")+(places)+1)#define onscreen (mx>0) and (mx<xres) and (my>0) and (my<yres)#define incircle(cx,cy,radius,x,y) (cx-x)*(cx-x) +(cy-y)*(cy-y)<= radius*radiusConst pi=4*Atn(1)Function cross(v1 As pt,v2 As pt) As pt '|cross product|= |v1| * |v2| *sin(angle between v1 and v2)    Return Type(v1.y*v2.z-v2.y*v1.z,-(v1.x*v2.z-v2.x*v1.z),v1.x*v2.y-v2.x*v1.y)End FunctionFunction getangle(p() As pt) As Single    Dim As pt L1=(p(1).x-p(2).x,p(1).y-p(2).y)'leg 1    Dim As pt L2=(p(3).x-p(2).x,p(3).y-p(2).y)'leg 2    Dim As Single angle=Asin(length(cross(unit(L1),unit(L2))))*(180/pi)'angle between legs in degrees    If cross(l1,l2).z>0 Then angle=360-angle    Return angleEnd Function#macro displayangle=getangle(p())ScreenlockClsColor 15Draw String (20,20), "Drag circles by leftmouse button"Color 3Draw String (20,40), "Angle from red to green line (clockwise) in degrees"Color 15For z As Long=1 To 3    Circle (p(z).x,p(z).y),5,7,,,,fNextLine(p(2).x,p(2).y)-(p(1).x,p(1).y),2Line(p(2).x,p(2).y)-(p(3).x,p(3).y),4Color 3Draw String(p(2).x+20,p(2).y),Iif(Instr(dround(angle,2),"."),Rtrim(dround(angle,2),"0"),dround(angle,2))+chr(248)Screenunlock#endmacro#macro mouse(m)Dim As Long x=mx,y=my,dx,dyWhile mb = 1    Display():Sleep 1,1    Getmouse mx,my,,mb    If onscreen Then        If mx<>x Or my<>y  Then            dx = mx - x            dy = my - y            x = mx            y = my            p(m).x=x+dx            p(m).y=y+dy        End If    End IfWend#endmacroScreen 19Dim As Integer xres,yresScreeninfo xres,yresDim As pt p(1 To 3)={(100,100),(300,200),(200,400)} 'arbitary starting pointsDim As Integer mx,my,mbdim as single angleDo        Getmouse(mx,my,,mb)    display:Sleep 1,1    For n As Long=1 To 3        If incircle(p(n).x,p(n).y,10,mx,my) And mb=1 Then            mouse(n)        End If    Next nLoop Until Len(Inkey)`
dodicat
Posts: 5988
Joined: Jan 10, 2006 20:30
Location: Scotland

### Re: Physics question

BasicCoder2 wrote:
badidea wrote:I expect both to move in y-direction only while rotating.

You may be right with an object hitting a Borg ship. The boat and it's motor interacts with the water it is not skidding along a frictionless frozen lake with a rocket for propulsion.
However if there was a rocket engine on the block it would turn with the block and thus change the direction of the force in absolute space?
So to test this you would need to have a rocket of some kind (water bottle with vinegar and baking soda dissolved in water?) and a low friction setup such as a disc on an ice rink.

A sailing ship can move into the wind (Move towards the force)
If you put a spoon on a level table (curved side up) and force directly down on it with a pencil, the spoon will move at 90 degrees along the table to your force.
If you now put a book under the table thus tilting it up, and force the pencil directly down on the spoon will now ride up the table.
So the spoon has a motion component in the opposite direction to the force moving it.

But these two examples need a third interaction, the sea and the table.
I don't think you have a third thing in space.
On your own out there you could be stuck in the one place no matter how much you thrashed around.
Posts: 1583
Joined: May 24, 2007 22:10
Location: The Netherlands

### Re: Physics question

BasicCoder2 wrote:However if there was a rocket engine on the block it would turn with the block and thus change the direction of the force in absolute space?
So to test this you would need to have a rocket of some kind (water bottle with vinegar and baking soda dissolved in water?) and a low friction setup such as a disc on an ice rink.

Yes, I understand that the direction eventually changes, but the key part of my original question was an thruster firing shortly. The reason for this is that the game will run in small time steps (milliseconds). For each small time step the physics need to be correct. The game does not know yet what the situation will be in the next time step.

With Joshy's 'd' I think I can solve the problem, roughly:
* Add center mass + the apparent mass (by the moment of inertia and this distance d)
* Determine a and (acceleration and velocity vector)where the force is acting
* Determine change in position and rotation
* Next time step
Something like that, to be worked out further...

dodicat wrote:I don't think you have a third thing in space.

Certainly, no tables and spoons in space :-)
BasicCoder2
Posts: 3403
Joined: Jan 01, 2009 7:03

### Re: Physics question

dodicat wrote:On your own out there you could be stuck in the one place no matter how much you thrashed around.

Posts: 1583
Joined: May 24, 2007 22:10
Location: The Netherlands

### Re: Physics question

Looks like a useful resource. I will be camping for the next 2 weeks, so don't expect much coding progress from me, but I can at least read this on my phone and make some notes.
dodicat
Posts: 5988
Joined: Jan 10, 2006 20:30
Location: Scotland

### Re: Physics question

Happy camping.

Code: Select all

`  Const pi=4*Atn(1)Const BoxSize=100Const systemconstant=1/boxsize #define incircle(cx,cy,radius,x,y) (cx-x)*(cx-x) +(cy-y)*(cy-y)<= radius*radius#define onscreen (mx>0) and (mx<xres) and (my>0) and (my<yres)Type pt    As Double x,y,zEnd TypeRedim Shared As pt msg()Operator -(p1 As pt,p2 As pt) As ptReturn Type(p1.x-p2.x,p1.y-p2.y)End OperatorOperator +(p1 As pt,p2 As pt) As ptReturn Type(p1.x+p2.x,p1.y+p2.y)End OperatorOperator *(f As Single,p As pt) As ptReturn Type(f*p.x,f*p.y)End OperatorFunction length(p1 As pt,p2 As pt) As Single    Dim As Single diffx=p1.x-p2.x,diffy=p1.y-p2.y    Return Sqr(diffx*diffx+diffy*diffy)End FunctionFunction unit(p1 As pt) As pt    #define lngth(p)  Sqr( (p1.x)^2 + (p1.y)^2+ (p1.z)^2)    Dim As Single L=lngth(p1)    Return Type(p1.x/L,p1.y/L,p1.z/L)End FunctionFunction dot(v1 As pt,v2 As pt) As Single 'dot product |v1| * |v2| *cos(angle between v1 and v2)    Return v1.x*v2.x+v1.y*v2.y+v1.z*v2.zEnd FunctionFunction cross(v1 As pt,v2 As pt) As pt '|cross product|= |v1| * |v2| *sin(angle between v1 and v2)    Return Type(v1.y*v2.z-v2.y*v1.z,-(v1.x*v2.z-v2.x*v1.z),v1.x*v2.y-v2.x*v1.y)End FunctionFunction getangle(p() As pt) As Single    Dim As pt L1=(p(1).x-p(2).x,p(1).y-p(2).y)'leg 1    Dim As pt L2=(p(3).x-p(2).x,p(3).y-p(2).y)'leg 2    Dim As Single angle=Acos(dot(unit(L1),unit(L2)))*(180/pi)'angle between legs in degrees    If cross(l1,l2).z>0 Then angle=360-angle    Return angleEnd Function'=========================Function inpolygon(p1() As Pt,Byval p2 As Pt) As Long    #macro Winder(L1,L2,p)    ((L1.x-L2.x)*(p.y-L2.y)-(p.x-L2.x)*(L1.y-L2.y))    #endmacro    Dim As Integer index,nextindex,k=Ubound(p1)+1,wn    For n As Integer=1 To Ubound(p1)        index=n Mod k:nextindex=(n+1) Mod k        If nextindex=0 Then nextindex=1        If p1(index).y<=p2.y Then            If p1(nextindex).y>p2.y Andalso  Winder(p1(index),p1(nextindex),p2)>0 Then wn+=1        Else            If p1(nextindex).y<=p2.y Andalso Winder(p1(index),p1(nextindex),p2)<0 Then wn-=1        End If    Next n    Return wnEnd FunctionSub drawpolygon(b() As pt,p() As Pt,rotmsg() As pt,Byref col As Ulong,Byval im As Any Pointer=0)     Dim k As Long=Ubound(p)+1    Dim As Long index,nextindex    Dim As Long cx,cy    For n As Long=1 To Ubound(p)        cx+=p(n).x:cy+=p(n).y        index=n Mod k:nextindex=(n+1) Mod k        If nextindex=0 Then nextindex=1        Line im,(p(index).x,p(index).y)-(p(nextindex).x,p(nextindex).y),col    Next    cx/=Ubound(p):cy/=Ubound(p)    Paint (cx,cy),col,col    For n As Long=Lbound(rotmsg) To Ubound(rotmsg)        Pset(rotmsg(n).x,rotmsg(n).y),rotmsg(n).z'rgb(200,0,0)    Next nEnd SubFunction rotate(pivot As pt,p As pt,a As Single,d As Single=1) As pt    Return Type<pt>(d*(Cos(a)*(p.x-pivot.x)-Sin(a)*(p.y-pivot.y)) +pivot.x,_    d*(Sin(a)*(p.x-pivot.x)+Cos(a)*(p.y-pivot.y)) +pivot.y)End FunctionSub setUpPolygon(b() As pt,sz As Long,x As Long,y As Long,num As Long)    Redim b(1 To num)    Dim As Long ctr    For n As Single=0 To 3*pi Step 2*pi/num        ctr+=1        If ctr>num Then Exit For        b(ctr).x=x+sz*Cos(n)        b(ctr).y=y+sz*Sin(n)    Next nEnd SubSub turnpolygon(b() As pt,rot() As pt,rotmsg() As pt,a As Single,f As pt,translate As pt)     For n As Long=Lbound(rot) To Ubound(rot)        rot(n)= rotate(f,b(n),a)        rot(n)+=translate    Next n    For n As Long=Lbound(rotmsg) To Ubound(rotmsg)        rotmsg(n)= rotate(f,msg(n),a)        rotmsg(n)+=translate        rotmsg(n).z=msg(n).z    Next n    End SubFunction movepolygon(b() As pt,msg() As pt,dirn As pt) As pt    Dim As pt p    For n As Long=Lbound(b) To Ubound(b)        b(n).x+=dirn.x        b(n).y+=dirn.y        p.x+=b(n).x        p.y+=b(n).y 'get centre    Next    For n As Long=Lbound(msg) To Ubound(msg)'move message        msg(n).x+=dirn.x        msg(n).y+=dirn.y    Next        Dim As Long size=Ubound(b)-Lbound(b)+1    Return Type(p.x/size,p.y/size)End FunctionFunction shortline(fp As pt,p As pt,Ln As Long) As pt 'line of ln length    Dim As Single diffx=p.x-fp.x,diffy=p.y-fp.y    Dim As Single L=Sqr(diffx*diffx+diffy*diffy)    Return Type(fp.x+Ln*diffx/L,fp.y+Ln*diffy/L)End FunctionFunction drawline(x As Long,y As Long,angle As Single,dist As Long) As pt'line by angle    Var x2=x+dist*Cos(angle)    Var y2=y+dist*Sin(angle)    Return Type(x2,y2)End Function'all the linesFunction lineto(c As pt,_out As pt,p2() As pt,dirn As pt,Byref strike As Long,b() As pt) As Single    Var L=length(p2(1),p2(2))    Var ang=Atan2(p2(2).y-p2(1).y,p2(2).x-p2(1).x)    Dim As pt p=p2(1)    Dim As Long ic,ctr    Do        p=shortline(p,p2(2),1)        ic=inpolygon(b(),p)        ctr+=1        If ic Then strike=1 Else strike=0    Loop Until ic Or ctr>L 'when it hits the box at p        Line(p.x,p.y)-(p2(1).x,p2(1).y),Rgb(0,200,0) 'surface to the red point        If strike Then  Line(c.x,c.y)-(p.x,p.y)        Dim As pt eq=drawline(c.x,c.y,ang,-200)    Dim As pt q=Type(c.x,c.y)    ctr=0    Do        q=shortline(q,eq,1)        ic=inpolygon(b(),q)        ctr+=1    Loop Until ic=0 Or ctr>400 'when exits the box at q    If strike Then Line(c.x,c.y)-(q.x,q.y)    Dim As pt pp(1 To 3)={c+(c-q),c,c+(c-p)} 'array to hold three points (two legs metting at t)    _out=p          'out the intersection wth box    dirn=unit(p-c)  'out the direction        Dim As pt d=.3333*(p+q+c)'to show the angle    Dim As Single angle=getangle(pp())    If strike Then Draw String(d.x,d.y),Str(Int(angle))    Return angle*pi/180 'return in radiansEnd FunctionFunction Regulate(Byval MyFps As Long,Byref fps As Long=0) As Long    Static As Double timervalue,_lastsleeptime,t3,frames    Var t=Timer    frames+=1    If (t-t3)>=1 Then t3=t:fps=frames:frames=0    Var sleeptime=_lastsleeptime+((1/myfps)-T+timervalue)*1000    If sleeptime<1 Then sleeptime=1    _lastsleeptime=sleeptime    timervalue=T    Return sleeptimeEnd FunctionSub HandleRain(rain As Any Ptr)    Var max=100    Static As Single xx(max),yy(max)    For i As Long = 0 To max        xx(i) = Rnd*1024        yy(i) = Rnd*768        Put(xx(i),yy(i)),Rain,Alpha,200+Rnd*50    NextEnd Sub#macro displayflag2=0ScreenlockClsDraw String(20,20),"Move the small circles by mouse"Draw String(20,50),"Press spacebar for impulse"Draw String(20,80),"Right mouse click to reset"Draw String(20,110),"Angular speed " &abs(angularimpulse*180/pi)Draw String(20,140),"Linear speed " &speedDraw String(20,170),"framerate = " &fps,Rgb(0,200,0)pivot=movepolygon(b(),msg(),Type(dx,dy))turnpolygon(b(),rot(),rotmsg(),-turn,pivot,Type(dx,dy))drawpolygon(b(),rot(),rotmsg(),Rgb(0,100,255))'draw the polygon and return the centrec=Type<pt>(xres\2,yres\2) 'centre If flag=0  Then    Locate 15    Print "     weight "; impulse    flag2=1    a=  lineto(c,_out,p2(),dirn,strike,rot()) 'a=angle return as shown in radiansEnd IfIf Len(Inkey) And flag2 And strike Then    flag=1    linearimpulse=impulse*Cos(a)/mass    If a>pi/2 And a<3*pi/2 Then dirn=-1*dirn    dx=-dirn.x*linearimpulse    dy=-dirn.y*linearimpulse    angularimpulse=impulse*Sin(a)/anginertia    speed=Sqr(dx*dx+dy*dy) 'to show value on screenEnd IfFor z As Long=1 To 2 'the two drag spots    Dim As Ulong clr=Iif(z=1,Rgb(200,0,0),Rgb(0,200,0))    Circle (p2(z).x,p2(z).y),5,clr,,,,fNextIf flag=0 Then impulse=length(p2(1),_out) 'arbitrary weight as a function of mouse potitionturn+=angularimpulsehandlerain(rain)ScreenunlockSleep regulate(60,fps),1'====================#endmacro#macro mouse(m)Scope    Dim As Long x=mx,y=my,dx2,dy2    While btn = 1 Or btn=2        Display        Getmouse mx,my,,btn        If onscreen Then            If mx<>x Or my<>y  Then                dx2 = mx - x                dy2 = my - y                x = mx                y = my                p2(m).x=x+dx2                p2(m).y=y+dy2            End If        End If    WendEnd Scope#endmacroSub MakeMsg(msg() As pt,xres As Long,yres As Long)    Cls    Redim msg(0)    Print " Gone"+Chr(10)+"Fishing"    Dim As Long ctr    Var c=Point(1,1)    For x As Long=0 To 60        For y As Long=0 To 45            If Point(x,y)<>c Then                ctr+=1                Redim Preserve msg(1 To Ubound(msg)+1)                msg(Ubound(msg))=Type(x+xres/2,y+yres/2,Rgb(.75*ctr,255-.75*ctr,ctr/6))                            End If        Next    NextEnd SubFunction pickanumber As Long    Cls    Locate 12    Print "click a number"    #define map(a,b,_x_,c,d) ((d)-(c))*((_x_)-(a))/((b)-(a))+(c)    Dim As Long mx,my,mb,ret    Do        Getmouse mx,my,,mb        Locate 15        If my>220 And my<235 Then             Color ,Rgb(100,0,0)            var n=Int(map(5,655,mx,3,30))            If mx<675 Then Print Tab(90);"Choose  ";n;" ?"            If mb Then ret=map(0,660,mx,3,30)        Else            Color ,Rgb(0,0,0)        End If        Locate 15        For n As Long=3 To 30            Print Right("0"+Str(n),2)+" ";        Next        Print        sleep 10    Loop Until ret    Color ,Rgb(0,0,0)    Return retEnd FunctionScreen 20,32Dim As Integer xres,yresScreeninfo xres,yresDim As Single dx,dy,a,turn,angularimpulse,impulse,linearimpulse,speedDim As Single massDim As Single anginertiaDim As Long mx,my,btn,flag,flag2,fps,strikeDim As pt cDim As pt _out,p2(1 To 2)={(200,200),(650,500)},dirnRedim As pt b()Dim As Long numsidesstart:numsides=pickanumber                       'area of a regular polygon mass= systemconstant*boxsize^2*numsides*sin(2*pi/numsides)/2                        'moment of inertia of a regular polygonanginertia=systemconstant*((mass*boxsize^2)/6)*(1+2*(Cos(pi/numsides)^2))MakeMsg(msg(),xres-40,yres-40)'create a string messagesetUpPolygon(b(),boxsize*Sqr(2),xres\2,yres\2,numsides)Redim As pt rot(Lbound(b) To Ubound(b))       'to hold rotated shapeRedim As pt rotmsg(Lbound(msg) To Ubound(msg))''to hold rotated messageDim As pt pivotDim As Any Ptr Rain=Imagecreate(5,20)Line rain,(0,0)-(5,20),Rgb(50,50,55)Do    Getmouse mx,my,,btn    strike=0    display        For n As Long=1 To 2        If incircle(p2(n).x,p2(n).y,10,mx,my) And btn=1 And flag2=1  Then            mouse(n)        End If    Next n        If btn=2 Or pivot.x<BoxSize  Or pivot.x>xres-BoxSize Or pivot.y<BoxSize Or pivot.y>yres-BoxSize Then 'reset        Screenunlock        sleep 1        dx=0        dy=0        a=0:flag=0        angularimpulse=0        speed=0        turn=0        Goto start    End IfLoop Until Multikey(1)Imagedestroy rainSleep`
Last edited by dodicat on Jul 20, 2019 7:46, edited 1 time in total.
deltarho
Posts: 2090
Joined: Jan 02, 2017 0:34
Location: UK

### Re: Physics question

@dodicat

I am having problems running some of your code. Your very first code is working fine as is you code where we can drag & drop one of three circles. However, every other code where we should be able to drag & drop either the red or green circle sees the CPU max out on a core, I have four plus hyperthreading, and the Windows busy icon is displayed. The Task Manager displays 'not responding'. Eventually the system settles down but the circle that I dragged does not end up where I expected it to be and sometimes is off-screen.

I would have a bash at debugging but my graphics knowledge is woefully poor.

If anyone else is having issues please shout up so that we can eliminate my machine from any enquiries.

Ta much. <smile>