pygame绘制繁花曲线

news2024/9/23 19:20:45

------------★Pygame系列教程★------------

Pygame教程01:初识pygame游戏模块
Pygame教程02:图片的加载+缩放+旋转+显示操作
Pygame教程03:文本显示+字体加载+transform方法
Pygame教程04:使用pygame.draw绘制矩形、多边形、圆、椭圆、弧线、直线和线条等
在这里插入图片描述

# @Author : 小红牛
# 微信公众号:WdPython
import math
import random
import pygame
from pygame.locals import *

'''
功能:
    已知圆的圆心和半径,获取某弧度对应的圆上点的坐标
入参:
    center:圆心
    radius:半径
    radian:弧度
'''
def get_point_in_circle(center, radius, radian):
    return (center[0] + radius * math.cos(radian), center[1] - radius * math.sin(radian))

'''
功能:
    内外圆A和B,内圆A沿着外圆B的内圈滚动,已知外圆圆心、半径,已知内圆半径、公转弧度,已知绕点半径,计算绕点坐标
入参:
    center_A:外圆圆心
    radius_A:外圆半径
    radius_B:内圆半径
    radius_C:绕点半径
    radian:公转弧度
'''
def get_point_in_child_circle(center_A, radius_A, radius_B, radius_C, radian):
    # 计算内圆圆心坐标
    center_B = get_point_in_circle(center_A, radius_A - radius_B, radian)
    # 计算绕点弧度(公转为逆时针,则自转为顺时针)
    radian_C = 2.0*math.pi - ((radius_A / radius_B * radian) % (2.0*math.pi))
    # 计算绕点坐标
    center_C = get_point_in_circle(center_B, radius_C, radian_C)
    center_B_Int = (int(center_B[0]), int(center_B[1]))
    return center_B_Int, center_C

''' 计算两点距离(平方和) '''
def get_instance(p1, p2):
    return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1])

'''
功能:
    获取绕点路径的所有点的坐标
入参:
    center:外圆圆心
    radius_A:外圆半径
    radius_B:内圆半径
    radius_C:绕点半径
    shift_radian:每次偏移的弧度,默认0.01,值越小,精度越高,计算量越大
'''
def get_points(center_A, radius_A, radius_B, radius_C, shift_radian=0.01):
    # 转为实数
    radius_A *= 1.0
    radius_B *= 1.0
    radius_C *= 1.0

    P2 = 2*math.pi # 一圈的弧度为 2PI
    R_PER_ROUND = int(P2/shift_radian) + 1 # 一圈需要走多少步(弧度偏移多少次)

    # 第一圈的起点坐标
    start_center, start_point = get_point_in_child_circle(center_A, radius_A, radius_B, radius_C, 0)
    points = [start_point]
    centers = [start_center]
    # 第一圈的路径坐标
    for r in range(1, R_PER_ROUND):
        center, point = get_point_in_child_circle(center_A, radius_A, radius_B, radius_C, shift_radian*r)
        points.append(point)
        centers.append(center)

    # 以圈为单位,每圈的起始弧度为 2PI*round,某圈的起点坐标与第一圈的起点坐标距离在一定范围内,认为路径结束
    for round in range(1, 100):
        s_radian = round*P2
        s_center, s_point = get_point_in_child_circle(center_A, radius_A, radius_B, radius_C, s_radian)
        if get_instance(s_point, start_point) < 0.1:
            break
        points.append(s_point)
        centers.append(s_center)
        for r in range(1, R_PER_ROUND):
            center, point = get_point_in_child_circle(center_A, radius_A, radius_B, radius_C, s_radian + shift_radian*r)
            points.append(point)
            centers.append(center)

    print(len(points)/R_PER_ROUND)

    return centers, points

pygame.init()
screen = pygame.display.set_mode((600, 400))
clock = pygame.time.Clock()

