Maths101问题 - 有谁知道如何计算将包围给定矩形的椭圆(宽度/高度)。显然没有单一的椭圆 - 我是在一个能给出各种宽度/高度组合的算法之后 - 或者是椭圆的最小区域?这是一个GUI,所以我正在寻找一个美观的高度/宽度比。
提前致谢。
答案 0 :(得分:22)
如果你给椭圆提供与矩形相同的纵横比,你可以根据你想要的是一个包围正方形的圆然后拉伸,就像你已经将正方形转换成所需的矩形一样。
对于半边长度= 1的正方形,圆的半径为sqrt(2)。
因此,从0 - 360'扫过 theta ,椭圆的坐标点将为:
其中rect.width和rect.height是相关边的 half 宽度。
答案 1 :(得分:19)
这导致我们遵循方程组:
(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)
答案 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);
}