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

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

Заранее спасибо.

Билл Ящерица. Граница между математикой и программированием в лучшем случае размыта, и в данном случае это полностью относится к программированию. Мне нужно нарисовать градиент внутри прямоугольника. Лучший способ сделать это - определить точки на эллипсе, ограничивающие мой прямоугольник. Бам. Математика, сука.

colinta 08.09.2012 02:11

Не имеет отношения к программированию. Ключом к ответу на этот вопрос является получение координат, определяющих эллипс, из координат, определяющих прямоугольник. Ответ на этот вопрос - математическая формула, а не алгоритм.

trincot 30.12.2016 15:06

Если это не имеет отношения к программированию, почему я занимался программированием, когда мне вдруг захотелось узнать ответ на этот вопрос, и почему я всегда хотел знать ответ на этот вопрос только во время программирования или в классе математики, и почему поиск в Google математического ответа на этот вопрос привел меня к этому сайту программирования? Мне кажется, что решение отметить это не по теме является слишком буквальным определением.

Dronz 27.04.2018 03:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
3
22 767
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Для квадрата с половинной длиной стороны = 1 радиус круга будет sqrt (2).

Итак, при изменении тета от 0 до 360 'координаты эллипса будут такими:

  • x = cos (theta) * sqrt (2) * rect.width + x.center;
  • y = sin (theta) * sqrt (2) * rect.height + y.center;

где rect.width и rect.height - ширина половина соответствующих сторон.

на самом деле это еще не совсем то - я все еще работаю над этим ...

Alnitak 11.01.2009 22:37

хорошо, я думаю, что математика на самом деле прямо сейчас. Я тестировал формулы на Grapher.app

Alnitak 11.01.2009 22:54

Это потрясающе. Чтобы быть абсолютно ясным, вы можете получить размеры ограничивающего эллипса, просто умножив размеры прямоугольника на sqrt (2).

Xanthir 30.08.2009 21:15

Если вы хотите изменить соотношение сторон, вы можете использовать width '= sqrt (rect.width ^ 2 + ratio ^ 2 * rect.height ^ 2) и height' = width '/ ratio, где ratio является запрашиваемым соотношением сторон (ширина / высота) для эллипса.

Paul B. 01.06.2012 19:09

Недавно у меня была такая же проблема (с программированием), и я наткнулся на этот ответ после публикации вопроса в математике. Если кому-то все еще интересно, я думаю, что у нас есть более общее решение, math.stackexchange.com/questions/2149677/… И см. Ответ Жан-Мари выше, чтобы получить полное обсуждение. Обратите внимание, что ваш ответ sqrt (2) соответствует нашему случаю n = 1.

John Forkosh 19.02.2017 10:30

@JohnForkosh С эстетической точки зрения, я думаю, что для целей макета я по-прежнему предпочитаю корпус n = 1, поскольку прямоугольник, впоследствии охватывающий затмение, также будет поддерживать такое же соотношение сторон.

Alnitak 19.02.2017 11:33

Как сказала Жан-Мари, все в глазах смотрящего. И в исходном понимании Скотти «наименьшей площади», приведенном выше, вы также (в дополнение к вашему «впоследствии ограниченному прямоугольнику») количественно правы. В соответствии с «ограничением соотношения сторон» width / height = (a / b) ^ n, именно n = 1 минимизирует площадь эллипса pi * ab, полностью независимо от ширины и высоты.

John Forkosh 20.02.2017 22:48

Предполагая, что вы имеете в виду ограниченный (что более точно, чем "заключенный"), вы можете прочитать о как здесь описать прямоугольник. Оттуда вы можете растянуть его до прямоугольного, как говорит Альнитак.

Ответ принят как подходящий

Уравнение для эллипса с центром в начале координат имеет вид

(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).

Спасибо за объяснение - теперь все имеет смысл.

Scotty 12.01.2009 23:59

Экспериментально я обнаружил, что эллипс, определяемый прямоугольником, который 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);

}

  1. Формула эллипса: (x / A) ^ 2 + (y / B) ^ 2 = 1, где A и B - радиусы эллипса.
  2. Стороны прямоугольника - Rw и Rh.
  3. Предположим, мы хотим, чтобы эллипс имел те же пропорции, что и прямоугольник; тогда, если мы изобразим квадрат в круге (A = B, Rq = Rh) и сжаем его, мы хорошо сохраним соотношение эллипса A / B таким же, как соотношение сторон прямоугольника Rw / Rh;

Это приводит нас к следующей системе уравнений:
(х / А) ^ 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)

Пример:
ellipse

Другие вопросы по теме