using UnityEngine;

public class CrossProductVisualizer : MonoBehaviour
{
    public Transform vectorAStart; // 向量A的起点
    public Transform vectorAEnd;   // 向量A的终点
    public Transform vectorBStart; // 向量B的起点
    public Transform vectorBEnd;   // 向量B的终点
    
    public Color vectorAColor = Color.red;
    public Color vectorBColor = Color.blue;
    public Color crossProductColor = Color.green;
    
    public float arrowHeadLength = 0.25f;
    public float arrowHeadAngle = 20.0f;
    
    void Update()
    {
        // 计算向量A和B
        Vector3 A = vectorAEnd.position - vectorAStart.position;
        Vector3 B = vectorBEnd.position - vectorBStart.position;
        
        // 计算叉乘结果
        Vector3 crossProduct = Vector3.Cross(A, B);
        
        // 在控制台打印向量和叉乘结果
        Debug.Log($"Vector A: {A}, Vector B: {B}, Cross Product: {crossProduct}");
    }
    
    void OnDrawGizmos()
    {
        if (vectorAStart == null || vectorAEnd == null || 
            vectorBStart == null || vectorBEnd == null) return;
            
        // 计算向量A和B
        Vector3 A = vectorAEnd.position - vectorAStart.position;
        Vector3 B = vectorBEnd.position - vectorBStart.position;
        
        // 计算叉乘结果
        Vector3 crossProduct = Vector3.Cross(A, B);
        
        // 绘制向量A
        Gizmos.color = vectorAColor;
        DrawArrow(vectorAStart.position, A);
        
        // 绘制向量B
        Gizmos.color = vectorBColor;
        DrawArrow(vectorBStart.position, B);
        
        // 绘制叉乘结果向量（从向量A的起点开始）
        Gizmos.color = crossProductColor;
        DrawArrow(vectorAStart.position, crossProduct);
        
        // 在场景视图中显示标签
        UnityEditor.Handles.Label(vectorAEnd.position, "A");
        UnityEditor.Handles.Label(vectorBEnd.position, "B");
        UnityEditor.Handles.Label(vectorAStart.position + crossProduct, "A × B");
    }
    
    // 绘制带箭头的向量
    void DrawArrow(Vector3 start, Vector3 direction)
    {
        if (direction.magnitude < 0.001f) return;
        
        Gizmos.DrawRay(start, direction);
        
        // 计算箭头方向
        Vector3 right = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) * Vector3.forward;
        Vector3 left = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) * Vector3.forward;
        
        // 绘制箭头
        Gizmos.DrawRay(start + direction, right * arrowHeadLength);
        Gizmos.DrawRay(start + direction, left * arrowHeadLength);
    }
}