10-18-2022, 02:00 AM
Well I finally got something that works, although it's just a single reflection. But I finally clued in on what the dot product is used for, and then it was a matter of completing the calculations to the reflection point.
So this is a utility program, using both the mouse to locate the ball and arrow keys to rotate the angled wall.
So this is a utility program, using both the mouse to locate the ball and arrow keys to rotate the angled wall.
Code: (Select All)
'vector reflection demo
'james2464
Screen _NewImage(800, 600, 32)
Const PI = 3.141592654#
Dim Shared x, y, h, dx, dy, nx, ny, na As Single
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)
'0,0 origin
xx = 400
yy = 300
Line (0, yy)-(800, yy), c(0)
Line (xx, 0)-(xx, 600), c(0)
x = 70: y = 90 'ball position
na = 60 'reflecting surface angle
flag = 0
Do
_Limit 10
Cls
'chip starting pos - using mouse
mouseclick1 = 0
Do While _MouseInput
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)
If lc% = -1 Then mouseclick1 = 1
x = 0 - xx + mx%
y = yy - my%
'origin lines
Line (0, yy)-(800, yy), c(0)
Line (xx, 0)-(xx, 600), c(0)
'Locate 3, 1
'Print "Calculations"
'Print "Motion vector I ("; -x; ","; y; ")"
h = _Hypot(-x, y)
'Print h; "(hypot)"
'Print
nx = Sin(na * (PI / 180))
ny = Cos(na * (PI / 180))
'Print "Normal X:"; nx
'Print "Normal Y:"; ny
'Print
'Print "Dot product to find N length"
dx = -x * nx * -1: dy = y * ny
'Print dx; dy
'Print
ndp = dx + dy
'Print "N length (distance from origin to line A"
'Print ndp
'Print
ard = Sqr(h ^ 2 - ndp ^ 2)
'Print "Distance from N-A to R"
'Print ard
'Print "Point R location"
'Print nx * ard; ny * ard
'Print nx * ndp; ny * ndp
w2x = ny * ard: w2y = nx * ard
u2x = nx * ndp: u2y = ny * ndp
rx = w2x + u2x: ry = w2y - u2y
Circle (xx + rx, yy + ry), 10, c(3) 'point R
Line (xx, yy)-(xx + rx, yy + ry), c(3) 'line from origin to point R
'reflecting surface
A = (Sin(na * (PI / 180))) * 200
B = (Cos(na * (PI / 180))) * 200
Line (xx, yy)-(xx + B, yy + A), c(1)
Line (xx, yy)-(xx - B, yy - A), c(1)
Circle (xx + x, yy - y), 10, c(2) 'point I
Line (xx, yy)-(xx + x, yy - y), c(2)
Locate 1, 1
Print "Vector Reflection"
Print "Use up and down arrow keys to rotate wall"
Locate 35, 1
Print "Wall angle:"; na
Locate 1, 70
Print "I ="; x; ","; y;
Locate 35, 70
Print "R ="; Int(rx); ","; Int(-ry)
change_angle1 = uparrowkey
change_angle2 = downarrowkey
_Display
Loop Until flag = 1
Function uparrowkey
uparrowkey = 0
If _KeyDown(18432) Then ' IF up arrow key was pressed
na = na + 1. ' increase reflection angle
uparrowkey = 1 ' record that this happened
End If
End Function
Function downarrowkey
downarrowkey = 0
If _KeyDown(20480) Then ' IF down arrow key was pressed
na = na - 1. ' decrease reflection angle
downarrowkey = 1 ' record that this happened
End If
End Function