How to evenly distribute the circumference of an ellipse?

Similar questions were asked and answered earlier, but it’s not easy for me to understand. The code below calculates the ellipse points at equal angular intervals and sums the distances between adjacent points to get an approximate circle. Then he divides the circle into 10 supposedly equal arcs and gives out the angles created by the dividing points.

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

It outputs the result:

Circumference of ellipse = 25.526979
1 : angle = 43.00       difference = 43.00
2 : angle = 75.50       difference = 32.50
3 : angle = 105.00      difference = 29.50
4 : angle = 137.50      difference = 32.50
5 : angle = 180.75      difference = 43.25
6 : angle = 223.75      difference = 43.00
7 : angle = 256.00      difference = 32.25
8 : angle = 285.50      difference = 29.50
9 : angle = 318.00      difference = 32.50
10 : angle = 361.50     difference = 43.50

But these angles do not divide the circle equally ( picture ). What is wrong with my logic / code and how can I improve it?

+4
source share
2 answers

, , . x y. , . , .

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

, . :

Circumference of ellipse = 25.526979
1 : angle = 29.23       difference = 29.23
2 : angle = 66.68       difference = 37.46
3 : angle = 114.06      difference = 47.38
4 : angle = 151.20      difference = 37.13
5 : angle = -179.55     difference = -330.75
6 : angle = -150.13     difference = 29.42
7 : angle = -112.57     difference = 37.56
8 : angle = -65.19      difference = 47.37
9 : angle = -28.38      difference = 36.81
10 : angle = 0.90       difference = 29.28

.

+1

, . . , .

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

:

Circumference of ellipse = 25.526979
1 : angle = 42.99   difference = 42.99  Distance 2.55
2 : angle = 75.27   difference = 32.28  Distance 2.55
3 : angle = 104.73  difference = 29.46  Distance 2.55
4 : angle = 137.01  difference = 32.28  Distance 2.55
5 : angle = 180.01  difference = 42.99  Distance 2.55
6 : angle = 223.00  difference = 42.99  Distance 2.55
7 : angle = 255.28  difference = 32.28  Distance 2.55
8 : angle = 284.74  difference = 29.46  Distance 2.55
9 : angle = 317.02  difference = 32.28  Distance 2.55
10 : angle = 360.02 difference = 43.00  Distance 2.55

, (.. 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

. -, . . , .

0

Source: https://habr.com/ru/post/1678435/


All Articles