码迷,mamicode.com
首页 > 其他好文 > 详细

golang 三维向量相关操作

时间:2018-09-14 21:39:41      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:cto   axis   叉积   scalar   struct   sqrt   clone   []   class   

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 三维向量相关操作

标签:cto   axis   叉积   scalar   struct   sqrt   clone   []   class   

原文地址:https://www.cnblogs.com/zheng123/p/9648868.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!