如何等分椭圆的周长?

2024-10-01 02:21:07 发布

您现在位置:Python中文网/ 问答频道 /正文

类似的问题以前在这里也有,但没有一个简单到让我理解的程度。下面的代码以相等的角度间隔计算椭圆的点,并将相邻点之间的距离相加,得到近似的周长。然后,它将圆周分成10个假定相等的弧,并输出由分界点形成的角。在

from math import sqrt,cos,sin,radians

def distance(x1,y1,x2,y2):
    return sqrt((x2-x1)**2 + (y2-y1)**2)

a = 5
b = 3
x0 = a
y0 = 0
angle = 0
d = 0
while(angle<=360):
    x = a * cos(radians(angle))
    y = b * sin(radians(angle))
    d += distance(x0,y0,x,y)
    x0 = x
    y0 = y
    angle += 0.25
print "Circumference of ellipse = %f" %d
onetenth = d/10
angle = 0
x0 = a
y0 = 0
angle0 = 0.25
for i in range(10):
    dist = 0
    while(dist<onetenth):
        x = a * cos(radians(angle))
        y = b * sin(radians(angle))
        dist += distance(x0,y0,x,y)
        x0 = x
        y0 = y
        angle += 0.25
    print "%d : angle = %.2f\tdifference = %.2f" %(i+1,angle-0.25, angle-angle0)
    angle0 = angle

其输出:

^{pr2}$

但是这些角度并不能平均地划分圆周(picture)。我的逻辑/代码有什么问题,如何改进?在


Tags: 代码distsqrtsincosdistance角度x1
2条回答

程序将椭圆分成等长的圆弧,而不是等长的圆弧。在椭圆上,这是不一样的。在下面的代码中,我将每个段的距离添加到输出中以验证这一点。在

from math import sqrt,cos,sin,radians

def distance(x1,y1,x2,y2):
    return sqrt((x2-x1)**2 + (y2-y1)**2)

a = 5
b = 3
x0 = a
y0 = 0
angle = 0
d = 0
while(angle<=360):
    x = a * cos(radians(angle))
    y = b * sin(radians(angle))
    d += distance(x0,y0,x,y)
    x0 = x
    y0 = y
    angle += 0.25
print("Circumference of ellipse = {:f}".format(d))
onetenth = d/10
angle = 0
x0 = a
y0 = 0
angle0 = 0
for i in range(10):
    dist = 0
    while(dist<onetenth):
        angle += 0.025
        x = a * cos(radians(angle))
        y = b * sin(radians(angle))
        dist += distance(x0,y0,x,y)
        x0 = x
        y0 = y

    print(
        "{} : angle = {:.2f}\tdifference = {:.2f}\tDistance {:.2f}"
        .format(i+1,angle, angle-angle0,dist))
    angle0 = angle

样本输出:

^{pr2}$

请注意,如果将椭圆更改为圆(即a=b=5),则角度和距离将变得一致:

Circumference of ellipse = 31.415902
1 : angle = 36.00   difference = 36.00  Distance 3.14
2 : angle = 72.00   difference = 36.00  Distance 3.14
3 : angle = 108.00  difference = 36.00  Distance 3.14
4 : angle = 144.00  difference = 36.00  Distance 3.14
5 : angle = 180.00  difference = 36.00  Distance 3.14
6 : angle = 216.00  difference = 36.00  Distance 3.14
7 : angle = 252.00  difference = 36.00  Distance 3.14
8 : angle = 288.00  difference = 36.00  Distance 3.14
9 : angle = 324.00  difference = 36.00  Distance 3.14
10 : angle = 360.00 difference = 36.00  Distance 3.14

我还对代码做了一些小的调整。首先,我将循环中angle变量的增量移动到计算之前。在最后一次通过时,角度在所有计算完成后获得额外的增量。为了减少最终结果中的误差,我还使增量值变小。在

我是这个问题的负责人,我从评论中意识到我做了一个错误的假设。该程序利用椭圆参数方程计算x、y坐标。参数方程中的角度不是与x轴形成的角度。我以为它们在代码里是一样的。正确的代码是

from math import sqrt,cos,sin,atan2,radians,degrees

def distance(x1,y1,x2,y2):
    return sqrt((x2-x1)**2 + (y2-y1)**2)

a = 5
b = 3
x0 = a
y0 = 0
angle = 0
d = 0
while(angle<=360):
    x = a * cos(radians(angle))
    y = b * sin(radians(angle))
    d += distance(x0,y0,x,y)
    x0 = x
    y0 = y
    angle += 0.25
print "Circumference of ellipse = %f" %d
onetenth = d/10
angle = 0
x0 = a
y0 = 0
angle0 = 0
for i in range(10):
    dist = 0
    while(dist<onetenth):
        x = a * cos(radians(angle))
        y = b * sin(radians(angle))
        dist += distance(x0,y0,x,y)
        x0 = x
        y0 = y
        angle += 0.25
    xangle = degrees(atan2(y,x))
    print "%d : angle = %.2f\tdifference = %.2f" %(i+1, xangle, xangle-angle0)
    angle0 = xangle

它通过取点的x和y坐标的反正切来计算与x轴的夹角。其输出:

^{pr2}$

这些角把椭圆almost equally的周长分开。在

相关问题 更多 >