1.向量Vector3d

 using System;

 namespace RGeos.Geometry
{
/// <summary>
/// 3D向量类
/// </summary>
public class Vector3d
{
public double[] vector;
private const double E = 0.0000001f;
/// <summary>
///
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="z"></param>
///
public Vector3d()
{
vector = new double[];
}
public Vector3d(double x, double y, double z)
{
vector = new double[] { x, y, z };
}
public Vector3d(Vector3d vct)
{
vector = new double[];
vector[] = vct.X;
vector[] = vct.Y;
vector[] = vct.Z;
}
#region 属性
/// <summary>
/// X向量
/// </summary>
public double X
{
get { return vector[]; }
set { vector[] = value; }
}
/// <summary>
/// Y向量
/// </summary>
public double Y
{
get { return vector[]; }
set { vector[] = value; }
}
/// <summary>
/// Z向量
/// </summary>
public double Z
{
get { return vector[]; }
set { vector[] = value; }
}
#endregion #region 向量操作
/// <summary>
/// /// <summary>
/// 向量加法+
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns></returns>
public static Vector3d operator +(Vector3d lhs, Vector3d rhs)//向量加
{
Vector3d result = new Vector3d(lhs);
result.X += rhs.X;
result.Y += rhs.Y;
result.Z += rhs.Z;
return result;
}
/// <summary>
/// 向量减-
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns></returns>
public static Vector3d operator -(Vector3d lhs, Vector3d rhs)//向量减法
{
Vector3d result = new Vector3d(lhs);
result.X -= rhs.X;
result.Y -= rhs.Y;
result.Z -= rhs.Z;
return result;
}
/// <summary>
/// 向量除
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns></returns>
public static Vector3d operator /(Vector3d lhs, double rhs)//向量除以数量
{
if (rhs != )
return new Vector3d(lhs.X / rhs, lhs.Y / rhs, lhs.Z / rhs);
else
return new Vector3d(, , );
}
/// <summary>
/// 向量数乘*
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns></returns>
public static Vector3d operator *(double lhs, Vector3d rhs)//左乘数量
{
return new Vector3d(lhs * rhs.X, lhs * rhs.Y, lhs * rhs.Z);
}
/// <summary>
/// 向量数乘
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns></returns>
public static Vector3d operator *(Vector3d lhs, double rhs)//右乘数量
{
return new Vector3d(lhs.X * rhs, lhs.Y * rhs, lhs.Z * rhs);
} /// <summary>
/// 判断量向量是否相等
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns>True 或False</returns>
public static bool operator ==(Vector3d lhs, Vector3d rhs)
{
if (Math.Abs(lhs.X - rhs.X) < E && Math.Abs(lhs.Y - rhs.Y) < E && Math.Abs(lhs.Z - rhs.Z) < E)
return true;
else
return false;
}
public static bool operator !=(Vector3d lhs, Vector3d rhs)
{
return !(lhs == rhs);
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString()
{
return "(" + X + "," + Y + "," + Z + ")";
}
/// <summary>
/// 向量叉积,求与两向量垂直的向量
/// </summary>
public static Vector3d Cross(Vector3d v1, Vector3d v2)
{
Vector3d r = new Vector3d(, , );
r.X = (v1.Y * v2.Z) - (v1.Z * v2.Y);
r.Y = (v1.Z * v2.X) - (v1.X * v2.Z);
r.Z = (v1.X * v2.Y) - (v1.Y * v2.X);
return r;
}
/// <summary>
/// 向量数量积
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns></returns>
public static double operator *(Vector3d lhs, Vector3d rhs)//
{
return lhs.X * rhs.X + lhs.Y * rhs.Y + lhs.Z * rhs.Z;
}
/// <summary>
/// 内积
/// </summary>
/// <param name="v1"></param>
/// <param name="v2"></param>
/// <returns></returns>
public static double InnerMultiply(Vector3d v1, Vector3d v2)
{
double inner = 0.0;
inner = v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z;
return inner;
}
/// <summary>
/// 求向量长度,向量的模
/// </summary>
public static double Magnitude(Vector3d v1)
{
return (double)Math.Sqrt((v1.X * v1.X) + (v1.Y * v1.Y) + (v1.Z * v1.Z));
}
/// <summary>
/// 单位化向量
/// </summary>
public static Vector3d Normalize(Vector3d v1)
{
double magnitude = Magnitude(v1);
v1 = v1 / magnitude;
return v1;
}
#endregion
}
}

2. 计算基础

