Rotating XYs

Fish_HF
03-21-2002, 04:19 AM
I need a function like this :

Public Type XY
X As Long
Y As Long
End Type

Function RotateXY(Center as XY, Angle as long, PointToRotate as XY) as XY
'??
End fuction

'Dim Cen,Point as XY
'Cen.X = 2
'Cen.Y = 2
'Point.X = 2
'Point.Y = 1
'RotateXY(Cen, 90, Point).X will return 3
'RotateXY(Cen, 90, Point).Y will return 2

Help me make the "RotateXY" function, thanks :)

Banjo
03-21-2002, 05:38 AM
You need to use Trigonometry.

Calculate the distance between point and centre
Calculate the angle between the point and some arbitrary zero line (common values are up or right).
Add the rotation angle
Calculate the new x and y positions based on the length previous calculated.

If you have no idea about how to do any of that then I'd suggest you get a Trig book and read carefully.

Fish_HF
03-21-2002, 06:02 AM
Can you write the code for me please? :D

Banjo
03-21-2002, 06:36 AM
Er, NO! Try here www.rentacoder.com

Fish_HF
03-21-2002, 06:39 AM
Please:(

Banjo
03-21-2002, 06:47 AM
No. If you don't know trig then you should really give up on the idea of writing a game of this sort until you have learnt it. The concepts involved (sin, cos, etc.) are some of the most basic in the games field. You will need them to progress and I would not be doing you any favours by allowing you to skip them. It would just come back to bite you later.

Iceplug
03-21-2002, 07:18 AM
Not to mention that the code only requires a small bit of trigonometry.

BillSoo
03-21-2002, 09:53 AM
You should be able to find lots of examples of rotation if you do a bit of searching....

I had to implement rotation as part of my Kaleidescope program that I posted on PlanetSourceCode for instance...

John
03-21-2002, 10:44 AM
That Kaleidescope (http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=12132&lngWId=1) is most impressive BillSoo! Really cool stuff.

Orbity

Fish_HF
03-21-2002, 10:10 PM
Kaleidescope's screenshot looks impresssive...

Fish_HF
03-21-2002, 10:38 PM
Like this?

Public Type XY
X As Long
Y As Long
End Type

Function RotateXY(Center as XY, Angle as long, PointToRotate as XY) as XY
Dim Temp as XY
Temp = PointToRotate
PointToRotate.X = PointToRotate.X - Center.X
PointToRotate.Y = PointToRotate.Y - Center.Y
RotateXY.X = (PointToRotate.X * cos(Angle) - PointToRotate.Y * sin(Angle)) + Temp.X
RotateXY.Y = (PointToRotate.X * sin(Angle) + PointToRotate.Y * cos(Angle)) + Temp.Y
'does this formula defaults the center to be 0,0 ?
'I'm rushing, so it may be wrong
End fuction

andreww
03-22-2002, 06:07 AM
how can you not know trig....

all you really need is to know how to use cos...sin

x=cos(radian)*radius
y=sin(radian)*radius

all radius does is decide how far to move the point around the Origin or wherever

if you dont want to have the main point at origin
just add where you want it to the x,y

BillSoo
03-22-2002, 09:57 AM
The basic method for rotating a Point around a Centre is:

a) convert the cartesian coordinates of the point to polar coordinates (ie. angle and radius)

b) add the angle you wish to rotate

c) convert the polar coordinates back to cartesian coordinates.

As AndrewW shows, the last part is easy. Just use the sin and cos functions to convert.

x = cos(angle) * radius + centre.X
y = sin(angle) * radius + centre.Y

The second step is easy too. Just add the angle you wish to rotate.

Which leaves the first step....this isn't too hard but it can be tricky because each of the 4 quadrants is slightly different.

Here is the GENERAL case:

angle=atan((point.y-centre.y)/(point.X - centre.X))
radius = sqr((point.x-centre.x)^2+(point.Y-centre.Y)^2)

One obvious problem, if the line is vertical (ie. 90 degrees) then point.X = centre.X and you have a division by 0 error. So you should handle this special case separately.

Iceplug
03-22-2002, 10:23 AM
angle=atan((point.y-centre.y)/(point.X - centre.X))
I think that's atn((point.y-centre.y)/(point.x - centre.X))....

Welcome back!:cool:

BillSoo
03-22-2002, 12:40 PM
True...

Here's some code for a true ArcTangent function I got in the vb sourcebook



