• 用PYTHON的PLT画了个月亮图,难得用到了圆和直线的知识


    难得用上了直线,圆这些知识

    以前总在想有了直角坐标为什么要学圆的极坐标,用了之后发现挺方便的

     参考 

    https://deepinout.com/matplotlib/matplotlib-geometry/matplotlib-drawing-an-arc-diagram.html

    https://matplotlib.org/2.1.2/gallery/index.html

    import matplotlib.pyplot as plt
    import matplotlib.ticker as ticker
    import math
    import numpy as np
    plt.rcParams['axes.facecolor']='#001846'
    linecolor = '#F3FF82'
    mooncolor = '#F3FF82'
    
    n=12
    fig, ax = plt.subplots(1,1)
    width = 3
    sr = 5.7 #smallercircleframeradius
    br = 7.3#biggercircleframeradius
    
    #x1, x2, y1, y2
    if n % 6 == 0:
        ax.plot([0,0],[sr,n], color = linecolor, linewidth = width)
        ax.plot([0,0],[-sr,-n], color = linecolor, linewidth = width)
    else:
        ax.plot([0, 0], [br, n], color=linecolor, linewidth=width)
        ax.plot([0, 0], [-br, -n], color=linecolor, linewidth=width)
    #ax.plot([3,n],[-3,-n], color = linecolor)
    
    #画小圆对应的长线段
    for y1 in range(-n, n+1, 6):
        #2。3象限
        x1 = -n
        k = y1/x1 #该直线的斜率
        #该直线与圆心在圆点,半径为r的圆的交点为 (x2, y2)
        x2 = -math.sqrt((sr*sr)/(1+k*k))#2、3象限是x2负数
        y2 = x2 * k
        ax.plot([x1, x2], [y1, y2], color=linecolor, linewidth = width)
    
        # 关于原点对称的对应的直线
        ax.plot([-x1, -x2], [-y1, -y2], color=linecolor, linewidth = width)
    
        # 画关于X轴Y轴对称的点对应的直线
        x1, y1 = y1, x1
        if x1 == 0 or x1 < 0: continue
        k = y1 / x1  # 该直线的斜率
        # 该直线与圆心在圆点,半径为r的圆的交点为 (x2, y2)
        x2 = math.sqrt((sr * sr) / (1 + k * k))  # y是负数
        y2 = x2 * k
    
        # 画关于X轴Y轴对称的点对应的直线
        ax.plot([x1, x2], [y1, y2], color=linecolor, linewidth = width)
        ax.plot([-x1, -x2], [-y1, -y2], color=linecolor, linewidth = width)
        ax.plot([-x1, -x2], [y1, y2], color=linecolor, linewidth = width)
        ax.plot([x1, x2], [-y1, -y2], color=linecolor, linewidth = width)
    
    #画大圆对应的短线段
    for y1 in range(-n+3, n+1, 6):
        #2。3象限
        x1 = -n
        k = y1/x1 #该直线的斜率
        #该直线与圆心在圆点,半径为r的圆的交点为 (x2, y2)
        x2 = -math.sqrt((br*br)/(1+k*k))#2、3象限是x2负数
        y2 = x2 * k
        ax.plot([x1, x2], [y1, y2], color=linecolor, linewidth = width)
    
        # 关于原点对称的对应的直线
        ax.plot([-x1, -x2], [-y1, -y2], color=linecolor, linewidth = width)
    
        # 画关于X轴Y轴对称的点对应的直线
        x1, y1 = y1, x1
        if x1 == 0 or x1 < 0: continue
        #print(x1, y1)
        k = y1 / x1  # 该直线的斜率
        # 该直线与圆心在圆点,半径为r的圆的交点为 (x2, y2)
        x2 = math.sqrt((br * br) / (1 + k * k)) #y是负数
        y2 = x2 * k
        # 画关于X轴Y轴对称的点对应的直线
        ax.plot([x1, x2], [y1, y2], color=linecolor, linewidth = width)
        ax.plot([-x1, -x2], [-y1, -y2], color=linecolor, linewidth = width)
        ax.plot([-x1, -x2], [y1, y2], color=linecolor, linewidth = width)
        ax.plot([x1, x2], [-y1, -y2], color=linecolor, linewidth = width)
    
    #下面画月亮
    base = 0.5 #月亮左边界的圆心
    R = 3 #半径
    #圆的参数方程
    theta = np.linspace(np.pi*(1/2-1/8), np.pi*(3/2+1/8), 500)
    x = base + R*np.cos(theta)
    y = R*np.sin(theta)
    ax.plot(x, y, color=mooncolor, linewidth = 0.0001)#画圆弧
    
    base2 = base + 1#月亮右边界的圆心
    R2 = 2.7#半径
    #tx,ty是这两个圆的交点,算出交点,然后算出弧度制,画圆弧
    tx = ((R**2-R2**2)+base2**2-base**2)/(2*(base2-base))
    ty = math.sqrt(R**2 - (tx - base)**2)
    #月亮右边界的圆心是(base2,0), 和(tx,ty)的直线转换成弧度
    begin = math.atan(ty/(tx-base2))
    end = 2*np.pi - begin#这里画个图就知道了,是一个大钝角,2π-begin
    
    theta = np.linspace(begin, end, 500)
    x2 = base2 + R2*np.cos(theta)
    y2 = R2*np.sin(theta)
    ax.plot(x2, y2, color=mooncolor, linewidth = 0.0001)
    
    #对月亮内部进行填充
    plt.fill_between(x, y, where=(-R+base < x) & (x < R+base), facecolor=mooncolor)
    plt.fill_between(x2, y2, where=(-R2+base2 < x2) & (x2 < R2+base2), facecolor='#001846')
    
    #坐标轴之类的设置
    ax.xaxis.set_major_locator(ticker.MultipleLocator(2))
    ax.yaxis.set_major_locator(ticker.MultipleLocator(2))
    
    plt.gca().set_aspect(1)
    plt.xlim(-n, n)
    plt.ylim(-n, n)
    
    ax.xaxis.set_major_locator(plt.NullLocator()) # 删除x轴刻度
    ax.yaxis.set_major_locator(plt.NullLocator()) # 删除y轴刻度
    
    #保存
    filename = 'profile' + str(n)
    plt.savefig(filename, bbox_inches='tight', dpi=800, pad_inches = 0)
    plt.show(dpi=1000)
  • 相关阅读:
    ubuntu安装Sogou输入法失败
    二进制转换与此平台上的长模式不兼容
    thinkpad e570 如何进入bios
    计算beta分布并画图(1)
    python利用pandas和xlrd读取excel,特征筛选列
    python利用jieba进行中文分词去停用词
    python利用heapq实现小顶堆(查找最大的N个元素)
    python根据索引删除内容并写入文本
    [Water]UVA 11792 Commando War
    [最大子序列和]Hdu 5280 Senior's Array
  • 原文地址:https://www.cnblogs.com/smatrchen/p/16294649.html
Copyright © 2020-2023  润新知