 using System;
using RGeos.Geometry; namespace RGeos.Basic
{
public class RMath
{
public static double SMALL_NUM = 0.0000000001; // anything that avoids division overflow
/// <summary>
/// dot product (3D) which allows vector operations in arguments
/// </summary>
/// <param name="u"></param>
/// <param name="v"></param>
/// <returns></returns>
public static double dot(Vector3d u, Vector3d v)
{
return ((u).X * (v).X + (u).Y * (v).Y + (u).Z * (v).Z);
}
/// <summary>
/// 2D数量积,点乘
/// </summary>
/// <param name="u"></param>
/// <param name="v"></param>
/// <returns></returns>
public static double dot2(Vector3d u, Vector3d v)
{
return ((u).X * (v).X + (u).Y * (v).Y);
}
/// <summary>
/// 2D矢量叉积,定义为(0,0),P1,P2和P1P2包围四边形的带符号面积
/// </summary>
/// <param name="u"></param>
/// <param name="v"></param>
/// <returns></returns>
public static double perp(Vector3d u, Vector3d v)
{
return ((u).X * (v).Y - (u).Y * (v).X);
}
/// <summary>
/// 向量的模
/// </summary>
/// <param name="v"></param>
/// <returns></returns>
public static double norm(Vector3d v)
{
return Math.Sqrt(dot(v, v)); // norm = length of vector
}
/// <summary>
/// 两点间距离
/// </summary>
/// <param name="u"></param>
/// <param name="v"></param>
/// <returns></returns>
public static double d(Vector3d u, Vector3d v)
{
return norm(u - v); // distance = norm of difference
} public static double d(RPoint P1, RPoint P2)
{
return GetDistance(P1, P2); // distance = norm of difference
} // 判断点P2在直线P0P1的左边还是在右边,还是在直线上
//isLeft(): tests if a point is Left|On|Right of an infinite line.
// Input: three points P0, P1, and P2
// Return: >0 for P2 left of the line through P0 and P1
// =0 for P2 on the line
// <0 for P2 right of the line
public static int isLeft(RPoint P0, RPoint P1, RPoint P2)
{
double l = ((P1.X - P0.X) * (P2.Y - P0.Y) - (P2.X - P0.X) * (P1.Y - P0.Y));
return (int)l;
}
/// <summary>
/// 获取由两个点所形成的向量的象限角度
/// </summary>
/// <param name="preCoord">第一个点的坐标</param>
/// <param name="nextCoord">第二个点的坐标</param>
/// <returns></returns>
public static double GetQuadrantAngle(RPoint preCoord, RPoint nextCoord)
{
return GetQuadrantAngle(nextCoord.X - preCoord.X, nextCoord.Y - preCoord.Y);
}
/// <summary>
/// 由增量X和增量Y所形成的向量的象限角度
/// 区别方位角:方位角以正北方向顺时针
/// | |
/// | / |b /
/// | / a |^/
/// |/_)____象限角 |/______方位角
/// </summary>
/// <param name="x">增量X</param>
/// <param name="y">增量Y</param>
/// <returns>象限角</returns>
public static double GetQuadrantAngle(double x, double y)
{
double theta = Math.Atan(y / x);
if (x > && y == ) return ;
if (x == && y > ) return Math.PI / ;
if (x < && y == ) return Math.PI;
if (x == && y < ) return * Math.PI / ; if (x > && y > ) return theta;
if (x > && y < ) return Math.PI * + theta;
if (x < && y > ) return theta + Math.PI;
if (x < && y < ) return theta + Math.PI;
return theta;
}
/// <summary>
/// 获取由相邻的三个点A-B-C所形成的两个向量之间的夹角
/// 向量AB,BC形成的夹角
/// </summary>
/// <param name="preCoord">第一个点</param>
/// <param name="midCoord">中间点</param>
/// <param name="nextCoord">第三个点</param>
/// <returns></returns>
public static double GetIncludedAngle(RPoint preCoord, RPoint midCoord, RPoint nextCoord)
{
double innerProduct = (midCoord.X - preCoord.X) * (nextCoord.X - midCoord.X) + (midCoord.Y - preCoord.Y) * (nextCoord.Y - midCoord.Y);
double mode1 = Math.Sqrt(Math.Pow((midCoord.X - preCoord.X), 2.0) + Math.Pow((midCoord.Y - preCoord.Y), 2.0));
double mode2 = Math.Sqrt(Math.Pow((nextCoord.X - midCoord.X), 2.0) + Math.Pow((nextCoord.Y - midCoord.Y), 2.0));
return Math.Acos(innerProduct / (mode1 * mode2));
}
/// <summary>
/// 获取由两个点所形成的向量的模(长度)
/// </summary>
/// <param name="preCoord">第一个点</param>
/// <param name="nextCoord">第二个点</param>
/// <returns>由两个点所形成的向量的模(长度)</returns>
public static double GetDistance(RPoint preCoord, RPoint nextCoord)
{
return Math.Sqrt(Math.Pow((nextCoord.X - preCoord.X), ) + Math.Pow((nextCoord.Y - preCoord.Y), ));
}
}
}

RMath

[RGEOS]数学基础的更多相关文章

  1. 3D数学基础:四元数与欧拉角之间的转换

    在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...