Public Function ArcTangent( _
ByVal dblIn As Double, _
ByVal dblIn2 As Double) _
As Double
' Comments : Returns the inverse tangent of the supplied numbers.
' Note that both values cannot be zero.
' Parameters: dblIn - First value
' dblIn2 - Second value
' Returns : Inverse tangent as a double
' Source : Total VB SourceBook 6
'
Const cdblPI As Double = 3.14159265358979

On Error GoTo PROC_ERR

Select Case dblIn

Case 0

Select Case dblIn2
Case 0
' Undefined
ArcTangent = Null
Case Is > 0
ArcTangent = cdblPI / 2
Case Else
ArcTangent = -cdblPI / 2
End Select

Case Is > 0
If dblIn2 = 0 Then
ArcTangent = 0
Else
ArcTangent = Atn(dblIn2 / dblIn)
End If
Case Else
If dblIn2 = 0 Then
ArcTangent = cdblPI
Else
ArcTangent = (cdblPI - Atn(Abs(dblIn2 / dblIn))) * Sgn(dblIn2)
End If
End Select

PROC_EXIT:
Exit Function

PROC_ERR:
MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
"ArcTangent"
Resume PROC_EXIT

End Function



It takes 2 inputs, deltaX and deltaY, so it can figure out which quadrant you are in and process the data appropriately.

Teric
03-22-2002, 02:51 PM
So, BillSoo--

You're saying that one could use this custom Arc Tangent function to convert cartesian coordinates into polar coordinates?

Could you give a small example to elaborate? Thanks.

BillSoo
03-22-2002, 03:15 PM
Well, suppose you had something like:


type Point
X as long
Y as long
end type

dim centre as Point
dim pt as Point
dim delta as double 'angle you wish to rotate
dim theta as double 'starting/ending angle
dim radius as double

centre.X = 10
centre.Y = 22

pt.X = 20
pt.Y = 9

delta = 5 * 3.14159265359 / 180# 'convert 5 degrees to radians
'since all functions require radians rather than degrees

theta = ArcTangent((pt.X - centre.X),(pt.Y - centre.Y))

radius = SQR((pt.X-centre.X)^2+(pt.Y-centre.Y)^2) 'good old pythagoras

theta = theta + delta 'add 5 degrees to the original angle

pt.X = cos(theta) * radius + centre.X
pt.Y = sin(theta) * radius + centre.Y


Point PT should now have been rotated 5 degrees around Point Centre.

Iceplug
03-22-2002, 03:41 PM
Very interesting. I could've wrote something like that. But I didn't;) . I like this function! [Added to lib] :cool:

BillSoo
03-22-2002, 03:57 PM
I've written stuff like that in the past but it's always a pain to find later. This Total Sourcebook code library we bought has fairly common stuff in it, but at least it's well organized.

Iceplug
03-22-2002, 04:01 PM
Would code like this be suitable in the code library (where I can't post)? <--Almost forgot my question mark:cool:
I've found myself knowing what Pi is to 8 decimal places without even trying. 3.1415926 OK 7!:D

BillSoo
03-22-2002, 04:09 PM
Yessss....I guess it would. But it's probably not a good idea to post the exact ArcTangent function I copied from the SourceBook. I'll write up my own version and post it, after all, I've written this function before so I don't feel that it would be copyright violation....

The actual idea of separating the parameters (x and y) comes from a C function which works in that manner so again, that should be ok...

BillSoo
03-22-2002, 04:15 PM
OK, here is a version that I found in an old VB3 program I wrote:


Static Function ArcTangent (op#, ad#) As Double
pi# = 3.141593
If ad# = 0 Then
If op# > 0 Then
ArcTangent = pi# / 2#
Else
ArcTangent = pi# * 1.5
End If
Else
at# = Atn(op# / ad#)
If ad# < 0 Then
ArcTangent = pi# + at#
ElseIf op# < 0 Then
ArcTangent = pi# + pi# + at#
Else
ArcTangent = at#
End If
End If
End Function


Notice that this was before I started to use Option Explicit....

Iceplug
03-23-2002, 10:02 AM
Here is mine:
Public Function ArcTan (RealPart as Single, Complex as Single) as Currency
Dim Pi as Currency, AtnHold as Currency
Pi = 3.1415926
If RealPart = 0 Then
AtnHold = Pi / 2 * Sgn(Complex)
ElseIf RealPart = 1 Then
AtnHold = Atn(Complex/RealPart)
Else 'RealPart = -1
AtnHold = (Sgn(Complex) * Pi) - (Sgn(Complex) * Atn(Abs(Complex) / Abs(RealPart)))
End If
ArcTan = AtnHold
End Function
I haven't tested it, but I use the arctangent so much in my classes that it's almost second nature... I bet it doesn't work knowing my luck.:cool:

EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum