python实现椭圆等分

 直录代码

from math import sqrt, cos, sin, radians


def distance(point1, point2):
    x1, y1 = point1[0], point1[1]
    x2, y2 = point2[0], point2[1]
    return sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)  # 两点距离


def get_circumference_of_ellipse(a, b, point, angle=0, kama=0.25):
    """
    
    :param a: 长轴
    :param b: 短轴
    :param point: 起始点
    :param angle: 弧度
    :param kama: 偏移量
    :return: 周长
    """
    ellipse = 0
    x0, y0 = point[0], point[1]
    while (angle <= 360):
        x = a * cos(radians(angle))  # 弧度360/2π
        y = b * sin(radians(angle))
        ellipse += distance((x0, y0), (x, y))
        x0, y0 = x, y
        angle += kama
    return ellipse


ellipse = get_circumference_of_ellipse(5, 5, (5, 0))
print("Circumference of ellipse = %f" % ellipse)


def get_position(ellipse, divide, a, b, point, angle=0, angle0=0.25, kama=0.25):
    """

    :param ellipse: 周长
    :param divide:  等分
    :param a: 长轴
    :param b: 短轴
    :param point: 起始点
    :param angle: 弧度
    :param angle0: 游动弧度
    :param kama: 偏移量
    :return:
    """
    list_xy = []
    list_x = []
    list_y = []
    x0, y0 = point[0], point[1]
    onetenth = ellipse / divide
    for i in range(int(divide)):
        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 += kama
        print("%d : angle = %.2f\t angle0 = %.2f\tdifference = %.2f" % (i + 1, angle - kama, angle0, angle - angle0))
        angle0 = angle
        print((float(x0), float(y0)))
        list_xy.append((float(x0), float(y0)))
        list_x.append(float(x0))
        list_y.append(float(y0))
    return list_xy, list_y, list_x


# 使用matplotlib将坐标可视化
import numpy as np
import matplotlib.pyplot as mpl
# 使用matplotlib将坐标可视化
list_xy, list_y, list_x = get_position(ellipse, 100, 5, 3, (5, 0))
x = np.array(list_x)
y = np.array(list_y)
mpl.rcParams['font.family'] = 'sans-serif'
mpl.rcParams['font.sans-serif'] = 'NSimSun,Times New Roman'
for i in range(len(list_x) - 1):
    dx = list_x[i + 1] - list_x[i]
    dy = list_y[i + 1] - list_y[i]
    mpl.quiver(list_x[i], list_y[i], dx, dy, angles='xy', scale=1.003, scale_units='xy', width=0.002)
mpl.show()

点到点的箭头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**星光*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值