Viết chương trình tính toán với vectơ trong không gian Oxyz bằng Python

Bài viết này chỉ là chia sẻ code, thuật toán khá tường minh rồi, còn phần giải thích và ví dụ minh họa đã được trình bày kỹ trong video, mời các bạn xem qua và góp ý giùm để code thêm hoàn thiện.

from sympy import *

class Point3D:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def show(self):
        #In tọa độ điểm ra thành tuple
        return (self.x, self.y, self.z)

class Vector3D:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def show(self):
        #In tọa độ vectơ ra thành tuple
        return (self.x, self.y, self.z)

    def length(self):
        #Tính độ dài vectơ
        return sqrt(self.x**2 + self.y**2 ++ self.z**2)

class Vector3DOperations:
    def sum(v1, v2):
        return Vector3D(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z)
    
    def subtract(v1, v2):
        return Vector3D(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z)
    
    def multiply(number, v):
        #Tích của một số với một vectơ
        return Vector3D(number*v.x, number*v.y, number*v.z)

    def dotProduct(v1, v2):
        #Tích vô hướng của hai vectơ
        return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z

    def vectorProduct(v1, v2):
        #Tích vô hướng của hai vectơ
        result_x = v1.y*v2.z - v2.y*v1.z
        result_y = v1.z*v2.x - v2.z*v1.x
        result_z = v1.x*v2.y - v2.x*v1.y
        return Vector3D(result_x, result_y, result_z)

    def mixedProduct(v1, v2, v3):
        #Tích hỗn tạp của ba vectơ (v1 x v2) . v3
        v4 = Vector3DOperations.vectorProduct(v1, v2) #Tích có hướng v1 x v2
        return Vector3DOperations.dotProduct(v4, v3)

    def angle(v1, v2):
        #Góc giữa hai vectơ, mặc định là radian
        dot = Vector3DOperations.dotProduct(v1, v2)
        if v1.length()==0 or v2.length()==0:
            return 0
        cos_angle = dot/(v1.length()*v2.length())
        return acos(cos_angle)

class Vector3DApplications:
    def areaTriangle(A, B, C):
        #Tính diện tích tam giác ABC
        AB = Vector3DOperations.subtract(B, A)
        AC = Vector3DOperations.subtract(C, A)
        return Vector3DOperations.vectorProduct(AB, AC).length()/2
    
    def areaParallelogram(A, B, C, D):
        #Tính diện tích hình bình hành ABCD
        AB = Vector3DOperations.subtract(B, A)
        AD = Vector3DOperations.subtract(D, A)
        return Vector3DOperations.vectorProduct(AB, AD).length()
    
    def volumeTriangularPyramid(A, B, C, D):
        #Tính thể tích tứ diện ABCD
        AB = Vector3DOperations.subtract(B, A)
        AC = Vector3DOperations.subtract(C, A)
        AD = Vector3DOperations.subtract(D, A)
        return Abs(Vector3DOperations.mixedProduct(AB, AC, AD))/6

Bình luận

Chia sẻ