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

double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));
19
задан Pete Kirkham 14 February 2009 в 11:03
поделиться

4 ответа

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

(x/A)^2 + (y/B)^2 = 1

Теперь, если Вы хотите включить прямоугольник MxN с затмением, можно переместить его центр в начало координат. Верхние правые координаты (M/2,N/2), заменяя в уравнении эллипса, у Вас есть формула, которую можно использовать для решения B, данного (или данного B).

, Если у Вас есть прямоугольник 4x2, верхние правые координаты (2,1), заменение Вас имеет эти (2/A)^2 + (1/B)^2 = 1, затем если A=4 решение для B дает B=1/sqrt(1-(1/2)^2).

8
ответ дан 30 November 2019 в 02:24
поделиться

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

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

Так, развертываясь тета от 0 - 360', координатные точки эллипса будут:

  • x = because(тета) * sqrt (2) * rect.width + x.center;
  • год = тета sin() * sqrt (2) * rect.height + y.center;

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

24
ответ дан 30 November 2019 в 02:24
поделиться

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

1
ответ дан 30 November 2019 в 02:24
поделиться

Экспериментально я обнаружил, что эллипс, определяемый прямоугольником, который sqrt (2) больше внутреннего прямоугольника, работает. Итак, передайте sqrt (2) этой функции, и вы получите соответствующий прямоугольник:

RectangleF boundingEllipse = GetScaledRectangle (innerRect, Convert.ToSingle (Math.Sqrt (2d)));

private RectangleF GetScaledRectangle (RectangleF rectangle , плавающая шкала) { float width = rect.Width * масштаб; 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);

}

1
ответ дан 30 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: