2014-12-07 5 views
1

Я пытаюсь применить преобразование на прямоугольнике в пределах другого прямоугольника .... и иметь довольно сложную задачу. Вот пример того, что я пытаюсь достичь, вращение всегда будет с шагом 90 градусов:Вращение внутреннего прямоугольника (или квадрата) в C#

enter image description here

Я в левых нижнем углу 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)); 
} 

ответ

0

хорошо в 2D для 90deg вращений вы не нужны никакие тригонометрии

  • использовать вместо этого:
  • точка ввода (x,y) поворачивается на 90deg так:
  • xx=y; yy=-x;
  • в другом направлении:
  • xx=-y; yy=x;
  • который формула CW и CCW зависит от системы координат
  • стенда поворачивается точка вокруг точки (0,0) на 90deg
  • так что если вы хотите, чтобы повернуть любой другой момент просто сместить точки до и после. ..

так сделать это следующим образом:

  1. перевести точку вашего центра вращения

    • x-=x0; y-=y0;
  2. поворот влево или вправо

    • , например:
    • aa=x; bb=y; x=-bb; y=+aa;
  3. перевести точку назад

    • x+=x0; y+=y0;
  4. теперь x,y имеет повернутый точку

[ноты]

  • , если вы хотите, чтобы центр вращения, чтобы быть в середине прямоугольника
  • то x0,y0 средняя точка ...
  • так, если прямоугольник определяется как x1,y1,...,x4,y4
  • затем x0=(x1+x2+x3+x4)/4.0; и y0=(y1+y2+y3+y4)/4.0;