color_black = (0, 0, 0)
color_white = (255, 255, 255)
color_red = (255, 0, 0)
color_yello = (255, 255, 0)

center = (300, 200)
radius_A = 150
radius_B = 110
radius_C = 50

test_centers, test_points = get_points(center, radius_A, radius_B, radius_C)
test_idx = 2
draw_point_num_per_tti = 5

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)

    screen.fill(color_white)

    pygame.draw.circle(screen, color_black, center, int(radius_A), 2)

    if test_idx <= len(test_points):
        pygame.draw.aalines(screen, (0, 0, 255), False, test_points[:test_idx], 1)
        if test_idx < len(test_centers):
            pygame.draw.circle(screen, color_black, test_centers[test_idx], int(radius_B), 1)
            pygame.draw.aaline(screen, color_black, test_centers[test_idx], test_points[test_idx], 1)
        test_idx = min(test_idx + draw_point_num_per_tti, len(test_points))

    clock.tick(50)
    pygame.display.flip()

完毕!!感谢您的收看

----------★★历史博文集合★★----------

Python入门篇 进阶篇 视频教程 Py安装

py项目 Python模块 Python爬虫 Json

Xpath 正则表达式 Selenium Etree Css

Gui程序开发 Tkinter Pyqt5 列表元组字典

数据可视化 matplotlib 词云图 Pyecharts

海龟画图 Pandas Bug处理 电脑小知识

office自动化办公 编程工具 NumPy Pygame

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DDD】学习笔记-聚合和聚合根:怎样设计聚合?

今天我们来学习聚合&#xff08;Aggregate&#xff09;和聚合根&#xff08;AggregateRoot&#xff09;。 我们先回顾下上一讲&#xff0c;在事件风暴中&#xff0c;我们会根据一些业务操作和行为找出实体&#xff08;Entity&#xff09;或值对象&#xff08;ValueObject&…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:禁用控制)

组件是否可交互&#xff0c;可交互状态下响应点击事件、触摸事件、拖拽事件、按键事件、焦点事件和鼠标事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 enabled enabled(value: boolean) 设置组…

SqlServer配置定时备份

在企业系统环境中&#xff0c;为了确保SQL Server数据库受到意外的人为错误、系统故障、病毒攻击等因素的影响&#xff0c;我们通常会选择定期备份数据库。但是随着时间尺度的拉长&#xff0c;如果每次备份都要去手动执行一次的话&#xff0c;可能会觉得有些麻烦&#xff0c;或…

网页版图像处理软件开发服务:助您项目在市场竞争中脱颖而出

在当今数字化时代&#xff0c;图像处理在各个行业中扮演着重要的角色&#xff0c;虎克专注于提供定制化的网页版图像处理软件开发服务&#xff0c;为您的项目保驾护航。 1.网页版图像处理软件的定制化需求 1.1行业特定功能 针对不同的业务需求&#xff0c;深入了解行业特点&…

MapFi:面向室内定位的Wi-Fi基础设施自主地图构建

文献来源&#xff1a; X. Tong, H. Wang, X. Liu and W. Qu, "MapFi: Autonomous Mapping of Wi-Fi Infrastructure for Indoor Localization," in IEEE Transactions on Mobile Computing, vol. 22, no. 3, pp. 1566-1580, 1 March 2023, doi: 10.1109/TMC.2021.31…

FastAPI 的 quickstart

从这一章往后我们就正式开始学习 FastAPI 了 代码 FastAPI 环境安装 python 环境安装 根据要求至少需要 python 3.8及其以上&#xff0c;可以去 python 官网 自行下载安装, 本文中我们用 python 3.11 FastAPI 环境安装 pip install fastapi pip install "uvicorn[sta…

【Java程序设计】【C00322】基于Springboot的高校竞赛管理系统(有论文)

基于Springboot的高校竞赛管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校竞赛管理系统&#xff0c;本系统有管理员、老师、专家以及用户四种角色&#xff1b; 管理员&#xff1a;首页、个人中心、管…

