# Thread: [RESOLVED] Rotating an array of points clockwise 90, 180, and 270 degrees

1. ## [RESOLVED] Rotating an array of points clockwise 90, 180, and 270 degrees

I have an array of points that draws a polygon in a vertical position (All of the X and Y values are positive)...

Code:
```Dim points21x22() As Point = New Point() {New Point(10, 0), New Point(15, 3), New Point(18, 5), New Point(20, 8), _
New Point(20, 39), New Point(17, 42), New Point(3, 42), New Point(0, 39), _
New Point(0, 8), New Point(2, 5), New Point(5, 3), New Point(10, 0)}```
I can rotate this array 90 degrees clockwise...

Code:
`Dim newPoints() As Point = Array.ConvertAll(points21x22, Function(pt) New Point(-pt.Y, pt.X))`
But this results in negative values in the X coordinate which messes with my offsetting.

I can fix my offsetting...

Code:
```Dim o As Integer = newPoints.Min(Function(pt2) pt2.X)
newPoints = Array.ConvertAll(newPoints, Function(pt) New Point(pt.X - o, pt.Y))```
But this still gives an array with some negative X values.
Can someone explain how to rotate my polygons so that all of the point values are positive?, and also if this code...

Code:
`Dim newPoints() As Point = Array.ConvertAll(points21x22, Function(pt) New Point(pt.Y, -pt.X))`
Will rotate 90 degrees anticlockwise? And also, will this rotate by 180 degrees?...

Code:
`Dim newPoints() As Point = Array.ConvertAll(points21x22, Function(pt) New Point(pt.Y, pt.X))`  Reply With Quote

2. ## Re: Rotating an array of points clockwise 90, 180, and 270 degrees

What are you actually trying to rotate around? I would think that the thing to do would be to determine your point of rotation, convert each point to polar coordinates relative to that, increase or decrease the angle as appropriate and then convert back to Cartesian coordinates.  Reply With Quote

3. ## Re: Rotating an array of points clockwise 90, 180, and 270 degrees

That makes some sense. The array starts at 10, 0. If I subtract 10 from each of the X values, rotate using the methods I mentioned, then add 10 to each of the X values, is that right? Im not at my computer right now.  Reply With Quote

4. ## Re: Rotating an array of points clockwise 90, 180, and 270 degrees

Ill post a diagram showing what it starts at, and what it is supposed to be transformed to  Reply With Quote

5. ## Re: [RESOLVED] Rotating an array of points clockwise 90, 180, and 270 degrees

Problem resolved... I managed to get myself tied up in point arrays. Didn't realise i already had the answer Code:
```Public Shared Function PlusNinety(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(-pt.Y, pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.X)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X - o, pt.Y))
End Function

Public Shared Function MinusNinety(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(pt.Y, -pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.Y)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X, pt.Y - o))
End Function

Public Shared Function PlusOneEighty(ByVal p() As Point) As Point()
Dim o As Integer = p.Max(Function(pt2) pt2.Y)
Return Array.ConvertAll(p, Function(pt) New Point(pt.X, o - pt.Y))
End Function```  Reply With Quote

6. ## Re: [RESOLVED] Rotating an array of points clockwise 90, 180, and 270 degrees Originally Posted by .paul. Problem resolved... I managed to get myself tied up in point arrays. Didn't realise i already had the answer Code:
```Public Shared Function PlusNinety(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(-pt.Y, pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.X)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X - o, pt.Y))
End Function

Public Shared Function MinusNinety(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(pt.Y, -pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.Y)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X, pt.Y - o))
End Function

Public Shared Function PlusOneEighty(ByVal p() As Point) As Point()
Dim o As Integer = p.Max(Function(pt2) pt2.Y)
Return Array.ConvertAll(p, Function(pt) New Point(pt.X, o - pt.Y))
End Function```
Do you think making these extension methods will make the code more clean? (sorry to rename your function names but for me digits are more readable )

VB.NET Code:
```p1.Rotate180()
p2.RotateMinus90()
p3.RotatePlus90()```

Code:
```Imports System.Runtime.CompilerServices

Module PointsArrayExtensions

<Extension()>
Public Function RotatePlus90(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(-pt.Y, pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.X)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X - o, pt.Y))
End Function

<Extension()>
Public Shared Function RotateMinus90(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(pt.Y, -pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.Y)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X, pt.Y - o))
End Function

<Extension()>
Public Function Rotate180(ByVal p() As Point) As Point()
Dim o As Integer = p.Max(Function(pt2) pt2.Y)
Return Array.ConvertAll(p, Function(pt) New Point(pt.X, o - pt.Y))
End Function

End Module```  Reply With Quote

7. ## Re: [RESOLVED] Rotating an array of points clockwise 90, 180, and 270 degrees Originally Posted by peterst Do you think making these extension methods will make the code more clean? (sorry to rename your function names but for me digits are more readable )

VB.NET Code:
```p1.Rotate180()
p2.RotateMinus90()
p3.RotatePlus90()```

Code:
```Imports System.Runtime.CompilerServices

Module PointsArrayExtensions

<Extension()>
Public Function RotatePlus90(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(-pt.Y, pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.X)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X - o, pt.Y))
End Function

<Extension()>
Public Shared Function RotateMinus90(ByVal p() As Point) As Point()
Dim newPoints() As Point = Array.ConvertAll(p, Function(pt) New Point(pt.Y, -pt.X))
Dim o As Integer = newPoints.Min(Function(pt2) pt2.Y)
Return Array.ConvertAll(newPoints, Function(pt) New Point(pt.X, pt.Y - o))
End Function

<Extension()>
Public Function Rotate180(ByVal p() As Point) As Point()
Dim o As Integer = p.Max(Function(pt2) pt2.Y)
Return Array.ConvertAll(p, Function(pt) New Point(pt.X, o - pt.Y))
End Function

End Module```
I considered making them extension methods. At this point in my project, i'm focusing on GUI functionality issues. I might come back to these functions later...  Reply With Quote

8. ## Re: [RESOLVED] Rotating an array of points clockwise 90, 180, and 270 degrees Originally Posted by .paul. I considered making them extension methods. At this point in my project, i'm focusing on GUI functionality issues. I might come back to these functions later...
I am thinking of methods naming as most of time bad naming makes my code unclear of the real intent. Probably RotateLeft/RotateRight or RotateCW/RotateCCW (may include 90 as degrees) are more appropriate names. I am really interested what you think and what you will use as names as all these sound ok but in code they may look weird when time passes and you read what you did. I had few db fields and procedures renaming few hours ago to suit better the global purpose of my app but right now I found it is still not perfect for future readability and easy understanding what is done (event sourced systems are pain to get naming right).  Reply With Quote

9. ## Re: [RESOLVED] Rotating an array of points clockwise 90, 180, and 270 degrees

I should point out, my plusOneEighty method isnt actually a rotation of 180 degrees. Its a flip horizontal mirror of the original points. This works ok for me, as my points are symmetrical  Reply With Quote

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•