Вопрос Maths101 - кто-нибудь знает, как вычислить эллипс (ширина / высота), который будет заключать данный прямоугольник. Очевидно, что нет единого эллипса - мне нужен алгоритм, который даст мне различные комбинации ширины / высоты - или, возможно, наименьшую площадь эллипса? Это для графического интерфейса, поэтому я ищу эстетически приятное соотношение высоты / ширины.
Заранее спасибо.
Не имеет отношения к программированию. Ключом к ответу на этот вопрос является получение координат, определяющих эллипс, из координат, определяющих прямоугольник. Ответ на этот вопрос - математическая формула, а не алгоритм.
Если это не имеет отношения к программированию, почему я занимался программированием, когда мне вдруг захотелось узнать ответ на этот вопрос, и почему я всегда хотел знать ответ на этот вопрос только во время программирования или в классе математики, и почему поиск в Google математического ответа на этот вопрос привел меня к этому сайту программирования? Мне кажется, что решение отметить это не по теме является слишком буквальным определением.





Если вы зададите своему эллипсу то же соотношение сторон, что и прямоугольник, вы можете работать, исходя из того, что вам нужен круг, охватывающий квадрат, а затем растянутый, как если бы вы преобразовали квадрат в требуемый прямоугольник.
Для квадрата с половинной длиной стороны = 1 радиус круга будет sqrt (2).
Итак, при изменении тета от 0 до 360 'координаты эллипса будут такими:
где rect.width и rect.height - ширина половина соответствующих сторон.
на самом деле это еще не совсем то - я все еще работаю над этим ...
хорошо, я думаю, что математика на самом деле прямо сейчас. Я тестировал формулы на Grapher.app
Это потрясающе. Чтобы быть абсолютно ясным, вы можете получить размеры ограничивающего эллипса, просто умножив размеры прямоугольника на sqrt (2).
Если вы хотите изменить соотношение сторон, вы можете использовать width '= sqrt (rect.width ^ 2 + ratio ^ 2 * rect.height ^ 2) и height' = width '/ ratio, где ratio является запрашиваемым соотношением сторон (ширина / высота) для эллипса.
Недавно у меня была такая же проблема (с программированием), и я наткнулся на этот ответ после публикации вопроса в математике. Если кому-то все еще интересно, я думаю, что у нас есть более общее решение, math.stackexchange.com/questions/2149677/… И см. Ответ Жан-Мари выше, чтобы получить полное обсуждение. Обратите внимание, что ваш ответ sqrt (2) соответствует нашему случаю n = 1.
@JohnForkosh С эстетической точки зрения, я думаю, что для целей макета я по-прежнему предпочитаю корпус n = 1, поскольку прямоугольник, впоследствии охватывающий затмение, также будет поддерживать такое же соотношение сторон.
Как сказала Жан-Мари, все в глазах смотрящего. И в исходном понимании Скотти «наименьшей площади», приведенном выше, вы также (в дополнение к вашему «впоследствии ограниченному прямоугольнику») количественно правы. В соответствии с «ограничением соотношения сторон» width / height = (a / b) ^ n, именно n = 1 минимизирует площадь эллипса pi * ab, полностью независимо от ширины и высоты.
Предполагая, что вы имеете в виду ограниченный (что более точно, чем "заключенный"), вы можете прочитать о как здесь описать прямоугольник. Оттуда вы можете растянуть его до прямоугольного, как говорит Альнитак.
Уравнение для эллипса с центром в начале координат имеет вид
(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).
Спасибо за объяснение - теперь все имеет смысл.
Экспериментально я обнаружил, что эллипс, определяемый прямоугольником, который sqrt (2) больше внутреннего прямоугольника, работает. Так что передайте sqrt (2) этой функции, и вы получите соответствующий прямоугольник:
RectangleF boundingEllipse = GetScaledRectangle (innerRect, Convert.ToSingle (Math.Sqrt (2d)));
частный RectangleF GetScaledRectangle (прямоугольник RectangleF, масштаб с плавающей запятой) { float width = rect.Width * масштаб; высота поплавка = 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);
}
Это приводит нас к следующей системе уравнений:
(х / А) ^ 2 + (у / В) ^ 2 = 1
A / B = Rw / Rh
Давайте решим это:
A = B * (Rw / Rh)
(Rh / 2B) ^ 2 + (Rh / 2B) ^ 2 = 1
Rh = sqrt (2) * B
И окончательное решение:
A = Rw / sqrt (2)
B = Rh / sqrt (2)
Билл Ящерица. Граница между математикой и программированием в лучшем случае размыта, и в данном случае это полностью относится к программированию. Мне нужно нарисовать градиент внутри прямоугольника. Лучший способ сделать это - определить точки на эллипсе, ограничивающие мой прямоугольник. Бам. Математика, сука.