Используйте ключевое слово delete и возвращайте ответ
delete projects[id]
min_x
max_x
(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) центр, вокруг которого Вы вращаетесь. Вы, возможно, должны переделать это в зависимости от своих аккуратных функций (сделайте они ожидают градусы или радианы), смысл / знак Вашей системы координат по сравнению с тем, как Вы определяете углы, и т.д.
Метод, обрисованный в общих чертах 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 градусов в Вашей схеме, кажется, указывает, что Вы используете, я не был уверен, что часть справа пыталась обозначить. Если это - неправильный путь вокруг тогда, просто подкачивают симметричные пункты и также знак условий Св.
Примените матрицу вращения к своим вершинам. Тогда используйте минимум/максимум соответственно полученного x, y координаты для определения новой ограничительной рамки.
Я не уверен, что понимаю, но составная матрица преобразования даст Вам новые координаты для всех затронутых точек. Если Вы думаете, что прямоугольник может выйти за пределы imagable преобразования сообщения области, применяют траекторию отсечения.
В случае, если Вы незнакомы с точным определением матриц, смотрят здесь .
при использовании GDI + можно создать новый GrpaphicsPath->, Добавляют любые точки, или формы к нему-> Применяются, вращаются, преобразование-> используют GraphicsPath. GetBounds () и это возвратит прямоугольник, который ограничивает Вашу повернутую форму.
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
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()