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 三维向量相关操作的更多相关文章

  1. php对二维数组进行相关操作(排序、转换、去空白等)

    php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04   这篇文章主要介绍了php对二维数组进行相关操作,包括php对 ...

  2. Scala学习(三)----数组相关操作

    数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...

  3. golang中的文件操作

    一.文件的基本介绍 文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文件,excel文件都是文件.文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等. ...

  4. 关于golang中IO相关的Buffer类浅析

    io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } t ...

  5. [阿里DIN]从模型源码梳理TensorFlow的形状相关操作

    [阿里DIN]从模型源码梳理TensorFlow的形状相关操作 目录 [阿里DIN]从模型源码梳理TensorFlow的形状相关操作 0x00 摘要 0x01 reduce_sum 1.1 reduc ...

  6. 从零自学Hadoop(20):HBase数据模型相关操作上

    阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...

  7. 从零自学Hadoop(21):HBase数据模型相关操作下

    阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...

  8. 理解CSV文件以及ABAP中的相关操作

    在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...

  9. Liunx下的有关于tomcat的相关操作 && Liunx 常用指令

    先记录以下liunx下的有关于tomcat的相关操作 查看tomcat进程: ps-ef|grep java (回车) 停止tomcat进程: kill -9 PID (进程号如77447) (回车) ...

随机推荐

  1. Go语言中时间轮的实现

    最近在工作中有一个需求,简单来说就是在短时间内会创建上百万个定时任务,创建的时候会将对应的金额相加,防止超售,需要过半个小时再去核对数据,如果数据对不上就需要将加上的金额再减回去. 这个需求如果用Go ...

  2. 信号量解决写者优先&读者优先&公平竞争(reader writer)

    先说问题: 这里的rand都是伪随机.解决也很简单,srand即可.内容懒得改了~~ 描述及思路:           代码:           运行结果:   读者优先:           效果 ...

  3. vue 二级子路由跳转不了 bug

    vue 二级子路由跳转不了 bug @click.prevent 阻止原生事件的冒泡 <li class="tools-hover-box-list-item" v-for= ...

  4. three.js all in one

    three.js all in one https://www.npmjs.com/package/three # yarn add three # OR $ npm i three https:// ...

  5. Regular Expression & rgb2hex

    Regular Expression & rgb2hex regex // 颜色字符串转换 function rgb2hex(sRGB = 'rgb(255, 255, 255)') { co ...

  6. what's the print number means after called the setTimeout function in Chrome console?

    what's the print number means after called the setTimeout function in Chrome console? javascript fun ...

  7. TypeScript Learning Paths

    TypeScript Learning Paths TypeScript Expert refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以 ...

  8. yarn & uninstall global & yarn global remove

    yarn uninstall global yarn global remove https://yarnpkg.com/lang/en/docs/cli/remove/ https://yarnpk ...

  9. Chrome 80 & SameSite & cookie

    Chrome 80 & SameSite & cookie chrome://settings/help https://developers.google.com/web/updat ...

  10. element-ui的树型结构图,半选状态数据给后台后,返回数据带有半选父节点的剔除展示

    // html <h2 class="text-gray">功能权限</h2><el-tree :data="permissionList& ...