Я пытаюсь применить преобразование на прямоугольнике в пределах другого прямоугольника .... и иметь довольно сложную задачу. Вот пример того, что я пытаюсь достичь, вращение всегда будет с шагом 90 градусов:Вращение внутреннего прямоугольника (или квадрата) в C#
Я в левых нижнем углу X/Y, ширина и высота как внешние, так и внутренние прямоугольники .... Я пытаюсь вычислить эти же значения для преобразованного внутреннего прямоугольника.
Моя попытка может быть найдена ниже, я попробовал вращать все 4 угла вокруг центра большого прямоугольника, а затем снова положить их в виде прямоугольника. Это может не работать, потому что во время вращения изменяется большая ширина/высота прямоугольника. Кто-нибудь знает формулу для этого? Если бы кто-то мог указать мне на хороший ресурс, который был бы фантастическим.
Мой код:
Vector2 center = new Vector2(largeRectWidth/2.0f, largeRectHeight/2.0f);
Rect innerRectRotated = RotateRectangleAroundPivot(innerRect, center, this.Rotation);
public static Rect RotateRectangleAroundPivot(Rect rect,
Vector2 pivot,
float rotation)
{
Vector2 leftTop = new Vector2(rect.x, rect.y + rect.height);
Vector2 rightTop = new Vector2(rect.x + rect.width, rect.y + rect.height);
Vector2 leftBottom = new Vector2(rect.x, rect.y);
Vector2 rightBottom = new Vector2(rect.x + rect.width, rect.y);
leftTop = RotatePointAroundPivot(leftTop, pivot, rotation);
rightTop = RotatePointAroundPivot(rightTop, pivot, rotation);
leftBottom = RotatePointAroundPivot(leftBottom, pivot, rotation);
rightBottom = RotatePointAroundPivot(rightBottom, pivot, rotation);
Vector2 min = Vector2.Min(Vector2.Min(leftTop, rightTop),
Vector2.Min(leftBottom, rightBottom));
Vector2 max = Vector2.Max(Vector2.Max(leftTop, rightTop),
Vector2.Max(leftBottom, rightBottom));
return new Rect(min.x, min.y, (max.x - min.x), (max.y - min.y));
}
public static Vector2 RotatePointAroundPivot(Vector2 point, Vector2 pivot, float angle)
{
angle = angle * Mathf.PI/180.0f;
return new Vector2((float)(Math.Cos(angle) * (point.x - pivot.x) - Math.Sin(angle) * (point.y - pivot.y) + pivot.x), (float)(Math.Sin(angle) * (point.x - pivot.x) + Math.Cos(angle) * (point.y - pivot.y) + pivot.y));
}