Эллипс, ограничивающий прямоугольник

Вопрос 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);

}