Эллипс, ограничивающий прямоугольник
Вопрос Maths101 - кто-нибудь знает, как вычислить эллипс (ширина/высота), который будет заключать данный прямоугольник. Очевидно, что нет единого эллипса - я следую алгоритму, который даст мне различные комбинации ширины/высоты - или, возможно, самую маленькую область эллипса? Это для графического интерфейса, поэтому эстетически приятное соотношение высоты и ширины - это то, что я ищу.
Спасибо заранее.
Ответы
Ответ 1
Уравнение для эллипса с центром в начале координат
(x/A)^2 + (y/B)^2 = 1
Теперь, если вы хотите заключить прямоугольник MxN с затмением, вы можете переместить его центр в начало координат. Верхние правые координаты (M/2,N/2)
, заменяя в уравнении эллипса у вас есть формула, которую вы можете использовать для решения B, данного A (или A данного B).
Если у вас есть прямоугольник 4x2, то правые верхние координаты являются (2,1), а вы заменяете (2/A)^2 + (1/B)^2 = 1
, тогда если A=4
решение для B дает B=1/sqrt(1-(1/2)^2)
.
Ответ 2
Если вы придаете эллипсу то же соотношение сторон, что и прямоугольник, вы можете работать на том основании, что то, что вы хотите, представляет собой круг, охватывающий квадрат, затем растягивается, как если бы вы превратили квадрат в необходимый прямоугольник.
Для квадрата с половиной длины стороны = 1 радиус круга будет sqrt (2).
Итак, подметая theta от 0 до 360 ', координатные точки эллипса будут:
- x = cos (theta) * sqrt (2) * rect.width + x.center;
- y = sin (theta) * sqrt (2) * rect.height + y.center;
где rect.width и rect.height - это полуширины соответствующих сторон.
Ответ 3
- Формула Эллипса есть (x/A) ^ 2 + (y/B) ^ 2 = 1, где A и B - радиусы эллипса
- Прямоугольные стороны Rw и Rh
- Предположим, мы хотим, чтобы эллипс был с теми же пропорциями, что и прямоугольник; то, если мы изображаем квадрат по кругу (A = B, Rq = Rh) и сжимаем его, мы хорошо сохраняем отношение эллипса A/B так же, как отношение сторон прямоугольника Rw/Rh;
Это приводит нас к следующей системе уравнений:
(Х/А) ^ 2 + (Y/B) ^ 2 = 1
А/В = Rw/Rh
Позволяет решить эту проблему:
A = B * (Rw/Rh)
(Rh/2B) ^ 2 + (Rh/2B) ^ 2 = 1
Rh = sqrt (2) * B
И окончательное решение:
А = Rw/SQRT (2)
В = Rh/SQRT (2)
Пример:
эллипс http://i55.tinypic.com/sxhlc0.gif
Ответ 4
Предполагая, что вы имеете в виду ограниченные (что более точно, чем "заключено" ), вы можете прочитать как обрисовать прямоугольник здесь. Оттуда вы можете растянуть ее до прямоугольной формы, как говорит Алнитак.
Ответ 5
Экспериментально я обнаружил, что эллипс, определяемый прямоугольником, который является sqrt (2) большим, чем внутренний прямоугольник. Итак, передайте sqrt (2) этой функции, и вы получите соответствующий прямоугольник:
RectangleF boundingEllipse = GetScaledRectangle (innerRect, Convert.ToSingle(Math.Sqrt(2d)));
частный RectangleF GetScaledRectangle (прямоугольник прямоугольника, поплавок)
{ float width = rect.Width * scale; float height = rect.Height * scale;
float gap = width - rect.Width;
float left = rect.Left - (gap / 2f);
gap = height - rect.Height;
float top = rect.Top - (gap / 2f);
return new RectangleF(left, top, width, height);
}