1. 程式人生 > >golang 三維向量相關操作

golang 三維向量相關操作

port package bsp panic pan multi val new fun

package vector

import (
    "math"
    "fmt"
)// 三維向量:(x,y,z)
type Vector3 struct {
    X float64    `json:"x"`
    Y float64    `json:"y"`
    Z float64    `json:"z"`
}

func (this *Vector3)Equal(v Vector3) bool {
    return this.X == v.X && this.Y == v.Y && this.Z == v.Z
}

// 三維向量:設值
func (this *Vector3)Set(x, y, z float64) { this.X = x this.Y = y this.Z = z } // 三維向量:拷貝 func (this *Vector3)Clone() Vector3 { return NewVector3(this.X, this.Y, this.Z) } // 三維向量:加上 // this = this + v func (this *Vector3)Add(v Vector3) { this.X += v.X this.Y += v.Y this.Z += v.Z }
// 三維向量:減去 // this = this - v func (this *Vector3)Sub(v Vector3) { this.X -= v.X this.Y -= v.Y this.Z -= v.Z } // 三維向量:數乘 func (this *Vector3)Multiply(scalar float64) { this.X *= scalar this.Y *= scalar this.Z *= scalar } func (this *Vector3)Divide(scalar float64) { if scalar == 0
{ panic("分母不能為零!") } this.Multiply(1 / scalar) } // 三維向量:點積 func (this *Vector3)Dot(v Vector3) float64 { return this.X * v.X + this.Y * v.Y + this.Z * v.Z } // 三維向量:叉積 func (this *Vector3)Cross(v Vector3) { x, y, z := this.X, this.Y, this.Z this.X = y * v.Z - z * v.Y; this.Y = z * v.X - x * v.Z; this.Z = x * v.Y - y * v.X; } // 三維向量:長度 func (this *Vector3)Length() float64 { return math.Sqrt(this.X * this.X + this.Y * this.Y + this.Z * this.Z) } // 三維向量:長度平方 func (this *Vector3)LengthSq() float64 { return this.X * this.X + this.Y * this.Y + this.Z * this.Z } // 三維向量:單位化 func (this *Vector3)Normalize() { this.Divide(this.Length()) } // 返回:新向量 func NewVector3(x, y, z float64) Vector3 { return Vector3{X:x, Y:y, Z:z} } // 返回:零向量(0,0,0) func Zero3() Vector3 { return Vector3{X:0, Y:0, Z:0} } // X 軸 單位向量 func XAxis3() Vector3 { return Vector3{X:1, Y:0, Z:0} } // Y 軸 單位向量 func YAxis3() Vector3 { return Vector3{X:0, Y:1, Z:0} } // Z 軸 單位向量 func ZAxis3() Vector3 { return Vector3{X:0, Y:0, Z:1} } func XYAxis3() Vector3 { return Vector3{X:1, Y:1, Z:0} } func XZAxis3() Vector3 { return Vector3{X:1, Y:0, Z:1} } func YZAxis3() Vector3 { return Vector3{X:0, Y:1, Z:1} } func XYZAxis3() Vector3 { return Vector3{X:1, Y:1, Z:1} } // 返回:a + b 向量 func Add3(a, b Vector3) Vector3 { return Vector3{X:a.X + b.X, Y:a.Y + b.Y, Z:a.Z + b.Z} } // 返回:a - b 向量 func Sub3(a, b Vector3) Vector3 { return Vector3{X:a.X - b.X, Y:a.Y - b.Y, Z:a.Z - b.Z} } // 返回:a X b 向量 (X 叉乘) func Cross3(a, b Vector3) Vector3 { return Vector3{X:a.Y * b.Z - a.Z * b.Y, Y:a.Z * b.X - a.X * b.Z, Z:a.X * b.Y - a.Y * b.X} } func AddArray3(vs []Vector3, dv Vector3) []Vector3 { for i,_ := range vs { vs[i].Add(dv) } return vs } func Multiply3(v Vector3,scalars []float64) []Vector3 { vs := []Vector3{} for _,value := range scalars { vector := v.Clone() vector.Multiply(value) vs = append(vs, vector) } return vs } // 返回:單位化向量 func Normalize3(a Vector3) Vector3 { b := a.Clone() b.Normalize() return b }//求兩點間距離 func GetDistance(a Vector3,b Vector3) float64{ return math.Sqrt(math.Pow(a.X - b.X, 2) + math.Pow(a.Y - b.Y, 2) + math.Pow(a.Z - b.Z, 2)) }

golang 三維向量相關操作