作品:《用Python创建飓风模拟器》

作品:《用Python创建飓风模拟器》

Shuhang Luan Archie

Completed Image:

Introduction:

《飓风模拟器》,Python代码项目,参考选自Nifty Assignments 2018 -斯坦福计算机科学SIGCSE。

玩法:提供五个时期的飓风路线模拟动画,用户可通过选择,来播放某一时期的飓风动态,并展示其速度、路线、等级等信息。

Design thinking:

背景与启动函数制作

  • 首先以turtle库为基本库绘制图像:
1
import turtle 
  • 创建启动函数,包括创建一个turtle对象和一个屏幕对象,设置坐标系统以匹配经纬度,并显示地图的背景图像。
  • 该函数返回一个元组,其中包含turtle对象、屏幕对象和地图背景图像。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def hurricane_setup():

import tkinter

# set size of window to size of map
turtle.setup(965, 600)

wn = turtle.Screen()
wn.title("Hurricane Tracker")

# kludge to get the map shown as a background image,
# since wn.bgpic does not allow you to position the image
canvas = wn.getcanvas()

# set the coordinate system to match lat/long
# DRF - parameters are llx lly urx ury (lower left and upper right)
turtle.setworldcoordinates(-90, 0, -17.66, 45)

# DRF - Windows only supports gif, pgm, ppm unless you use the PIL library
map_bg_img = tkinter.PhotoImage(file="images/atlantic-basin.gif")

# additional kludge for positioning the background image
# when setworldcoordinates is used
canvas.create_image(-1175, -580, anchor=tkinter.NW, image=map_bg_img)

t = turtle.Turtle()
wn.register_shape("images/hurricane.gif")
t.shape("images/hurricane.gif")

return (t, wn, map_bg_img)
  • 定义飓风函数,首先开启地图
1
2
def hurricane():
(t, wn, map_bg_img) = hurricane_setup()

列表读取与设定

  • 定义了一个包含了五个数据文件的列表 files

  • 然后,使用while 循环,让用户选择一个数据文件进行处理

  • 当用户输入选择的文件编号后,代码将读取该文件中的数据并存储到一个名为 data 的列表中

1
2
3
4
5
6
7
8
9
# 读取数据文件
files = ['newdata/florence2018.csv', 'newdata/dorian2019.csv', 'newdata/irma2017.csv', 'newdata/jose2017.csv', 'newdata/michael2018.csv']
while True:
for x in range(len(files)):
print(f"{x + 1}) {files[x][8:]}")

file_number =int(input("Which file do you want to play? please enter a number(1 to 5):"))
if 0 <= file_number - 1 < len(files):
data = []
  • 使用“with open(file)as f:”语法,它可以自动关闭文件,从而避免了因为忘记关闭文件而导致的错误
  • 使用 ”f.readlines()“ 函数将文件内容逐行读取到一个列表 f_csv 中
  • 接着,使用一个 for 循环遍历 f_csv 中的每一行,并用 “enumerate()” 函数获取并定义行和高
  • 最后跳过第一行(名称)
1
2
3
4
5
6
7
8
9
10
11
12
13
file = files[file_number-1]
print("Roger that...wait please")
with open(file) as f:
f_csv = f.readlines()

# set line and column
for i, column in enumerate(f_csv):
# use the enumerate function can get all the line number(enumerate = line number)
# i = line number(the first variable)
# skip headline:
column = column.split(",")
if i == 0:
continue

建立函数内新列表

  • 将需要用到的数据,进行整理,并合成一个新的列表
1
2
3
4
5
6
7
# set position,wind_speed,category:
# coordinates =(Lon, Lat)
position = float(column[3]), float(column[2])
category = column[-1][:-1]
wind_speed = column[4][:-3]
# group a new data(csv)
data.append([position, category, wind_speed])

设置绘图判定

  • 使用for循环进行判定,根据数据调节颜色、宽度、速度等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
for i in range(len(data)):
position = data[i][0]
category = data[i][1]
wind_speed = data[i][2]
t.speed(10 - (float(wind_speed) * (2 / 37)))

if category == '-':
t.color('white')
t.pensize(1)
elif category == '1':
t.color('blue')
t.pensize(2)
elif category == '2':
t.color('green')
t.pensize(4)
elif category == '3':
t.color('yellow')
t.pensize(6)
elif category == '4':
t.color('orange')
t.pensize(8)
elif category == '5':
t.color('red')
t.pensize(10)

if category != '-':
t.write(data[i][1], font=("Arial", 10, "normal"))
t.goto(position)

if i == 0:
t.pd()
t.pu()
  • 通过判定,用户输入值在正确范围内的,进行绘制;输入0,为退出;输入其他错误,则会提示重新修改!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        elif -1 > file_number-1 :
print("Sorry,Invalid file number...")
print("Please try again...")

elif file_number - 1 >= len(files):
print("Wrong! Wrong! Wrong!")
print("Try again!")

elif file_number == 0:
print("Bye~")
exit()

def main():
hurricane()

main()
  • 完成!

输入值截图:

  • Title: 作品:《用Python创建飓风模拟器》
  • Author: Shuhang Luan
  • Created at: 2022-12-20 16:05:07
  • Updated at: 2023-03-19 10:35:01
  • Link: https://archieluan.github.io/2022/12/20/HurricaneStarter/
  • License: This work is licensed under CC BY-NC-SA 4.0.
推荐阅读
作品:《用Python创建罗马文字图形》 作品:《用Python创建罗马文字图形》 Documentation:《From Farm to Game: Implementation of Modular Material Technology in Organic Food Virtual Scenes》 Documentation:《From Farm to Game: Implementation of Modular Material Technology in Organic Food Virtual Scenes》 作品:《在Maya和UE5中制作批量重命名工具》 作品:《在Maya和UE5中制作批量重命名工具》
 Comments