屬于程序員的浪漫,一顆會跳動的心!!!

繪制一顆會跳動的心?? ? 嘿嘿

可以說是程序員的專屬浪漫了吧,就像點燃一顆LED燈一樣?(我瞎說的啊,大家別當真,我很菜的!!!!)

程序就在下面啦,然后我加了一些動態,會有點神秘感,有點緩沖

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?👇👇👇👇👇👇👇👇👇

import random
from math import sin, cos, pi, log
from tkinter import *Canvas_WIDTH = 640
Canvas_HEIGHT = 480
Canvas_CENTER_X = Canvas_WIDTH / 2
Canvas_CENTER_Y = Canvas_HEIGHT / 2
IMAGE_ENLARGE = 11
HEART_COLOR = "#FF99CC"class Heart:def __init__(self, generate_frame=40):self._points = []self._edge_diffusion_points = set()self._center_diffusion_points = set()self.all_points = []self.generate_frame = generate_frameself.build(2000)self.calc_all()def build(self, number):for _ in range(number):t = random.uniform(0, 2 * pi)x, y = heart_function(t)self._points.append((x, y))self._edge_diffusion_points.add((x, y))for _x, _y in list(self._points):for _ in range(3):x, y = scatter_inside(_x, _y, 0.3)self._edge_diffusion_points.add((x, y))point_list = list(self._points)for _ in range(4000):x, y = random.choice(point_list)x, y = scatter_inside(x, y, 0.17)self._center_diffusion_points.add((x, y))def calc_all(self):for frame in range(self.generate_frame):self.calc(frame)@staticmethoddef calc_position(x, y, ratio):force = 1 / (((x - Canvas_CENTER_X) ** 2 + (y - Canvas_CENTER_Y) ** 2) ** 0.520)dx = ratio * force * (x - Canvas_CENTER_X) + random.randint(-1, 1)dy = ratio * force * (y - Canvas_CENTER_Y) + random.randint(-1, 1)return x - dx, y - dydef calc(self, generate_frame):ratio = 10 * curve(generate_frame / 10 * pi)halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))halo_number = int(3000 + 4000 * abs(curve(generate_frame / 10 * pi)))all_points = []heart_halo_point = set()for _ in range(halo_number):t = random.uniform(0, 2 * pi)x, y = heart_function(t, shrink_ratio=11.6)x, y = shrink(x, y, halo_radius)if (x, y) not in heart_halo_point:heart_halo_point.add((x, y))x += random.randint(-14, 14)y += random.randint(-14, 14)size = random.choice((1, 2, 2))all_points.append((x, y, size))for x, y in self._points:x, y = self.calc_position(x, y, ratio)size = random.randint(1, 3)all_points.append((x, y, size))for x, y in self._edge_diffusion_points:x, y = self.calc_position(x, y, ratio)size = random.randint(1, 3)all_points.append((x, y, size))self.all_points.append(all_points)for x, y in self._center_diffusion_points:x, y = self.calc_position(x, y, ratio)size = random.randint(1, 3)all_points.append((x, y, size))self.all_points.append(all_points)def render(self, render_canvas, render_frame, display_points, final_look=False):points_to_display = self.all_points[render_frame % self.generate_frame][:display_points]for x, y, size in points_to_display:if final_look:render_canvas.create_oval(x, y, x + size, y + size, width=0, fill=HEART_COLOR, outline='')else:render_canvas.create_oval(x, y, x + size, y + size, width=0, fill=HEART_COLOR, outline='')def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):x = 16 * (sin(t) ** 3)y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))x *= shrink_ratioy *= shrink_ratiox += Canvas_CENTER_Xy += Canvas_CENTER_Yreturn int(x), int(y)def scatter_inside(x, y, beta=0.15):ratio_x = - beta * log(random.random())ratio_y = - beta * log(random.random())dx = ratio_x * (x - Canvas_CENTER_X)dy = ratio_y * (y - Canvas_CENTER_Y)return x - dx, y - dydef shrink(x, y, ratio):force = -1 / (((x - Canvas_CENTER_X) ** 2 + (y - Canvas_CENTER_Y) ** 2) ** 0.6)dx = ratio * force * (x - Canvas_CENTER_X)dy = ratio * force * (y - Canvas_CENTER_Y)return x - dx, y - dydef curve(p):return 2 * (2 * sin(4 * p)) / (2 * pi)def draw_text(canvas, text, font_size, color, x, y):canvas.create_text(x, y, text=text, font=("Helvetica", font_size), fill=color)def show_message(canvas, message, next_step, delay=2000):canvas.delete("all")draw_text(canvas, message, 20, "white", Canvas_CENTER_X, Canvas_CENTER_Y)canvas.after(delay, next_step)def countdown(canvas, count):if count > 0:canvas.delete("all")draw_text(canvas, f"{count}", 40, "white", Canvas_CENTER_X, Canvas_CENTER_Y)canvas.after(1000, countdown, canvas, count - 1)else:canvas.delete("all")canvas.after(100, start_animation, canvas)def start_animation(canvas):heart = Heart()animate_heart(canvas, heart)def animate_heart(canvas, render_heart, render_frame=0, display_points=0, final_look=False):canvas.delete("all")render_heart.render(canvas, render_frame, display_points, final_look)# draw_text(canvas, "520快樂", 20, "white", Canvas_CENTER_X, Canvas_CENTER_Y + 200)if not final_look:if display_points < len(render_heart.all_points[render_frame % render_heart.generate_frame]):display_points += 10  # Increase the number of displayed pointselse:final_look = True  # Switch to the final lookcanvas.after(20, animate_heart, canvas, render_heart, render_frame + 1, display_points, final_look)def prepare_start(canvas):show_message(canvas, "小呂同學專屬浪漫?", lambda: show_message(canvas, "準備好了嗎?", lambda: show_message(canvas, "要開始了!", lambda: countdown(canvas, 3))))if __name__ == '__main__':root = Tk()root.title("心動")canvas = Canvas(root, bg='black', height=Canvas_HEIGHT, width=Canvas_WIDTH)canvas.pack()prepare_start(canvas)root.mainloop()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16270.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hive結合Hbase實現實時數據處理和批量分析

