qq_42928304 2020-09-17 16:42 采纳率: 100%
浏览 230
已采纳

用Python matplot 绘制五角星平面

图片说明

求大神告知,怎么用matplot 画出五角星的平面,像是图片中圆形这样,由均匀分布的散点构成,但是形状是五角星型的。用其他包画也可以,主要是需要各个散点的坐标数据,用来做多目标优化测试。拜托啦,菜鸟感激不尽,实在查不到用什么公式表示x,y,z轴(Z轴可以不用管)。

  • 写回答

3条回答 默认 最新

  • 宁缺灬 2020-09-18 15:06
    关注

    构建五个外点和五个内点,向内延伸就好。看了你的图例,越外圈,精度越低,那么效果是这样
    图片说明

    以下是代码

    # -*- coding: utf-8 -*-
    """
    Created on Thu Sep 18 10:55:00 2020
    
    @author: Eikoh
    """
    import numpy as np
    import math
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    ax = plt.subplot(111, projection='3d')  # 创建一个三维的绘图工程
    r = 100                     #五角星顶点距离中心距离
    v = 4                       #
    l = math.floor(r / v)
    parr = [0,1,2,3,4]
    
    for j in range(l):
        data = [[],[],[]]
        #5个外点 5个内点
        for i in range(len(parr)):
            data[0].append(math.cos(math.pi * 0.4 * parr[i]) * r)
            data[1].append(math.sin(math.pi * 0.4 * parr[i]) * r)
            data[2].append(1)
            R = r * math.sin(math.pi * 0.1)/math.sin(math.pi * 0.2)
            data[0].append(math.cos(math.pi * 0.4 * parr[i] + math.pi * 0.2) * R)
            data[1].append(math.sin(math.pi * 0.4 * parr[i] + math.pi * 0.2) * R)
            data[2].append(1)
        r = r - v
        if r <= 0:
            break
        tdt = [[],[],[]]
        #边 散点
        for i in range(len(data[0])):
            cur = i
            if i == len(data[0]) - 1:
                nex = 0
            else:
                nex = i + 1  
    
            k = (data[1][nex] - data[1][cur]) / (data[0][nex] - data[0][cur])
            b = data[1][nex] - k * data[0][nex]
            xs = np.arange(data[0][cur],data[0][nex],(data[0][nex] - data[0][cur]) / 20)        #每条边由20个散点组成
            xs = xs[1:len(xs)]
            xy = []
            for j in range(len(xs)):
                tdt[0].append(xs[j])
                tdt[1].append(k * xs[j] + b)
                tdt[2].append(1)
        x, y, z = data[0],data[1],data[2]       #r间距下的10个顶点
        ax.scatter(x[:len(x)], y[:len(y)], z[:len(z)], c='b',s=1)  # 绘制数据点
        x, y, z = tdt[0],tdt[1],tdt[2]          #r间距下的所有边
        ax.scatter(x[:len(x)], y[:len(y)], z[:len(z)], c='b',s=1)  # 绘制数据点
    
    
    ax.set_zlabel('Z')  # 坐标轴
    ax.set_ylabel('Y')
    ax.set_xlabel('X')
    plt.show()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器