# Trig Problem: Rotating points in array

• July 8th, 2010, 06:06 PM
Pokenerd
Trig Problem: Rotating points in array
Hi guys,

I'm having a bit of trouble with a bit of trig in C#. I've written code similar to this in actionscript3 (flash), but it is giving me issues in C#. I am not receiving errors, but all the shapes I rotate are somewhat screwed up.

It is worth mentioning that Form1.rad is a constant I am using to convert degrees into radians and back. Math.pi/180

Here is the points array I am using:
Code:

`static private Point[] drawingPoints = new Point[13]{new Point(14,0),new Point(19,9),new Point(19,18),new Point(25,30),new Point(19,26),new Point(19,18),new Point(19,26),new Point(8,26),new Point(8,18),new Point(0,30),new Point(8,26),new Point(8,9),new Point(14,0)};`
Here is the rotation code + the code to draw this.

Code:

```public void draw (Graphics g)         {             Point[] rotatedPoints = new Point[13];                         for (short index = 0; index < rotatedPoints.Length; index++)             {                 //Finding the location of the points relative to the upper left of the ship.                 Point curPoint = drawingPoints[index];                 Point newPoint = new Point(curPoint.X,curPoint.Y);                 double distToPoint = Form1.distTo(curPoint.X,curPoint.Y,centerPoint.X,centerPoint.Y);//we treat this as the hypotenuse.                                 decimal degToPoint = (decimal)Math.Atan(centerPoint.Y - curPoint.Y / centerPoint.X - curPoint.X)/Form1.rad;//Gets the degrees from the center point to the current drawing point without any rotation yet.                 decimal degToNewPoint = degToPoint + rotation;//Add the rotation                 decimal cosToNewPoint = (decimal)Math.Cos((double)(degToNewPoint*Form1.rad));//From the center the cosine.                 //Since cos is adj/hyp to get adj multiply by the hyp.                 newPoint.X = (int)(cosToNewPoint * (decimal)distToPoint);                                 decimal sinToNewPoint = (decimal)Math.Sin((double)(degToNewPoint * Form1.rad));//From the center the cosine.                 Debug.Fail(sinToNewPoint.ToString());                 //Same idea as with the cosine                 newPoint.Y = (int)(sinToNewPoint * (decimal)distToPoint);                 //Adding points to drawing array                 rotatedPoints[index] = newPoint;             }             //Adding the screen x y location to the points:             for (short i = 0; i < rotatedPoints.Length; i++)             {                 rotatedPoints[i].X += this._x;                 rotatedPoints[i].Y += this._y;             }             Pen shipPen = new Pen(shipColor, 2);             g.DrawLines(shipPen, rotatedPoints);         }```
I know that the drawing code works correctly. If you comment out the rotation parts of the code, it displays my drawing just fine. What is annoying, is that if the rotation is something other than zero, the rotation works, but the shape is still flattened/scewed on one side.

• July 8th, 2010, 06:18 PM
BigEd781
Re: Trig Problem: Rotating points in array
Why not replace all of that code with a simple rotation matrix? It takes a point and a theta to rotate by.

Code:

```public PointF Rotate(Point p, float theta) {     float rx = (p.x * Math.Cos(theta)) - (p.y * Math.Sin(theta))     float ry = (p.y * Math.Cos(theta)) + (p.x * Math.Sin(theta))     return new PointF( rx, ry ); }```
• July 8th, 2010, 06:28 PM
Pokenerd
Re: Trig Problem: Rotating points in array
This seems like it would be much more effective. However I don't understand this exactly. Do I the point that I am rotating in the first argument, and the degrees in the second? If that is the case, I don't see how I can get it to rotate around a specific point?
• July 8th, 2010, 06:44 PM
BigEd781
Re: Trig Problem: Rotating points in array
The rotation will be around the origin, wherever that may be. For example, in our case the origin will likely be the top left corner. You can offset the point afterward if needed.
• July 8th, 2010, 06:51 PM
Pokenerd
Re: Trig Problem: Rotating points in array
How would I do that?
• July 8th, 2010, 07:33 PM
BigEd781
Re: Trig Problem: Rotating points in array
Well, I suppose that the simplest way would just be to add to each point. For example, if you want an origin in the center of the screen:

Code:

```Point rotated = Rotate(somePoint, someTheta); rotated.X += screenWidth / 2 rotated.Y += screenHeight / 2```
Or you could just incorporate that logic in the rotate method itself, i.e., pass in another point that defines the origin.
• July 8th, 2010, 07:49 PM
Pokenerd
Re: Trig Problem: Rotating points in array
Alright, that makes sense. Sorry to keep pestering you, but what is theta?

Further how does it know to keep the distance from the point of rotation the same?
• July 8th, 2010, 08:12 PM
BigEd781
Re: Trig Problem: Rotating points in array
theta is a degree measured in radians. As for the second question, it knows because of the trigonometric functions. Not sure how else to explain it, if you know what the trig functions actually mean it makes sense.
• July 8th, 2010, 08:21 PM
Pokenerd
Re: Trig Problem: Rotating points in array
Alright, thanks for your help - it works, so I guess I should be happy. Will look into it further next time.
• July 8th, 2010, 10:05 PM
BigEd781
Re: Trig Problem: Rotating points in array
Think of it as building triangles inside of the circle at some angle theta. You can find the vertices of that triangle using trig, i.e., you can find points on the circle.