# Convert Canvas Space point to local space of a rotated rect?

I got a quite tricky problem:

I have my mouse position and my rectangle position in canvas space(screen space but with adjusted scaling). Now I want my mouse position converted to local space of the rectangle. Problem is, the rectangle can be rotated. Without rotation its quite simple and works nicely.

Heres a graphic for better demonstration:

Solved with help from stackoverflow. The solution is as follows:

``````    var mapRect = MapContentTransform.rect;

// Canvas Space Map Center
var mapPositionCenter = CanvasRectTransform.InverseTransformPoint(MapContentTransform.position);
mapPositionCenter.x += CanvasRectTransform.rect.width / 2.0f;
mapPositionCenter.y += CanvasRectTransform.rect.height / 2.0f;
// Mouse Position in Canvas Space
Vector2 mousePositionCanvasSpace = CalculateScreenspacePositionCanvasSpace(new Vector2(Input.mousePosition.x, Input.mousePosition.y));

// Rotation angle of the Map in Radians
float theta = -(MapContentTransform.eulerAngles.z - 360.0f) * Mathf.Deg2Rad;

var rotatedX = ((mousePositionCanvasSpace.x - mapPositionCenter.x) * Mathf.Cos(theta) -
(mousePositionCanvasSpace.y - mapPositionCenter.y) * Mathf.Sin(theta)) + mapRect.width / 2.0f;

var rotatedY = ((mousePositionCanvasSpace.y - mapPositionCenter.y) * Mathf.Cos(theta) +
(mousePositionCanvasSpace.x - mapPositionCenter.x) * Mathf.Sin(theta)) + mapRect.height / 2.0f;
``````

I had to adjust for Unity’s Counter-Clockwise UI rotation(The formula requires Clockwise!) as well as the offset from the center of the rotated image since I want the coordinates to be from 0 to image.size.

Hi @TriNityGER
Scaling nor rotation does not matter here I think. This is more like matter of space conversion, and you are interested in point’s location in Canvas RectTransform space, transformed into your other RectTransform’s space:

``````public RectTransform refItemRt;
public RectTransform placedItemRt;
public RectTransform targetSpaceRt;

void Update ()
{
var pos = targetSpaceRt.InverseTransformPoint(refItemRt.position);
placedItemRt.localPosition = pos;
}
``````