用python写一段多船避碰并绘图的代码
时间: 2024-02-18 07:32:36 浏览: 32
好的,下面是一段使用Python编写的多船避碰并绘图的代码,它基于Pygame和Matplotlib库:
```python
import pygame
import matplotlib.pyplot as plt
import numpy as np
# 定义船舶类
class Ship:
def __init__(self, id, pos, vel):
self.id = id # 船舶编号
self.pos = pos # 当前位置(x, y)
self.vel = vel # 当前速度(vx, vy)
self.size = 20 # 船舶大小
def move(self, delta_t):
# 根据速度更新位置
self.pos[0] += self.vel[0] * delta_t
self.pos[1] += self.vel[1] * delta_t
def distance(self, other):
# 计算两船之间的距离
dx = self.pos[0] - other.pos[0]
dy = self.pos[1] - other.pos[1]
return np.sqrt(dx ** 2 + dy ** 2)
def draw(self, screen):
# 在屏幕上绘制船舶
x, y = int(self.pos[0]), int(self.pos[1])
pygame.draw.circle(screen, (255, 0, 0), (x, y), self.size)
# 定义避碰算法
def avoid_collision(ships, delta_t):
for i in range(len(ships)):
for j in range(i+1, len(ships)):
dist = ships[i].distance(ships[j])
if dist < 2 * ships[i].size:
# 如果两船距离太近,就调整它们的速度
dx = ships[i].pos[0] - ships[j].pos[0]
dy = ships[i].pos[1] - ships[j].pos[1]
dvx = ships[i].vel[0] - ships[j].vel[0]
dvy = ships[i].vel[1] - ships[j].vel[1]
alpha = np.arctan2(dy, dx)
if np.abs(alpha) < np.pi / 2:
beta = np.arctan2(dvy, dvx)
theta = np.pi / 2 - alpha
phi = np.pi / 2 - beta - theta
v1 = np.sqrt(dvx ** 2 + dvy ** 2) * np.sin(phi) / np.sin(2 * theta)
v2 = np.sqrt((2 * ships[i].size - dist) / delta_t ** 2 + v1 ** 2)
ships[i].vel[0] = ships[j].vel[0] + v2 * np.cos(alpha)
ships[i].vel[1] = ships[j].vel[1] + v2 * np.sin(alpha)
# 初始化船舶和屏幕
pygame.init()
screen_size = (800, 600)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption("Multi-Ship Collision Avoidance")
# 创建船舶
pos = [[100, 100], [600, 100], [100, 400], [600, 400]]
vel = [[100, 0], [-100, 0], [0, 100], [0, -100]]
ships = [Ship(i+1, pos[i], vel[i]) for i in range(4)]
# 设置绘图参数
plt.axis([0, screen_size[0], screen_size[1], 0])
plt.ion()
# 开始模拟
delta_t = 0.1
while True:
# 绘制船舶
screen.fill((255, 255, 255))
for ship in ships:
ship.draw(screen)
pygame.display.update()
# 绘制轨迹
plt.clf()
for ship in ships:
plt.plot(ship.pos[0], ship.pos[1], 'ro')
plt.title("Multi-Ship Collision Avoidance")
plt.draw()
plt.pause(0.001)
# 更新船舶位置和速度
for ship in ships:
ship.move(delta_t)
avoid_collision(ships, delta_t)
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
plt.show()
pygame.quit()
quit()
```
这段代码模拟了四艘船在一个平面内的运动轨迹,并实现了避碰功能。运行代码后,你可以看到已经绘制好了四艘圆形的船舶,它们会自动避开靠近的船舶。此外,代码还使用Matplotlib库将船舶的运动轨迹绘制在一个图像中。
注意:这段代码并不完善,可能会出现一些不合适的情况,比如两艘船舶速度相差过大时可能会导致程序异常。如果你需要更为严谨的船舶避碰算法和实现,建议查阅相关的专业文献。