Вычислите координаты Ограничительной рамки от повернутого прямоугольника

Используйте ключевое слово delete и возвращайте ответ

delete projects[id]
68
задан Peter O. 13 January 2017 в 20:48
поделиться

6 ответов

  • Преобразовывают координаты всех четырех углов
  • , Находят самый маленький из всех четырех x's, поскольку min_x
  • Находят самый большой из всех четырех x's и называют его max_x
  • Так же с y's
  • , Ваша ограничительная рамка (min_x,min_y), (min_x,max_y), (max_x,max_y), (max_x,min_y)

AFAIK, нет никакой королевской дороги, которая получит Вас там намного быстрее.

, Если Вы задаетесь вопросом, как преобразовать координаты, попробуйте:

x2 = x0+(x-x0)*cos(theta)+(y-y0)*sin(theta)
y2 = y0-(x-x0)*sin(theta)+(y-y0)*cos(theta)

, где (x0, y0) центр, вокруг которого Вы вращаетесь. Вы, возможно, должны переделать это в зависимости от своих аккуратных функций (сделайте они ожидают градусы или радианы), смысл / знак Вашей системы координат по сравнению с тем, как Вы определяете углы, и т.д.

78
ответ дан MarkusQ 24 November 2019 в 14:15
поделиться

Метод, обрисованный в общих чертах MarkusQ, работает отлично, но примите во внимание, что Вы не должны преобразовывать другие три угла, если у Вас уже есть точка.

альтернативный метод, который более эффективен, должен протестировать, в каком квадранте Ваш угол вращения находится, и затем просто вычислите ответ непосредственно. Это более эффективно, поскольку у Вас только есть худший случай два, если операторы (проверяющий угол), тогда как другой подход имеет худший случай двенадцать (6 для каждого компонента при проверке других трех углов, чтобы видеть, если они больше, чем макс. ток или меньше, чем текущая минута) я думаю.

основной алгоритм, который использует не что иное как ряд приложений теоремы Pythagoras, показывают ниже. Я обозначил угол вращения тетой и выразил проверку там в градусах, поскольку это - псевдокод.

ct = cos( theta );
st = sin( theta );

hct = h * ct;
wct = w * ct;
hst = h * st;
wst = w * st;

if ( theta > 0 )
{
    if ( theta < 90 )
    {
        // 0 < theta < 90
        y_min = A_y;
        y_max = A_y + hct + wst;
        x_min = A_x - hst;
        x_max = A_x + wct;
    }
    else
    {
        // 90 <= theta <= 180
        y_min = A_y + hct;
        y_max = A_y + wst;
        x_min = A_x - hst + wct;
        x_max = A_x;
    }
}
else
{
    if ( theta > -90 )
    {
        // -90 < theta <= 0
        y_min = A_y + wst;
        y_max = A_y + hct;
        x_min = A_x;
        x_max = A_x + wct - hst;
    }
    else
    {
        // -180 <= theta <= -90
        y_min = A_y + wst + hct;
        y_max = A_y;
        x_min = A_x + wct;
        x_max = A_x - hst;
    }
}

Этот подход предполагает, что Вы имеете то, что Вы говорите, что имеете т.е. указываете на A и значение для теты, которая находится в диапазоне [-180, 180]. Я также предположил, что тета увеличивается в направлении по часовой стрелке, поскольку это - то, что прямоугольник, который был повернут на 30 градусов в Вашей схеме, кажется, указывает, что Вы используете, я не был уверен, что часть справа пыталась обозначить. Если это - неправильный путь вокруг тогда, просто подкачивают симметричные пункты и также знак условий Св.

11
ответ дан Troubadour 24 November 2019 в 14:15
поделиться

Примените матрицу вращения к своим вершинам. Тогда используйте минимум/максимум соответственно полученного x, y координаты для определения новой ограничительной рамки.

1
ответ дан ypnos 24 November 2019 в 14:15
поделиться

Я не уверен, что понимаю, но составная матрица преобразования даст Вам новые координаты для всех затронутых точек. Если Вы думаете, что прямоугольник может выйти за пределы imagable преобразования сообщения области, применяют траекторию отсечения.

В случае, если Вы незнакомы с точным определением матриц, смотрят здесь .

0
ответ дан dirkgently 24 November 2019 в 14:15
поделиться

при использовании GDI + можно создать новый GrpaphicsPath->, Добавляют любые точки, или формы к нему-> Применяются, вращаются, преобразование-> используют GraphicsPath. GetBounds () и это возвратит прямоугольник, который ограничивает Вашу повернутую форму.

(редактирование) образец VB.Net

Public Shared Sub RotateImage(ByRef img As Bitmap, degrees As Integer)
' http://stackoverflow.com/questions/622140/calculate-bounding-box-coordinates-from-a-rotated-rectangle-picture-inside#680877
'
Using gp As New GraphicsPath
  gp.AddRectangle(New Rectangle(0, 0, img.Width, img.Height))

  Dim translateMatrix As New Matrix
  translateMatrix.RotateAt(degrees, New PointF(img.Width \ 2, img.Height \ 2))
  gp.Transform(translateMatrix)

  Dim gpb = gp.GetBounds

  Dim newwidth = CInt(gpb.Width)
  Dim newheight = CInt(gpb.Height)

  ' http://www.codeproject.com/Articles/58815/C-Image-PictureBox-Rotations
  '
  Dim rotatedBmp As New Bitmap(newwidth, newheight)

  rotatedBmp.SetResolution(img.HorizontalResolution, img.VerticalResolution)

  Using g As Graphics = Graphics.FromImage(rotatedBmp)
    g.Clear(Color.White)
    translateMatrix = New Matrix
    translateMatrix.Translate(newwidth \ 2, newheight \ 2)
    translateMatrix.Rotate(degrees)
    translateMatrix.Translate(-img.Width \ 2, -img.Height \ 2)
    g.Transform = translateMatrix
    g.DrawImage(img, New PointF(0, 0))
  End Using
  img.Dispose()
  img = rotatedBmp
End Using

Конец Sub

3
ответ дан FastAl 24 November 2019 в 14:15
поделиться

Although Code Guru stated the GetBounds() method, I've noticed the question is tagged as3, flex, so here is an as3 snippet that illustrates the idea.

var box:Shape = new Shape();
box.graphics.beginFill(0,.5);
box.graphics.drawRect(0,0,100,50);
box.graphics.endFill();
box.rotation = 20;
box.x = box.y = 100;
addChild(box);

var bounds:Rectangle = box.getBounds(this);

var boundingBox:Shape = new Shape();
boundingBox.graphics.lineStyle(1);
boundingBox.graphics.drawRect(bounds.x,bounds.y,bounds.width,bounds.height);
addChild(boundingBox);

I noticed that there two methods that seem to do the same thing: getBounds() and getRect()

2
ответ дан 24 November 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: