NX Lab

Vectơ và ma trận: Vector3d, Matrix3x3 và tính khoảng cách, góc giữa hai vectơ

#Python#Toán hình1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Hầu hết hàm hình học trong NX nhận Vector3d hoặc Matrix3x3. Biết tính nhanh chuẩn, tích vô hướng, tích có hướng sẽ giúp bạn dựng mặt phẳng, kiểm tra song song, vuông góc.

    Vectơ và ma trận: Vector3d, Matrix3x3 và… Vectơ và ma trận: Vector3d, Matrix3x3 và…

    Các bước thực hiện

    1. Tạo vectơ. NXOpen.Vector3d(x, y, z).
    2. Tính độ dài và chuẩn hóa. Dùng math.sqrt hoặc hàm tự viết.
    3. Tích vô hướng và có hướng. Viết hàm nhỏ vì Vector3d chỉ là cấu trúc dữ liệu.
    4. Tính góc. acos của tích vô hướng chia tích độ dài.
    5. Kiểm tra song song/vuông góc. So sánh với dung sai nhỏ.

    Code tham khảo (Python)

    import math
    import NXOpen
    
    def dai(v):
        return math.sqrt(v.X * v.X + v.Y * v.Y + v.Z * v.Z)
    
    def chuan_hoa(v):
        d = dai(v)
        if d < 1e-12:
            raise ValueError("Vectơ có độ dài bằng 0")
        return NXOpen.Vector3d(v.X / d, v.Y / d, v.Z / d)
    
    def vo_huong(a, b):
        return a.X * b.X + a.Y * b.Y + a.Z * b.Z
    
    def co_huong(a, b):
        return NXOpen.Vector3d(a.Y * b.Z - a.Z * b.Y,
                               a.Z * b.X - a.X * b.Z,
                               a.X * b.Y - a.Y * b.X)
    
    def goc_do(a, b):
        c = vo_huong(a, b) / (dai(a) * dai(b))
        return math.degrees(math.acos(max(-1.0, min(1.0, c))))
    
    def vuong_goc(a, b, dung_sai=1e-6):
        return abs(vo_huong(chuan_hoa(a), chuan_hoa(b))) < dung_sai
    
    def khoang_cach(p, q):
        return math.sqrt((p.X - q.X) ** 2 + (p.Y - q.Y) ** 2 + (p.Z - q.Z) ** 2)
    
    def main():
        lw = NXOpen.Session.GetSession().ListingWindow
        lw.Open()
        a = NXOpen.Vector3d(1, 0, 0)
        b = NXOpen.Vector3d(1, 1, 0)
        n = co_huong(a, b)
        lw.WriteLine("Góc a-b = %.2f độ" % goc_do(a, b))
        lw.WriteLine("Pháp tuyến a x b = (%.2f, %.2f, %.2f)" % (n.X, n.Y, n.Z))
        lw.WriteLine("a vuông góc n? %s" % vuong_goc(a, n))
        lw.WriteLine("Khoảng cách: %.3f" % khoang_cach(NXOpen.Point3d(0, 0, 0), NXOpen.Point3d(3, 4, 0)))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Point3d và Vector3d là cấu trúc dữ liệu thuần; tính toán phải tự viết hoặc dùng session.MathUtils.
    • max(-1, min(1, c)) chặn sai số làm tròn có thể đưa giá trị ngoài [-1, 1] gây lỗi acos.
    • Tích có hướng của hai vectơ cho pháp tuyến mặt phẳng chứa chúng.

    Lỗi thường gặp

    • So sánh số thực bằng == gần như luôn sai; dùng dung sai.
    • Chuẩn hóa vectơ độ dài 0 gây chia cho 0; code trên đã chặn bằng ngoại lệ rõ ràng.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.