golang 三维向量相关操作
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 三维向量相关操作的更多相关文章
- php对二维数组进行相关操作(排序、转换、去空白等)
php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04 这篇文章主要介绍了php对二维数组进行相关操作,包括php对 ...
- Scala学习(三)----数组相关操作
数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...
- golang中的文件操作
一.文件的基本介绍 文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文件,excel文件都是文件.文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等. ...
- 关于golang中IO相关的Buffer类浅析
io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } t ...
- [阿里DIN]从模型源码梳理TensorFlow的形状相关操作
[阿里DIN]从模型源码梳理TensorFlow的形状相关操作 目录 [阿里DIN]从模型源码梳理TensorFlow的形状相关操作 0x00 摘要 0x01 reduce_sum 1.1 reduc ...
- 从零自学Hadoop(20):HBase数据模型相关操作上
阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
- 从零自学Hadoop(21):HBase数据模型相关操作下
阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...
- 理解CSV文件以及ABAP中的相关操作
在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...
- Liunx下的有关于tomcat的相关操作 && Liunx 常用指令
先记录以下liunx下的有关于tomcat的相关操作 查看tomcat进程: ps-ef|grep java (回车) 停止tomcat进程: kill -9 PID (进程号如77447) (回车) ...
随机推荐
- Go语言中时间轮的实现
最近在工作中有一个需求,简单来说就是在短时间内会创建上百万个定时任务,创建的时候会将对应的金额相加,防止超售,需要过半个小时再去核对数据,如果数据对不上就需要将加上的金额再减回去. 这个需求如果用Go ...
- 信号量解决写者优先&读者优先&公平竞争(reader writer)
先说问题: 这里的rand都是伪随机.解决也很简单,srand即可.内容懒得改了~~ 描述及思路: 代码: 运行结果: 读者优先: 效果 ...
- vue 二级子路由跳转不了 bug
vue 二级子路由跳转不了 bug @click.prevent 阻止原生事件的冒泡 <li class="tools-hover-box-list-item" v-for= ...
- three.js all in one
three.js all in one https://www.npmjs.com/package/three # yarn add three # OR $ npm i three https:// ...
- Regular Expression & rgb2hex
Regular Expression & rgb2hex regex // 颜色字符串转换 function rgb2hex(sRGB = 'rgb(255, 255, 255)') { co ...
- 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 ...
- TypeScript Learning Paths
TypeScript Learning Paths TypeScript Expert refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以 ...
- yarn & uninstall global & yarn global remove
yarn uninstall global yarn global remove https://yarnpkg.com/lang/en/docs/cli/remove/ https://yarnpk ...
- Chrome 80 & SameSite & cookie
Chrome 80 & SameSite & cookie chrome://settings/help https://developers.google.com/web/updat ...
- element-ui的树型结构图,半选状态数据给后台后,返回数据带有半选父节点的剔除展示
// html <h2 class="text-gray">功能权限</h2><el-tree :data="permissionList& ...