椭圆边界矩形

时间:2009-01-11 18:29:32

标签: math

Maths101问题 - 有谁知道如何计算将包围给定矩形的椭圆(宽度/高度)。显然没有单一的椭圆 - 我是在一个能给出各种宽度/高度组合的算法之后 - 或者是椭圆的最小区域?这是一个GUI,所以我正在寻找一个美观的高度/宽度比。

提前致谢。

5 个答案:

答案 0 :(得分:22)

如果你给椭圆提供与矩形相同的纵横比,你可以根据你想要的是一个包围正方形的圆然后拉伸,就像你已经将正方形转换成所需的矩形一样。

对于半边长度= 1的正方形,圆的半径为sqrt(2)。

因此,从0 - 360'扫过 theta ,椭圆的坐标点将为:

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

其中rect.width和rect.height是相关边的 half 宽度。

答案 1 :(得分:19)

  1. 椭圆公式为(x / A)^ 2 +(y / B)^ 2 = 1,其中A和B为椭圆的半径
  2. 矩形边是Rw和Rh
  3. 假设我们想要与矩形具有相同比例的椭圆;然后,如果我们将圆形(A = B,Rq = Rh)成像并挤压它,我们很好地保持椭圆A / B的比率与矩形边Rw / Rh的比率相同;
  4. 这导致我们遵循方程组:
    (X / A)^ 2 +(Y / B)^ 2 = 1
    A / B = RW /铑

    让我们解决它: A = B *(Rw / Rh)
    (Rh / 2B)^ 2 +(Rh / 2B)^ 2 = 1
    Rh = sqrt(2)* B

    最终解决方案:
    A = RW / SQRT(2)
    B =的Rh / SQRT(2)

    例:
    ellipse http://i55.tinypic.com/sxhlc0.gif

答案 2 :(得分:8)

以原点为中心的椭圆的等式是

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

现在,如果你想用日食包围一个MxN矩形,你可以将它的中心移动到坐标原点。右上角坐标是(M/2,N/2),在椭圆方程中替换你有一个公式,你可以用它来解A给定A(或A给定B)。

如果您的矩形为4x2,则右上角坐标为(2,1),替换为(2/A)^2 + (1/B)^2 = 1,如果A=4求解B为B=1/sqrt(1-(1/2)^2)

答案 3 :(得分:1)

假设您的意思是限制(比“封闭”更精确),您可以阅读how to circumscribe a rectangle here。 Alnitak说,从那里,你可以将它拉伸成矩形。

答案 4 :(得分:1)

实验上,我发现由一个比内部矩形大sqrt(2)的矩形定义的椭圆起作用。因此将sqrt(2)传递给此函数,您将得到相应的矩形:

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

private RectangleF GetScaledRectangle(RectangleF rect,float scale) {     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);

}