  2. [RGEOS]支持栅格数据读取和显示

    SharpMap真的很强大,这里通过改造GdalRasterLayer类实现了在RGeos项目中支持栅格图像的读取和显示,同时支持影像的无级缩放. GdalRasterLayer通过读取FWTools ...

  3. GIS的数学基础

    在这里需要说明一点,任何领域的概念.技术都有其特定的适用范围,有其解决的问题,有其发展的历史,所以,抛开应用环境.范围来谈技术就像是没有根系的枝丫,枝丫再粗壮也只是一根木头而已. 那接下来我们来聊聊什 ...

  4. 机器学习的数学基础(1)--Dirichlet分布

    机器学习的数学基础(1)--Dirichlet分布 这一系列(机器学习的数学基础)主要包括目前学习过程中回过头复习的基础数学知识的总结. 基础知识:conjugate priors共轭先验 共轭先验是 ...

  5. 【数学基础篇】---详解极限与微分学与Jensen 不等式

    一.前述 数学基础知识对机器学习还有深度学习的知识点理解尤为重要,本节主要讲解极限等相关知识. 二.极限 1.例子 当 x 趋于 0 的时候,sin(x) 与 tan(x) 都趋于 0. 但是哪一个趋 ...

  6. 提升机器学习数学基础,这7本书一定要读-附pdf资源

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | KDnuggets 作者 | Ajit Jaokar 转自 | 新智元 编辑 | 大明 [编 ...

  7. python基础系列教程,数学基础系列教程,数据分析系列教程,神经网络系列教程,深度学习系列视频教程分享交流

    大家好,我是一个技术爱好者,目前对大数据人工智能很是痴迷,虽然学历只有高中,目前正在大踏步的向着人工智能狂奔,如果你也想学习,那就来吧 我的学习进度python基础(Numpy,pandas,matp ...

  8. 数学基础IV 欧拉函数 Miller Rabin Pollard's rho 欧拉定理 行列式

    找了一些曾经没提到的算法.这应该是数学基础系最后一篇. 曾经的文章: 数学基础I 莫比乌斯反演I 莫比乌斯反演II 数学基础II 生成函数 数学基础III 博弈论 容斥原理(hidden) 线性基(h ...

  9. 视觉SLAM中的数学基础 第二篇 四元数

    视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM ...

随机推荐

  1. C# Asp.net 制作一个windows服务

    那下面就来说说如何制作一个服务来 实现开机自动启动,每隔一段时间向student表中插入数据. 步骤:  1)   新建项目 ---> Windows 服务 2) 拖放Times控件 工具箱中 ...

  2. Javascript定义类(class)的最新方法

    极简主义法 3.1 封装 这种方法不使用this和prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因. 首先,它也是用一个对象模拟"类&qu ...

  3. Unity3D面试——真实的面试,unity3d面试

    本来想写一个系列的,一半是抨击现在面试之水,要人之奸,用大哥的话说,要走新手是做螺丝钉和抹布用的.另一半是对出出学校的或者是自废武功转3d的朋友们提供一个比较有价值的参考.不过我时间实在仓促.没有保证 ...

  4. linux数据盘分区以及格式化

    首先切换到root账户下  sudo -i 手动格式化 请根据以下步骤对数据盘进行分区以及格式化,并挂载分区使数据盘可用. 注:执行以下命令时,请注意修改数据盘符,可以使用”fdisk -l”查看盘符 ...

  5. 未配置jdk环境变量,cmd环境能运行java -version命令

    我的情况是C:\Windows\System32路径下有java.exe.javaw.exe.javaws.exe三个文件,将三个文件删除后配置自己的jdk环境变量 可能原因参考帖子:https:// ...

  6. IT教程视频

    声明:以下视频均来自与互联网各个高级培训机构内部视频,我们能保证大部分的链接均可用.但不能保证所有的视频内容都是最新的.如果想要实时跟进各个培训机构的内部视频建议您关注微信公众号(BjieCoder) ...

  7. /usr/local/java/jdk1.8.0_11

  8. 什么是"抓包"?怎样"抓包"?

    你是网络管理员吗?你是不是有过这样的经历:在某一天的早上你突然发现网络性能急剧下降,网络服务不能正常提供,服务器访问速度极慢甚至不能访问,网络交换机端口指示灯疯狂地闪烁.网络出口处的路由器已经处于满负 ...

  9. 《转》python学习(4)对象

    转自http://www.cnblogs.com/BeginMan/p/3160044.html 一.学习目录 1.pyhton对象 2.python类型 3.类型操作符与内建函数 4.类型工厂函数 ...

  10. DOM操作的性能问题

    造成DOM操作性能差的原因:1.DOM操作的实现和ECMAscript的实现是两个独立的部分,之间通过接口来完成相应的DOM操作. 2.实时查询文档得到HTML集合,重复执行查询操作.特别是lengt ...