Math: Returning X,Y which is 150pixels @45degrees

BlitzMax Forums/BlitzMax Programming/Math: Returning X,Y which is 150pixels @45degrees

pappavis(Posted 2006) [#1]
Hi all

I'd like to know how to calculate the X, Y endpoint value which is nn-degrees from your current X,Y:

StartX=140
StartY=340
TargetAngle: 136 degrees.
DistanceToShoot: 235 pixels.
using a circle a

What will the X, Y value be?
TIA!


Fetze(Posted 2006) [#2]
Is that what you need?

TargetX = Sin(TargetAngle) * TargetDistance
TargetY = -Cos(TargetAngle) * TargetDistance


sswift(Posted 2006) [#3]
Fetze:
You have that backwards. Might work, but this is the more traditional formula:

X# = Radius# * Cos(Angle#)
Y# = Radius# * Sin(Angle#)

With that, angle 0 = right and angle 90 = down. So it goes clockwise from 3 o' clock.

Unless you're doing 2D graphics in which case the Y axis is inverted, (positive is down instead of up) and so it goes counterclockwise instead.

Or maybe I have that backwards. I think I might. Maybe it goes clockwise in 2D and counterclockwise in 3D.... Yeah I think that's what it does. So 90 would be straight up.


H&K(Posted 2006) [#4]
I think yours is backward sswift, I would call 0 right and 90 up. and workit anti clockwise

Each to their own i suppose


TomToad(Posted 2006) [#5]
On a 2D screen, 90 degrees will point down because the Y axis is inverted from standard euler coordinates. When dealing with 3D though, 90 degrees will point up.

So if X = 50 and Y = 50 and you wanted to travel 100 pixels at a 45 degree angle, you'd end up at X = 121 and y = 121 (after rounding) which is below and to the right of the previous position.


Fetze(Posted 2006) [#6]
@sswift
It works. Maybe not like you want your angle, but it works ^^

0° --> up
90° --> right
180° --> down
270 --> left

(On screen)


SculptureOfSoul(Posted 2006) [#7]
For the most part, any combination of sin and cosine will work - it's just that the information you get will be relative to the method you use to get it.

On the other hand, I'm sure there is a recommended standard. I'm assuming that cosine is used for the horizontal factor and sin for the vertical?


pappavis(Posted 2006) [#8]
BTW, i am doing this in 2D from a "top-down" view, no fancy physics or such stuff.

TIA to everyone who contributes. BTW, isnt there in the Maths forum about the problem?


tonyg(Posted 2006) [#9]
pappavis, hasn't Fetze answered this?
Did the suggestion work? That's what I would use.


TomToad(Posted 2006) [#10]
@Fetze: Yes, it works that way, but try converting an x,y value to an angle and rotation. The function Atan2(y,x) assumes you're using standard cartesian and polar coordinate systems inverted on the Y axis, which would be 0 right and 90 down. For consistency sake, it is best to use the same throughout.
So from polar to cartesian"
X = Cos(Angle#)*Distance#
Y = Sin(Angle#)*Distance#

and from cartesian to polar
Angle# = Atan2(Y,X) 'Note that Y comes first
Distance# = Sqr(X*X+Y*Y)



pappavis(Posted 2006) [#11]
Thanks to all who contributed to my question. The following code was the endresult.. Dont mind the c#-style comments.

Look at the function GetXYforTargetAtAngle() down below in the code.


Type clsLijn
    '/// <summary>
    '/// Berken x/y koordinate van 'n doel, starten met jou huidige X/Y.
    '/// </summary>
    '/// <param name="StartX">Die gradehoek waarheen jy wil skiet</param>
    '/// <param name="StartY"></param>
    '/// <param name="intDistance"></param>
    '/// <param name="dblTargetAngle"></param>
    '/// <returns>een objek met x, y koordinaaten</returns>
	Function GetXYforTargetAtAngle:clsLijnPos(StartX:Int, StartY:Int, intDistance:Int, dblTargetAngle:Int)
	
		Local objXY1:clsLijnPos = New clsLijnPos;
		objXY1 = clsLijnPos.Create();
		
		'//normailseer die gradehoek, met cos en tan word die gradehoek oomgebuigd.
		'//dblTargetAngle:-45;
		
		If(dblTargetAngle < 45)
		EndIf
		
		Local dblRadians:Double = Self.GetNormaliseerNaarWareNoord(dblTargetAngle);	'// normailseer naar ware noord in dit geval
		Local dblX:Int = StartX + Int(intDistance * Sin(dblRadians * (Pi / 180)));
		Local dblY:Int = StartY + Int(intDistance * Cos(dblRadians * (Pi / 180)));
		
		objXY1.x = dblX;
		objXY1.y = dblY;
		
		Return objXY1;
	End Function
EndType

Type clsLijnPos
	Field x:Int;
	Field y:Int;
	Field IsNegativeSlope:Byte;
	
	Function Create:clsLijnPos()
		Local objLPos1:clsLijnPos = New clsLijnPos;
		objLPos1.x = 0;
		objLPos1.y = 0;
		objLPos1.IsNegativeSlope = False;
		
		Return objLPos1;
	End Function

	Function GetNormaliseerNaarWareNoord:Double(dblTargetAngle:Int)

		Local dblRadians:Double = 0;

		Try
			dblRadians = (dblTargetAngle - 360) * (Pi / 180);	'// normailseer naar ware noord in dit geval
		Catch Err1:Object
			Throw(Err1.ToString());
		EndTry
		
		Return dblRadians;
		
	EndFunction
EndType