2026. június 9., kedd

3D autó


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