向量的加法和减法运算

时间:2021-05-28 10:15:47
using System;
using System.Collections;
using System.Collections.Generic;


/**
 * 向量的加法和减法运算
 */
public class Vector3D
{
    public float x, y, z;
    public Vector3D(float x=0f,float y =0f,float z= 0f)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    public Vector3D(Vector3D vec)
    {
        this.x = vec.x;
        this.y = vec.y;
        this.z = vec.z;
    }
    public Vector3D add(Vector3D vec)
    {
        Vector3D ret = new Vector3D(x, y, z);
        ret.x += vec.x;
        ret.y += vec.y;
        ret.z += vec.z;
        return ret;
    }
    public Vector3D sub(Vector3D vec)
    {
        Vector3D ret = new Vector3D(x, y, z);
        ret.x -= vec.x;
        ret.y -= vec.y;
        ret.z -= vec.z;
        return ret;
    }

    //向量规范化(单位化),让向量的长度为1
    public void normalize()
    {
        float lenth = (float)Math.Sqrt(x * x + y * y + z * z);//取模
        x /= lenth;
        y /= lenth;
        z /= lenth;
    }
    public override string ToString()
    {
        return string.Format("(" + x + "," + y + "," + z + ")");
    }

    // 操作符重载
    public static Vector3D operator + (Vector3D lv,Vector3D rv)
    {
        return lv.add(rv);
    }
    public static Vector3D operator - (Vector3D lv,Vector3D rv)
    {
        return lv.sub(rv);
    }

}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/**
 * 自己写的Vector3D与u3d的Vector3比较验证是否正确
 */
public class NewBehaviourScript : MonoBehaviour
{
    public bool isEqual(Vector3D ov,Vector3 uv)
    {
        if (ov.x == uv.x && ov.y == uv.y && ov.z == uv.z)
        {
            return true;
        }
        return false;
    }
    // Start is called before the first frame update
    void Start()
    {
        Vector3D ov1 = new Vector3D(1.1f, 1.2f, 1.3f) + new Vector3D(1, 2, 3);
        Vector3 uv1 = new Vector3(1.1f, 1.2f, 1.3f) + new Vector3(1, 2, 3);
        if (isEqual(ov1, uv1))
        {
            Debug.Log("add equal...");
        }
        Vector3D ov2 = new Vector3D(1.1f, 1.2f, 1.3f) - new Vector3D(1, 2, 3);
        Vector3 uv2 = new Vector3(1.1f, 1.2f, 1.3f) - new Vector3(1, 2, 3);
        if (isEqual(ov1, uv1))
        {
            Debug.Log("sub equal...");
        }
        ov2.normalize();
        uv2.Normalize();
        if (isEqual(ov2, uv2))
        {
            Debug.Log("nrm equal...");
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}