import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
def draw_car():
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')
# 1. Karosszéria pontok (3D koordináták)
car_body = np.array([
[-1.5, -0.8, -0.5], # 0: bal hátsó alsó
[ 1.5, -0.8, -0.5], # 1: jobb hátsó alsó
[ 1.5, 0.8, -0.5], # 2: jobb első alsó
[-1.5, 0.8, -0.5], # 3: bal első alsó
[-1.5, -0.8, 0.3], # 4: bal hátsó felső
[ 1.0, -0.8, 0.3], # 5: jobb hátsó felső
[ 1.0, 0.8, 0.3], # 6: jobb első felső
[-1.5, 0.8, 0.3], # 7: bal első felső
[-0.5, -0.8, 0.8], # 8: tető hátsó
[ 0.5, -0.8, 0.8], # 9: tető jobb
[ 0.5, 0.8, 0.8], # 10: tető első
[-0.5, 0.8, 0.8] # 11: tető bal
])
# Az oldalak és a tető meghatározása pontindexek alapján
faces = [
[0, 1, 2, 3], # Alváz
[4, 5, 6, 7], # Törzs felső része
[8, 9, 10, 11], # Tető
[0, 3, 7, 4], # Hátfal
[1, 2, 6, 5], # Orrfal
[3, 2, 6, 7], # Jobb oldal
[0, 1, 5, 4], # Bal oldal
[4, 5, 9, 8], # Hátsó szélvédő
[7, 6, 10, 11], # Első szélvédő
]
# Karosszéria rajzolása
body_collection = Poly3DCollection([car_body[face] for face in faces], alpha=0.6)
body_collection.set_facecolor('red')
body_collection.set_edgecolor('black')
ax.add_collection3d(body_collection)
# 2. Kerekek rajzolása (hengerekkel)
wheel_radius = 0.3
wheel_width = 0.2
# [x, y, z] koordináták a 4 kerékhez
wheel_positions = [
[-1.1, -0.8, -0.5], # Bal hátsó
[ 1.1, -0.8, -0.5], # Jobb hátsó
[-1.1, 0.8, -0.5], # Bal első
[ 1.1, 0.8, -0.5] # Jobb első
]
theta = np.linspace(0, 2 * np.pi, 20)
z_values = np.linspace(-wheel_width/2, wheel_width/2, 10)
theta, z_values = np.meshgrid(theta, z_values)
for wx, wy, wz in wheel_positions:
# Henger felület egyenletek
x_circle = wheel_radius * np.cos(theta) + wx
y_circle = np.full_like(theta, wy) + z_values
z_circle = wheel_radius * np.sin(theta) + wz
ax.plot_surface(x_circle, y_circle, z_circle, color='darkgray', edgecolor='black')
# Tengelyek beállítása
ax.set_xlabel('X tengely')
ax.set_ylabel('Y tengely')
ax.set_zlabel('Z tengely')
# Grafikon határok beállítása, hogy arányos legyen
ax.set_box_aspect([3, 2, 2])
ax.set_xlim([-2, 2])
ax.set_ylim([-2, 2])
ax.set_zlim([-1, 1.5])
plt.title("3D Autó - Matplotlib")
plt.show()
if __name__ == "__main__":
draw_car()
Nincsenek megjegyzések:
Megjegyzés küldése