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. 高级数据结构之 BloomFilter

    高级数据结构之 BloomFilter 布隆过滤器 https://en.wikipedia.org/wiki/Bloom_filter A Bloom filter is a space-effic ...

  2. Chrome V8 引擎源码剖析

    Chrome V8 引擎源码剖析 V8 https://github.com/v8/v8 array & sort https://github.com/v8/v8/search?l=Java ...

  3. iPad pro & 显示器

    iPad pro 显示器 iPad Pro 如何当做外接屏幕使用 XDisplay https://www.splashtop.com/wiredxdisplay https://play.googl ...

  4. js in depth: event loop & micro-task, macro-task & stack, queue, heap & thread, process

    js in depth: event loop & micro-task, macro-task & stack, queue, heap & thread, process ...

  5. Differences between Stack and Heap

    本文转载自Differences between Stack and Heap Stack vs Heap So far we have seen how to declare basic type ...

  6. 2021 年学习 React 的所需要的 JavaScript 基础

    在理想的情况中,您可以先了解所有有关 JavaScript 和 web 开发的知识,然后再深入了解React. 但是,我们没有办法这样,如果等你把所有 JavaScript 的知识都掌握了再去学习 R ...

  7. (嘎吧)--微软的 C# , IL,CLR, Cup 之间关系以及扩展联想

    还是啰嗦下:文章短并不代表文章质量不高.我最喜欢用干货性的以及总结性的语言 让大家明白文章要表达的内容.这一切,都是来自多年对.NET 的一些领悟以及一些理解. 不长篇大论,一本人也没时间,二本人也不 ...

  8. Django-1.11中文文档-模型Models(一)

    官方文档链接 模型是数据信息的唯一并明确的来源.它包含了我们储存的数据的基本字段和行为.通常,每个模型映射到一张数据库表. 基本概念: 每个模型都是django.db.models.Model的一个子 ...

  9. 基于CameraLink的逻辑综合和版图设计

    前期接口设计用的是Vivado18.3+Modelsim10.6,逻辑综合及版图生成的环境是Ubuntu16,逻辑综合用的工具Design Compiler,生成版图用的工具是Encounter. 下 ...

  10. [转载]Android MVC,MVP和MVVM 思想&例子

    在Android开发中,常采用 MVC(Model-View-Controller)或者MVP(Model-View-Presenter) 等框架模式.设计如图   mvc mvp 可以看出,在 MV ...