最近开始重构不顺眼的辣鸡代码,顺带将某个模块的一个算法辅助类贴到这里。

  /// <summary>
/// 算法逻辑辅助类
/// </summary>
internal static class AlgorithmHelper
{
/// <summary>
/// “两点距离公式”求已知两点的距离
/// </summary>
/// <param name="point_start"></param>
/// <param name="point_end"></param>
/// <returns></returns>
internal static double GetDistance(IPoint point_start, IPoint point_end)
{
double x = point_end.X - point_start.X;
double y = point_end.Y - point_start.Y;
double distance = Math.Sqrt(x * x + y * y);
return distance;
}
/// <summary>
/// “余弦定理”求已知三点组成的夹角的角度。
/// </summary>
/// <param name="first"></param>
/// <param name="cen"></param>
/// <param name="last"></param>
/// <returns></returns>
internal static double GetAngle(IPoint first, IPoint cen, IPoint last)
{
double ma_x = first.X - cen.X;
double ma_y = first.Y - cen.Y;
double mb_x = last.X - cen.X;
double mb_y = last.Y - cen.Y;
double ab_x = first.X - last.X;
double ab_y = first.Y - last.Y;
double ab_val2 = ab_x * ab_x + ab_y * ab_y;
double ma_val = Math.Sqrt(ma_x * ma_x + ma_y * ma_y);
double mb_val = Math.Sqrt(mb_x * mb_x + mb_y * mb_y);
double cosM = (ma_val * ma_val + mb_val * mb_val - ab_val2) / ( * ma_val * mb_val);
double angleAMB = Math.Acos(cosM) / System.Math.PI * ;
return angleAMB;
}
/// <summary>
/// 延长线段
/// </summary>
/// <param name="passLine">传入去的线</param>
/// <param name="mode">模式,1为从FromPoint处延长,2为从ToPint处延长,3为两端延长</param>
/// <param name="dis">延长的距离</param>
/// <returns></returns>
internal static IPolyline GetExtendLine(IPolyline passLine, int mode, double dis)
{
IPointCollection pPointCol = passLine as IPointCollection;
switch (mode)
{
case :
IPoint fromPoint = new PointClass();
passLine.QueryPoint(esriSegmentExtension.esriExtendAtFrom, - * dis, false, fromPoint);
pPointCol.InsertPoints(, , ref fromPoint);
break;
case :
IPoint endPoint = new PointClass();
object missing = Type.Missing;
passLine.QueryPoint(esriSegmentExtension.esriExtendAtTo, dis + passLine.Length, false, endPoint);
pPointCol.AddPoint(endPoint, ref missing, ref missing);
break;
case :
IPoint fPoint = new PointClass();
IPoint ePoint = new PointClass();
object missing2 = Type.Missing;
passLine.QueryPoint(esriSegmentExtension.esriExtendAtFrom, - * dis, false, fPoint);
pPointCol.InsertPoints(, , ref fPoint);
passLine.QueryPoint(esriSegmentExtension.esriExtendAtTo, dis + passLine.Length, false, ePoint);
pPointCol.AddPoint(ePoint, ref missing2, ref missing2);
break;
default:
return pPointCol as IPolyline;
}
return pPointCol as IPolyline;
}
/// <summary>
/// xy坐标转地理坐标
/// </summary>
/// <param name="pActiveView"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
internal static IPoint XYToGeo(IActiveView pActiveView, double x, double y)
{
try
{
IMap pMap = pActiveView.FocusMap;
IPoint pt = new PointClass();
ISpatialReferenceFactory pfactory = new SpatialReferenceEnvironmentClass();
ISpatialReference flatref = pMap.SpatialReference;
ISpatialReference earthref = pfactory.CreateGeographicCoordinateSystem();
pt.PutCoords(x, y); IGeometry geo = (IGeometry)pt;
geo.SpatialReference = flatref;
geo.Project(earthref);
return pt;
}
catch (Exception ex)
{
throw new Exception(ex.Message + "\r\n" + ex.StackTrace);
}
} /// <summary>
/// 数字经纬度和度分秒经纬度转换
/// </summary>
/// <param name="digitalDegree">十进制度</param>
/// <return>度分秒经纬度</return>
internal static string DigitalToDegrees(double digitalDegree)
{
const double num = ;
int degree = (int)digitalDegree;
double tmp = (digitalDegree - degree) * num;
int minute = (int)tmp;
double second = (tmp - minute) * num;
string degrees = "" + degree + "°" + minute + "′" + Math.Floor(second) + "″";
return degrees;
}
}

一些常ArcGIS常用简单算法 C#的更多相关文章

  1. java(数组及常用简单算法 )

    数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[]  变量名  =  new  数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...

  2. 常用排序算法java实现

    写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...

  3. Spark中常用的算法

    Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要 ...

  4. DotNet常用排序算法总结

    数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等7中算法. 现在介绍选择排序算法, ...

  5. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  6. 转载部长一篇大作:常用排序算法之JavaScript实现

    转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...

  7. 【学】常用hash算法的介绍

    基本知识 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映 ...

  8. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  9. ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏

    ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...

随机推荐

  1. JavaScript —— 正则表达式元字符

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  2. python断言语句assert

    断言语句的格式 assert test, [msg] test是一个表达式,表达式求值为Fals时引发AssertionError异常,msg是可选的异常消息. def test_assert(a): ...

  3. Linux命令(干货)

    @ vim 编辑快捷键 ctrl + n 是自动补齐 ctrl + p 是往上选择 ctrl + f 是下一屏幕 ctrl + b 是上一屏幕 w:是移动一个单词 b:是向前一个单词 d^:当前行中, ...

  4. oralce 日期 date 相关操作

    1.当前时间加减一年 加一年 select sysdate,add_month(sysdate,12) from dual; 减一年 select sysdate,add_month(sysdate, ...

  5. maven多模块

    https://www.cnblogs.com/lichking2017/p/8996939.html

  6. Nginx配置参数详解参考示例

    user nobody; worker_processes 2; events{ worker_connections 1024; } http{ #设置默认类型为二进制流 default_type ...

  7. hibernate Criteria(条件查询接口)

    Criteria(条件查询接口) // 1.简单查询 List<Customer> list = session.createCriteria(Customer.class).list() ...

  8. CF883J 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest - J. Renovation 贪心+树状数组

    首先对于一个月的预算,如果非常小的话,我们可以留到后面的 \(a_i\) 最大的月来用,因为 \(a_i\) 越大能够拆建筑的越多. 于是我们把 \(a_i\) 合并给 \(i\) 后面的 \(a\) ...

  9. StatefulWidget 有状态组件

    在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget: StatelessWidget 是无状态组件,状态不可变的 widget ...

  10. KVM(多电脑切换器)

    KVM:Keyboard Video Mouse的缩写.KVM 交换机通过直接连接键盘.视频和鼠标 (KVM) 端口,让您能够访问和控制计算机.KVM 技术无需目标服务器修改软件.这就意味着可以在 W ...