10-21-2022, 07:10 PM
I have a line detector worked out using the same vector info from the reflection. There are two detections involved. One is to detect how far the ball is from the side of the line, and the other checks the distance from the end of the line. You can see these lines by holding the mouse button, or just check the collision without any lines.
The side checking method uses the vector dot product, which was a calculation already used to get the reflection angle. If this distance (line N in program notes) is less than the ball radius, there is a collision with the line.
The side checking method uses the vector dot product, which was a calculation already used to get the reflection angle. If this distance (line N in program notes) is less than the ball radius, there is a collision with the line.
Code: (Select All)
'vector reflection and line detection demo
'james2464
Screen _NewImage(800, 600, 32)
Const PI = 3.141592654#
Dim c(10) As Long
c(0) = _RGB(30, 30, 30)
c(1) = _RGB(255, 255, 255)
c(2) = _RGB(255, 255, 0)
c(3) = _RGB(255, 0, 0)
c(4) = _RGB(0, 255, 0)
c(5) = _RGB(0, 255, 255)
'0,0 origin
xx = 400
yy = 300
na = 45 'wall starting angle (mouse wheel controlled)
flag = 0
message = 0
Do
_Limit 50
Cls
'=====================================================
mouseclick1 = 0
Do While _MouseInput
na = na + _MouseWheel * 5
Loop
mx% = _MouseX
my% = _MouseY
If mx% < xx - 400 Then mx% = xx - 400
If mx% > xx + 400 Then mx% = xx + 400
If my% < yy - 300 Then my% = yy - 300
If my% > yy + 300 Then my% = yy + 300
lc% = _MouseButton(1)
rc% = _MouseButton(2)
If lc% = -1 Then mouseclick1 = 1
If rc% = -1 Then mouseclick2 = 1
x = 0 - xx + mx%
y = yy - my%
'=====================================================
h = _Hypot(-x, y)
'=====================================================
'origin lines
Line (0, yy)-(800, yy), c(0)
Line (xx, 0)-(xx, 600), c(0)
'=====================================================
Circle (xx + x, yy - y), 39, c(2) 'point I
'=====================================================
nx = Cos(na * (PI / 180)) 'normalize wall angle
ny = Sin(na * (PI / 180)) 'normalize wall angle
dx = -x * ny * -1: dy = y * nx: ndp = dx + dy
'dot product V.N - used to find distance of N
'The distance of N is from the point of origin to the middle of line A
'line A is a line from point I to point R (parallel to the angled wall)
ndpx = Sin(na * (PI / 180)) * ndp
ndpy = Cos(na * (PI / 180)) * ndp
'=====================================================
'calculate point R
th1 = _Atan2(-y, x) 'radian value of ball (point I)
th2 = _Atan2(-ndpy, ndpx) 'radian value of line N
thd = th1 - th2 'find difference
th3 = th2 - thd 'subtract difference from line N
rx = Cos(th3) * h: ry = Sin(th3) * h 'point R position - th3 * length of point I to origin
'=====================================================
'angled wall
a = (Sin(na * .017453292)) * 200
b = (Cos(na * .017453292)) * 200
c(9) = c(1)
'find length of line A
segx = Abs(x - rx)
segy = Abs((yy - y) - (yy + ry))
sega = _Hypot(segx, segy)
'find distance from point I to wall endpoints
i2w1x = Abs(x - b)
i2w1y = Abs(a + y)
i2w2x = Abs(x + b)
i2w2y = Abs(y - a)
i2wh1 = _Hypot(i2w1x, i2w1y)
i2wh2 = _Hypot(i2w2x, i2w2y)
If i2wh1 < i2wh2 Then
i2ws = 1: i2w = i2wh1
Else
i2ws = 2: i2w = i2wh2
End If
If sega < 400 Then
If Abs(ndp) <= 40 Then c(9) = c(3) 'if beside the wall, just check length of line N
Else
If i2w <= 40 Then c(9) = c(3) 'if near the end of the wall, check the radius distance to the wall endpoint
End If
'==========================================================================================
Line (xx, yy)-(xx + b, yy + a), c(9) 'angled wall (collision with ball changes colour)
Line (xx, yy)-(xx - b, yy - a), c(9) 'angled wall (collision with ball changes colour)
If mouseclick1 = 1 Then
Line (xx, yy)-(xx + x, yy - y), c(2) 'line from origin to ball (point I)
Line (xx + x, yy - y)-(xx + rx, yy + ry), c(4) 'line A
Line (xx, yy)-(xx + rx, yy + ry), c(3) 'origin to point R
If sega <= 400 Then
Line (xx, yy)-(xx + ndpx, yy - ndpy), c(5) 'line N
End If
If sega > 400 Then
If i2ws = 1 Then
Line (xx + x, yy - y)-(xx + b, yy + a), c(5)
End If
If i2ws = 2 Then
Line (xx + x, yy - y)-(xx - b, yy - a), c(5)
End If
End If
message = 1
End If
If message = 0 Then
Locate 1, 1
Print "Left click to show lines"
Print "Scroll mouse wheel to rotate"
End If
_Display
If mouseclick2 = 1 Then flag = 1
Loop Until flag = 1