[RGEOS]数学基础
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]数学基础的更多相关文章
- 3D数学基础:四元数与欧拉角之间的转换
在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...
- [RGEOS]支持栅格数据读取和显示
SharpMap真的很强大,这里通过改造GdalRasterLayer类实现了在RGeos项目中支持栅格图像的读取和显示,同时支持影像的无级缩放. GdalRasterLayer通过读取FWTools ...
- GIS的数学基础
在这里需要说明一点,任何领域的概念.技术都有其特定的适用范围,有其解决的问题,有其发展的历史,所以,抛开应用环境.范围来谈技术就像是没有根系的枝丫,枝丫再粗壮也只是一根木头而已. 那接下来我们来聊聊什 ...
- 机器学习的数学基础(1)--Dirichlet分布
机器学习的数学基础(1)--Dirichlet分布 这一系列(机器学习的数学基础)主要包括目前学习过程中回过头复习的基础数学知识的总结. 基础知识:conjugate priors共轭先验 共轭先验是 ...
- 【数学基础篇】---详解极限与微分学与Jensen 不等式
一.前述 数学基础知识对机器学习还有深度学习的知识点理解尤为重要,本节主要讲解极限等相关知识. 二.极限 1.例子 当 x 趋于 0 的时候,sin(x) 与 tan(x) 都趋于 0. 但是哪一个趋 ...
- 提升机器学习数学基础,这7本书一定要读-附pdf资源
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | KDnuggets 作者 | Ajit Jaokar 转自 | 新智元 编辑 | 大明 [编 ...
- python基础系列教程,数学基础系列教程,数据分析系列教程,神经网络系列教程,深度学习系列视频教程分享交流
大家好,我是一个技术爱好者,目前对大数据人工智能很是痴迷,虽然学历只有高中,目前正在大踏步的向着人工智能狂奔,如果你也想学习,那就来吧 我的学习进度python基础(Numpy,pandas,matp ...
- 数学基础IV 欧拉函数 Miller Rabin Pollard's rho 欧拉定理 行列式
找了一些曾经没提到的算法.这应该是数学基础系最后一篇. 曾经的文章: 数学基础I 莫比乌斯反演I 莫比乌斯反演II 数学基础II 生成函数 数学基础III 博弈论 容斥原理(hidden) 线性基(h ...
- 视觉SLAM中的数学基础 第二篇 四元数
视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM ...
随机推荐
- 学习 TList 类的实现[6]
实现 TMyList.Add 函数. TList 中的 Add 函数用到了一个 Grow 方法, 它的原理是元素越多就为以后准备更多内存, 我们这里省略为预留 4 个元素的内存; TList 中的 A ...
- three.js obj转js
js格式的模型文件是three.js中可以直接加载的文件.使用THREE.JSONLoader()直接加载,而不需要引用其它的loader插件. obj格式转js格式使用的是threejs.org官方 ...
- sftp,get命令使用*通配符的方式获取批量的文件
需求描述: 今天在使用sftp进行get文件的时候,有很多文件名类似的文件,以为还是需要一个一个get 后来发现get也可以使用通配符的方式进行匹配获取多个文件,在此记录下 操作过程: 1.通过sft ...
- c #include "" 和 <>
<>先去系统目录中找头文件,如果没有在到当前目录下找.所以像标准的头文件 stdio.h.stdlib.h等用这个方法. 而""首先在当前目录下寻找,如果找不到,再到系 ...
- Codeforces-475B Strongly Connected City
仅仅用推断最外层是不是回路 假设是 则每两个点之间连通 #include<iostream> #include<algorithm> #include<cstdio ...
- C++第15周(春)项目3 - OOP版电子词典(二)
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序须要的相关 ...
- js实现卡号每四位空格分隔
window.onload =function() { document.getElementById("input_num").oninput =function() { })( ...
- eclipse导入maven项目时报Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources
在用Eclipse IDE for Java EE Developers进行maven项目的开发时,报错Could not calculate build plan: Plugin org.apach ...
- DNS、链接网页、资源预加载处理
从网页性能的角度来看,DNS的解析时间是比较耗时的.因此如果能预先下载网页中用到的其它域的资源.可提前进行DNS解析: <link rel="dns-prefetch" hr ...
- HTML5+CSS3 表格设计(Table)
<style> body { width: 600px; margin: 40px auto; font-family: 'trebuchet MS', 'Lucida sans', Ar ...