問題背景 Hive主要設計為一個用于大數據集的批處理查詢引擎&#xff0c;并不是為實時查詢或實時數據更新而設計的。它主要用于執行數據摘要、查詢和分析。因此&#xff0c;Hive本身不支持實時數據更新或實時查詢&#xff0c;它更適合用于對大量數據進行批量處理和分析。 分析…

Java8Stream

目錄 什么是Stream? IO流&#xff1a; Java8Stream&#xff1a; 什么是流&#xff1f; stream圖解 獲取流 集合類&#xff0c;使用 Collection 接口下的 stream() 代碼 數組類&#xff0c;使用 Arrays 中的 stream() 方法 代碼 stream&#xff0c;使用 Stream 中的…

重生之 SpringBoot3 入門保姆級學習(02、打包部署)

重生之 SpringBoot3 入門保姆級學習&#xff08;02、打包部署&#xff09; 1.6 打包插件1.7 測試 jar 包1.8 application.properties 的相關配置 1.6 打包插件 官網鏈接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…

【Python】 XGBoost模型的使用案例及原理解析

原諒把你帶走的雨天 在漸漸模糊的窗前 每個人最后都要說再見 原諒被你帶走的永遠 微笑著容易過一天 也許是我已經 老了一點 那些日子你會不會舍不得 思念就像關不緊的門 空氣里有幸福的灰塵 否則為何閉上眼睛的時候 又全都想起了 誰都別說 讓我一個人躲一躲 你的承諾 我竟然沒懷…

自學動態規劃—— 一和零

一和零 474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 其實遇到這種還好說&#xff0c;我寧愿遇見這種&#xff0c;也不想遇見那些奇奇怪怪遞推公式的題目。 這里其實相當背包要滿足兩個條件&#xff0c;所以我們可以將dp開成二維的&#xff0c;之后的操作&#xff0…

Kubernetes(K8S) 集群環境搭建指南

Kubernetes&#xff08;簡稱K8s&#xff09;是一個開源的容器編排平臺&#xff0c;旨在自動化部署、擴展和管理容器化應用。K8S環境搭建過程比較復雜&#xff0c;涉及到非常多組件安裝和系統配置&#xff0c;本文將會詳細介紹如何在服務器上搭建好Kubernetes集群環境。 在學習…

C語言---求一個整數存儲在內存中的二進制中1的個數--3種方法

//編寫代碼實現&#xff1a;求一個整數存儲在內存中的二進制中1的個數 //第一種寫法 /*int count_bit_one(unsigned int n) {int count 0;while (n )//除到最后余數是0&#xff0c;那么這個循環就結束了{//這個題就是可以想成求15的二進制的過程//每次都除以2&#xff0c;余數…

跟小伙伴們說一下

因為很忙&#xff0c;有一段時間沒有更新了&#xff0c;這次先把菜鳥教程停更一下&#xff0c;因為自己要查缺補漏一些細節問題&#xff0c;而且為了方便大家0基礎也想學C語言&#xff0c;這里打算給大家開一個免費專欄&#xff0c;這里大家就可以好好學習啦&#xff0c;哪怕0基…

面試題·棧和隊列的相互實現·詳解

