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. Buff系统框架设计

    Buff的配置文件 BufType: 1: 精神类Buf 2: 物理类Buf 3.元素类Buf 4.其他类Buf 5.被动类BufBufSubType: 1000-1999 精神子类 2000-299 ...

  2. [extjs] ExtJs4.2 Form 表单提交

    基本代码: <script> Ext.onReady(function(){ Ext.create('Ext.form.Panel', { title: '登录', bodyPadding ...

  3. 制作SD卡启动自己编译的uboot.bin

    README for FriendlyARM Tiny4412 -----------------------------------------------------1. Build uboot ...

  4. 利用Sharepoint 创建轻量型应用之基本功能配置!

    博客同步课程.假设你想跟着视频学习,请跟着例如以下视频: http://edu.csdn.net/course/detail/2097 1.   点击安装程序,出现的界面先期安装完毕准备工具,准备工具 ...

  5. laravel安装 redis 并驱动 session

    1)composer 安装 redis composer require predis/predis 如果感兴趣,可以看一下这里 2)配置 redis 连接(config/database.php 配 ...

  6. docker学习-docker仓库

    docker仓库中心:https://hub.docker.com/ 网易蜂巢仓库中心:https://c.163.com/hub#/m/home/

  7. WAS的部署

    一.设置JAM参数 1.登录WAS的控制台 https://192.168.0.91:9043/ibm/console

  8. unity动态加载(翻译) .

    AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...

  9. 15个常用GCC命令

    GCC编译器非常强大 ,在各个发行的Linux系统中都非常流行,本文介绍的是一些常用的gcc编译选项 下面这段代码将回围绕整个文章: 编辑main.c如下. #include<stdio.h&g ...

  10. 基于Cocos2d-x学习OpenGL ES 2.0系列——使用VBO索引(4)

    在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...