ChrisK
asked on
VB5 best route from point A to point B
Not exactly sure how to describe this but I need a formula I believe on how to plot a location of an obect and get it from point A to point B.
For example, I've got a black dot at 0,0...and I want to move him to 46,36 taking the most direct route (a line). If it were straight lines, it would be easy...but how do I do it with diagonals? I know there is some sort of formula for this used in games...I need it :)
For example, I've got a black dot at 0,0...and I want to move him to 46,36 taking the most direct route (a line). If it were straight lines, it would be easy...but how do I do it with diagonals? I know there is some sort of formula for this used in games...I need it :)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
excellent...but what about x on your comment?
I'll try and explain my y = ax + b formula a bit more.
Given 'cartesian coordinates' that is with an x and y axis, you can express a formula for a straight line using the formula
y = ax + b
so for any x co-ordinate you can find the y co-ordinate which corresponds to the line.
In your case you have a line with b = 0 and a = 18/23
so at x = 46 you have y = 36
at x = 23 you have y = 18 so (23,18) is another point on your line.
I don't know if you'd want to use this in your program, one problem is that for a vertical line, a which is the gradient of your line becomes infinite. I just put it in as an afterthought in case it was what you were trying to work out.
Given 'cartesian coordinates' that is with an x and y axis, you can express a formula for a straight line using the formula
y = ax + b
so for any x co-ordinate you can find the y co-ordinate which corresponds to the line.
In your case you have a line with b = 0 and a = 18/23
so at x = 46 you have y = 36
at x = 23 you have y = 18 so (23,18) is another point on your line.
I don't know if you'd want to use this in your program, one problem is that for a vertical line, a which is the gradient of your line becomes infinite. I just put it in as an afterthought in case it was what you were trying to work out.
ASKER
Why wouldn't I want to use this? To me it looks like I can draw an imaginary line from point A to point B and have a dot travel the correct pixel path to those points, which is exactly what I need.
ASKER
If what you say only works for diagonals, that's fine too because then for straight lines I simply check the previous X or Y and make sure one of those matches the new X or Y signifying a straight line. If not, then use the formula you posted. That sounds right don't ya think?
Yes thats true, I was making things too complcated.
The formula works fine for horizontals where a = 0, as you say when x1 = x2 you've got a vertical straight line.
the angle to the horizontal is atn((y2 - y1) / (x2 - x1))
By the way deighton, I can't get the right answer using this bit.
By the way deighton, I can't get the right answer using this bit.
You might me getting an answer in radians, to get back to degrees multiply by 360/(2 * pi)
ASKER
You guys must be mathimaticians :) Could you help out a mathimatically challenged soul by supplying a little example source :) nothing big, just something like here's point A, here's point B, and move a pixel along the path.
Private Sub Command1_Click()
Me.DrawWidth = 4
Call fLine(799, 0, 950, 5000, Me, vbBlack, vbWhite)
End Sub
Private Function fLine(x1 As Long, y1 As Long, x2 As Long, y2 As Long, vObject As Object, lLineColor As Long, lPixelColor As Long)
Dim a As Double
Dim b As Double
Dim dTemp As Double
Dim bPlot As Boolean
Dim x As Double
Dim dLen As Double
Dim xO As Long, yO As Long
'vObject.Line (x1, y1)-(x2, y2), lLineColor
dLen = Sqr((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
a = (y2 - y1) / (x2 - x1)
b = (y1 * (x2 - x1) - x1 * (y2 - y1)) / (x2 - x1)
For x = x1 To x2 Step (x2 - x1) / dLen
y = Int(a * x + b + 0.5)
If Not bPlot Or x <> xO Or y <> yO Then
vObject.PSet (x, y), lLineColor
bPlot = True
xO = x
yO = y
End If
Next
bPlot = False
For x = x1 To x2 Step (x2 - x1) / dLen
y = Int(a * x + b + 0.5)
If x <> xO And y <> yO Or Not bPlot Then
If bPlot Then vObject.PSet (xO, yO), lLineColor
vObject.PSet (x, y), lPixelColor
bPlot = True
xO = x
yO = y
End If
Next
End Function
Me.DrawWidth = 4
Call fLine(799, 0, 950, 5000, Me, vbBlack, vbWhite)
End Sub
Private Function fLine(x1 As Long, y1 As Long, x2 As Long, y2 As Long, vObject As Object, lLineColor As Long, lPixelColor As Long)
Dim a As Double
Dim b As Double
Dim dTemp As Double
Dim bPlot As Boolean
Dim x As Double
Dim dLen As Double
Dim xO As Long, yO As Long
'vObject.Line (x1, y1)-(x2, y2), lLineColor
dLen = Sqr((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
a = (y2 - y1) / (x2 - x1)
b = (y1 * (x2 - x1) - x1 * (y2 - y1)) / (x2 - x1)
For x = x1 To x2 Step (x2 - x1) / dLen
y = Int(a * x + b + 0.5)
If Not bPlot Or x <> xO Or y <> yO Then
vObject.PSet (x, y), lLineColor
bPlot = True
xO = x
yO = y
End If
Next
bPlot = False
For x = x1 To x2 Step (x2 - x1) / dLen
y = Int(a * x + b + 0.5)
If x <> xO And y <> yO Or Not bPlot Then
If bPlot Then vObject.PSet (xO, yO), lLineColor
vObject.PSet (x, y), lPixelColor
bPlot = True
xO = x
yO = y
End If
Next
End Function
ASKER
Thanks...now I kinda understand it.
y = ax + b
then for a line passing thru (x1,y1) and (x2,y2) its
a = (y2 - y1)/(x2 - x1)
b = (y1 * (x2 - x1) - x1 * (y2 - y1))/(x2 - x1)