Stable Cascade又升级了,现在只需要两个模型

Stable Cascade这个模型&#xff0c;大家如果还有印象的话&#xff0c;是需要下载三个模型的&#xff0c;分别是Stage_a,Stage_b和Stage_c,如果全都下载下来&#xff0c;需要20多个G&#xff0c;但是最近使用ComfyUI做尝试的时候&#xff0c;发现官方的案例中已经没有用到单独的…

Redis是单线程还是多线程?

单线程为什么这么快的原因&#xff1a; 后来引入了多线程是因为&#xff1a;

微信小程序云开发教程——墨刀原型工具入门(动态组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

[Linux]如何理解kernel、shell、bash

文章目录 概念总览kernelshell&bash 概念总览 内核(kernel) &#xff0c;外壳(shell) &#xff0c;bash kernel kernel是指操作系统中的核心部分&#xff0c;用户一般是不能直接使用kernel的。它主要负责管理硬件资源和提供系统服务&#xff0c;如内存管理、进程管理、文件…

Python列表中添加删除元素不走弯路

1.append() 向列表中添加单个元素&#xff0c;一般用于尾部追加 list1 ["香妃", "乾隆", "贾南风", "赵飞燕", "汉武帝"]list1.append("周瑜") print(list1) # [香妃, 乾隆, 贾南风, 赵飞燕, 汉武帝, 周瑜]…

bootstrap-table 多层组合表头

如下图所示的二层组合表头 来人&#xff0c;上代码&#xff01; table.bootstrapTable({url: $.fn.bootstrapTable.defaults.extend.index_url,pk: id,sortName: id,search: false,showToggle: false,showColumns: false,showExport: false, commonSearch: false,columns: [[…

Linux笔记-1

概述 简介 Linux是现在服务器上最常用的操作系统(OS - Operating system) - 所谓的操作系统本质上也是一个软件&#xff0c;是一个可以运行其他软件的容器如果一台服务器&#xff0c;没有安装操作系统&#xff0c;此时称之为裸机。裸机可以使用&#xff0c;在使用的时候需要使…

禅道:提bug、管理case 7.0

一、禅道的介绍 &#xff08;1&#xff09;定义禅道是一个项目管理工具&#xff0c;也是一个bug管理工具&#xff0c;还是一个用例管理工具。 &#xff08;2&#xff09;作用&#xff1a;为了解决众多企业在管理中出现混乱&#xff0c;无序的现象&#xff0c;开发出来 &…

【MATLAB源码-第153期】基于matlab的OFDM系统插入导频和训练符号两种信道估计方式误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种高效的无线信号传输技术&#xff0c;广泛应用于现代通信系统&#xff0c;如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分…

小白学视觉 | 详解遗传算法 GA(Python实现代码)

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;详解遗传算法 GA&#xff08;Python实现代码&#xff09; 转自&#xff1a;机器之心 英文&#xff1a;www.analyticsvidhya.com/blog/2017/07/introduc…

提升户外LED显示屏散热效率的关键方法

LED显示屏在户外长时间使用时&#xff0c;散热成为一项关键问题。散热不仅影响显示屏的寿命&#xff0c;还可能导致显示效果下降甚至安全隐患。以下是提升户外LED显示屏散热效率的关键方法&#xff1a; 综合利用传热机理&#xff1a;LED显示屏的散热可以通过导热、对流和辐射等…

Julia语言中的位运算符、赋值运算符、算术运算符

算术运算符 # 使用基本的赋值运算符 a 10 println("a 的初始值是: $a") # 使用加法赋值运算符 a 5 println("a 加上 5 后的值是: $a") # 使用减法赋值运算符 - a - 3 println("a 减去 3 后的值是: $a") # 使用乘法赋值运算符…

【Python】进阶学习:pandas--isin()用法详解

【Python】进阶学习&#xff1a;pandas–isin()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…