中学的时候醉心于研究怎么“逃课”,大学的时候豁然开悟——最牛逼的逃课是准时准地儿去上每一课,却不知到老师讲的啥,“大隐隐于市”大概就是这境界吧。

用到才听说有“余弦定理”这么一个东西,遂感叹“白上了大学”。

又百度了一下,高中数学……

检查角度先要根据已知的3点计算出其所组成的夹角的角度,这就需要“余弦定理”了。

其代码实现应该是下面的样子:

  private 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;
}

在检查方法CheckAcuteAngle中调用GetAngle方法获取角度值,CheckAcuteAngle方法传入IFeatureClass类型的要素类(应该是一个面层的)与给定的double型角度上限值。返回值是有错的要素List与其对应的角度值List。

       public static List<int> CheckAcuteAngle(IFeatureClass pFeatureClass, double acuteAngle, out List<double> listAngle)
{
IGraphicsContainer pGraphicsContainer = (IGraphicsContainer)m_hookHelper.FocusMap.ActiveGraphicsLayer;
pGraphicsContainer.DeleteAllElements();
IColor color = DisplayUtils.RGBColor(, , );
List<int> listError = new List<int>();
List<double> listOutAngle = new List<double>();
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, true);
IFeature pFeature = pFeatureCursor.NextFeature();
try
{
if (pFeature != null)
{
IPointCollection Temp_Vertices;
IPoint First_Point = new Point();
IPoint Center_Point = new Point();
IPoint Last_Point = new Point();
while (pFeature != null)
{
IGeometryCollection pGeometryCollection=pFeature.Shape as IGeometryCollection;
int count = pGeometryCollection.GeometryCount;
for (int j = ; j < count; j++)
{
IGeometry pGeometry = pGeometryCollection.get_Geometry(j);
Temp_Vertices = pGeometry as IPointCollection;
Temp_Vertices.AddPoint(Temp_Vertices.get_Point());
for (int i = ; i < Temp_Vertices.PointCount - ; i++)
{
Temp_Vertices.QueryPoint(i, First_Point);
Temp_Vertices.QueryPoint(i + , Center_Point);
Temp_Vertices.QueryPoint(i + , Last_Point);
double angle = GetAngle(First_Point, Center_Point, Last_Point);
if (angle <= acuteAngle || angle >= - acuteAngle)
{
listError.Add(pFeature.OID);
listOutAngle.Add(angle); IPointArray pointArray = new PointArrayClass();
pointArray.Add(First_Point);
pointArray.Add(Center_Point);
pointArray.Add(Last_Point); IElement pElement = MarkElementUtils.PointArray2LineMarkElement(pointArray, 1.0, color);
pGraphicsContainer.AddElement(pElement, );
}
}
}
pFeature = pFeatureCursor.NextFeature();
}
}
}
catch (Exception)
{
throw new Exception("执行角度计算时发生错误,错误FeatureID为:"+pFeature.OID);
}
finally
{
Marshal.FinalReleaseComObject(pFeatureCursor);
}
listAngle = listOutAngle;
return listError;
}

ArcGis 拓扑检查——狭长角锐角代码C#的更多相关文章

  1. ArcGIS拓扑检查

    对于拓扑检查中的等级参数一直不理解,经过参考资料才明白过来: 注:如果有两个要素参与到拓扑,在修复拓扑错误时会优先移动拓扑级别低的要素来满足匹配拓扑规则要求. 参考资料: https://wenku. ...

  2. 解析ArcGis拓扑——检查的流程,以面重叠检查为例

    最简单的面重叠错误检查是使用“地理处理”——“面相交”进行检查,其结果是重叠部分提取而成的新面要素类.本例不讲述此种方法. step1 准备待拓扑检查数据 名词: 数据库 DataBase→顾名思义, ...

  3. ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#

    看了些源码,效率挺垃圾的,折腾了一个垃圾得不太彻底的代码,还是慢. 不会折腾底层直接怼COM的悲伤…… 实现思路是这样的: 1.把面层的点都塞进List,去重,取坐标4位,后边的检查使用容差0.001 ...

  4. 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格

    在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...

  5. ArcGIS案例学习笔记-CAD数据自动拓扑检查

    ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...

  6. 使用ArcPy拓扑检查的基本步骤

    拓扑检查是GIS的特性,在ArcGIS可使用多种方法进行检查,包括: 1.在数据集上右键按向导建立: 2.使用拓扑工具箱的一系列工具分步建立: 3.创建模型工具,制作专门的拓扑工具: 4.利用ArcP ...

  7. ArcGis拓扑——规则、概念与要点

    在地理数据库中,拓扑是定义点要素.线要素以及面要素共享重叠几何的方式的排列布置.例如,街道中心线与人口普查区块共享公共几何,相邻的土壤面共享公共边界. 处理拓扑不仅仅是提供一个数据存储机制.在 Arc ...

  8. asp.net ajax检查用户名是否存在代码

    原文  asp.net ajax检查用户名是否存在代码 用户注册时,我们经常需要检查用户名是否存在,本文就是实现无刷新验证用户名 打开开发环境VS 2005,新建项目(或打开现有项目),新建一个Web ...

  9. python 牛客网 你的输出为:空。请检查一下你的代码,有没有循环输入处理多个case。问题解决

    你的输出为:空.请检查一下你的代码,有没有循环输入处理多个case.点击查看如何处理多个case 核心:他这个程序测试正确与否的流程是 连续输入多组测试数据进行测试,只有每组数据都对才行 所以必须使用 ...

随机推荐

  1. pycharm 2016.1.4 软件注册码生成

    昨天电脑忽然坏了,没办法只能电脑重做系统,最让我头疼的是面对新电脑的软件安装和配置..... 由于之前电脑很久没有升级过ide,所以pycharm一直停留在2016.1.4的版本,当我打开pychar ...

  2. jquery $().each,$.each的区别

    在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法. 两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. 一,$().each $().ea ...

  3. bzoj1398 Necklace

    关于最小表示法的模板题. 最小表示法:把一个字符串表示为它的的所有循环同构字符串中的字典序最小者. 直接参见代码中的函数getmin()获取精髓 #include <cstdio> #in ...

  4. 快速傅里叶变换(FFT)

    扯 去北京学习的时候才系统的学习了一下卷积,当时整理了这个笔记的大部分.后来就一直放着忘了写完.直到今天都腊月二十八了,才想起来还有个FFT的笔记没整完呢.整理完这个我就假装今年的任务全都over了吧 ...

  5. numpy的使用方法

    一.numpy快速入门 1.什么是numpy: numpy是python的一个矩阵类型,提供了大量矩阵处理的函数,非正式来说,就是一个使运算更容易,执行更迅速的库,因为它的内部运算是通过c语言而不是p ...

  6. java和c#值类型和引用类型

    java数据类型分为基本数据类型和引用类型 基本数据类型:int  float  double  bool  char byte 引用数据类型:string  array  class interfa ...

  7. 怎么用ajax下载文件

    可能大家都觉得没有必要用ajax来下载东西,用window.open(url)就可以搞定 但是这有一个问题,就是这就限定了只能用GET方式来请求了: 可能你又会说GET很符合REST的要求呀. 但是如 ...

  8. 剑指Offer_编程题_10

    题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution { public: int r ...

  9. LightGBM 调参方法(具体操作)

     sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  10. 图论分支-差分约束-SPFA系统

    据说差分约束有很多种,但是我学过的只有SPFA求差分: 我们知道,例如 A-B<=C,那么这就是一个差分约束. 比如说,著名的三角形差分约束,这个大家都是知道的,什么两边之差小于第三边啦,等等等 ...