A. 用隊列實現棧 用隊列實現棧 實現代碼如下 看著是隊列&#xff0c;其實實際實現更接近數組模擬 typedef struct {int* queue1; // 第一個隊列int* queue2; // 第二個隊列int size; // 棧的大小int front1, rear1, front2, rear2; // 兩個隊列的首尾指針 } MyS…

圖像處理ASIC設計方法 筆記25 紅外成像技術:未來視覺的革命

在當今科技飛速發展的時代,紅外成像技術以其獨特的優勢,在醫療、工業檢測等多個領域扮演著越來越重要的角色。本章節(P146 第7章紅外焦平面非均勻性校正SoC)將深入探討紅外成像系統中的關鍵技術——非均勻性校正SoC,以及它如何推動紅外成像技術邁向新的高度。 紅外成像系統…

6.Redis之String命令

1.String類型基本介紹 redis 所有的 key 都是字符串, value 的類型是存在差異的~~ 一般來說,redis 遇到亂碼問題的概率更小~~ Redis 中的字符串,直接就是按照二進制數據的方式存儲的. (不會做任何的編碼轉換【講 mysql 的時候,知道 mysql 默認的字符集, 是拉丁文,插入中文…

Jenkins--從入門到入土

Jenkins–從入門到入土 文章目錄 Jenkins--從入門到入土〇、概念提要--什么是CI/DI&#xff1f;1、CI&#xff08;Continuous Integration&#xff0c;持續集成&#xff09;2、DI&#xff08;DevOps Integration&#xff0c;DevOps 集成&#xff09;3、解決的問題 一、Jenkins安…

iOS 開發系列:基于VNRecognizeTextRequest識別圖片文字

1.添加Vision Kit依賴 在項目設置中點擊"General"選項卡&#xff0c;然后在"Frameworks, Libraries, and Embedded Content"&#xff08;框架、庫和嵌入內容&#xff09;部分&#xff0c;點擊""按鈕。搜索并選擇"Vision.framework"。…

[AIGC] flink sql 消費kafka消息,然后寫到mysql中的demo

這是一個使用 Flink SQL 從 Kafka 中消費數據并寫入 MySQL 的示例。在這個示例中&#xff0c;我們將假設有一個 Kafka 主題 “input_topic”&#xff0c;它產生格式為 (user_id: int, item_id: int, behavior: string, timestamp: long) 的數據&#xff0c;我們需要把這些數據寫…

world machine學習筆記(4)

選擇設備&#xff1a; select acpect&#xff1a; heading&#xff1a;太陽的方向 elevation&#xff1a;太陽的高度 select colour&#xff1a;選擇顏色 select convexity&#xff1a;選擇突起&#xff08;曲率&#xff09; select height&#xff1a;選擇高度 falloff&a…

用常識滾雪球:拼多多的內生價值,九年的變與不變

2024年5月22日&#xff0c;拼多多公布了今年一季度財報&#xff0c;該季度拼多多集團營收868.1億元&#xff0c;同比增長131%&#xff0c;利潤306.0億&#xff0c;同比增長了202%&#xff0c;數據亮眼。 市場對拼多多經歷了“看不見”、“看不懂”、“跟不上”三個階段。拼多多…

Vue.js條件渲染與列表渲染指南

title: Vue.js條件渲染與列表渲染指南 date: 2024/5/26 20:11:49 updated: 2024/5/26 20:11:49 categories: 前端開發 tags: VueJS前端開發數據綁定列表渲染狀態管理路由配置性能優化 第1章&#xff1a;Vue.js基礎與環境設置 1.1 Vue.js簡介 Vue.js (讀音&#xff1a;/vju…

SwiftUI中的Slider的基本使用

在SwiftUI中&#xff0c;可以使用Slider視圖創建一個滑動條&#xff0c;允許用戶從范圍中選擇一個值。通過系統提供的Slider&#xff0c;用起來也很方便。 Slider 先看一個最簡單的初始化方法&#xff1a; State private var sliderValue: Float 100var body: some View {V…

[AIGC] mac os 中 .DS_Store 是什么

.DS_Store 是在 MacOS 系統中由 Finder 應用程序創建和維護的一種隱藏文件&#xff0c;用于保存有關其所在目錄的自定義屬性&#xff0c;例如圖標位置或背景顏色。 “.DS_Store” 是 “Desktop Services Store” 的縮寫。 .DS_Store 的作用 .DS_Store 文件在每個 Mac OS X 文…

ollama 使用,以及指定模型下載地址

ollama windows 使用 官網&#xff1a; https://ollama.com/ windows 指定 models 下載地址 默認會下載在C盤 &#xff0c;占用空間 在Windows系統中&#xff0c;可以通過設置環境變量OLLAMA_MODELS來指定模型文件的下載和存儲路徑。具體操作步驟如下&#xff1a; 1.打開系統…