Math 包围矩形的椭圆
数学101题-有人知道如何计算一个椭圆(宽度/高度),它将包围一个给定的矩形。很明显,没有单一的椭圆——我在寻找一种算法,它将给我各种宽度/高度组合——或者可能是椭圆的最小面积?这是一个图形用户界面,所以我想要的是一个美观的高宽比Math 包围矩形的椭圆,math,Math,数学101题-有人知道如何计算一个椭圆(宽度/高度),它将包围一个给定的矩形。很明显,没有单一的椭圆——我在寻找一种算法,它将给我各种宽度/高度组合——或者可能是椭圆的最小面积?这是一个图形用户界面,所以我想要的是一个美观的高宽比 提前感谢。如果您将椭圆的长宽比设置为与矩形相同的长宽比,那么您可以在这样的基础上工作:您想要的是一个包围正方形的圆,然后将其拉伸,就像您已将正方形转换为所需的矩形一样 对于一半边长=1的正方形,圆的半径为sqrt(2) 因此,从0-360'扫掠θ,椭圆的坐标点为:
提前感谢。如果您将椭圆的长宽比设置为与矩形相同的长宽比,那么您可以在这样的基础上工作:您想要的是一个包围正方形的圆,然后将其拉伸,就像您已将正方形转换为所需的矩形一样 对于一半边长=1的正方形,圆的半径为sqrt(2) 因此,从0-360'扫掠θ,椭圆的坐标点为:
- x=cos(θ)*sqrt(2)*矩形宽度+x中心李>
- y=sin(θ)*sqrt(2)*直线高度+y中心李>
其中,rect.width和rect.height是相关边的一半宽度。假设您指的是外切(比“封闭”更精确),您可以阅读。从那里,你可以把它拉伸成矩形,就像Alnitak说的那样。以原点为中心的椭圆方程是
(x/A)^2 + (y/B)^2 = 1
现在,如果您想用eclipse将MxN矩形括起来,可以将其中心移动到坐标原点。右上角的坐标是(M/2,N/2)
,在椭圆方程中,你可以使用一个公式来求解给定a(或给定B)的B
如果你有一个4x2的矩形,右上角的坐标是(2,1),替换为
(2/a)^2+(1/B)^2=1
,那么如果a=4
求解B得到B=1/sqrt(1-(1/2)^2)
,实验上,我发现由比内部矩形大的矩形定义的椭圆可以工作。因此,将sqrt(2)传递给此函数,您将得到相应的矩形:
RectangleF boundingEllipse=GetScaledRectangle(innerRect,Convert.ToSingle(Math.Sqrt(2d))
私有矩形F GetScaledRectangle(矩形F rect,浮动比例)
{
浮动宽度=矩形宽度*比例;
浮动高度=垂直高度*刻度
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);
}
(x/A)^2+(y/B)^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)
示例:
事实上,它还不太正确——我还在研究它……好的,我想数学现在确实正确了。我已经在Grapher.app上测试了公式,这是完美的。为了明确起见,只需将矩形的尺寸乘以sqrt(2)即可获得边界椭圆的尺寸。如果要更改纵横比,可以使用宽度'=sqrt(矩形宽度^2+比率^2*矩形高度^2)和高度'=宽度'/ratio,其中比率是请求的纵横比(宽度/高度)对于椭圆,我最近也遇到了同样的(编程)问题,在将问题发布到数学后,我发现了这个答案。如果还有人对此感兴趣,我认为我们有一个更普遍的解决方案,请参阅上面JeanMarie的答案,以便进行完整的讨论。请注意,您的“sqrt(2)答案”对应于我们的n=1案例。感谢您的解释-现在完全有意义了。蜥蜴比尔。数学和编程之间的界限充其量是模糊的,在这种情况下,这与编程完全相关。我需要画一个矩形内的渐变。最好的方法是确定椭圆上的点,椭圆外接我的矩形。砰。数学,很烂,和编程无关。回答这个问题的关键是从矩形定义坐标中获取椭圆定义坐标。这个问题的答案是一个数学公式,而不是一个算法。如果它与编程无关,为什么我突然想知道这个问题的答案,而我为什么只想在编程或数学课上知道这类问题的答案,为什么谷歌搜索这个问题的数学答案会让我最接近这个编程网站?在我看来,把这个话题划掉的决定是应用了一个过于字面的定义。