C# 根据路线点集合动态分段
/// <summary>
         /// 将数据根据起、止点分段,返回结果点集合
         /// </summary>
         public ObservableCollection<Point> BuildDrawLineData(ObservableCollection<Point> MapPointList, string StartPeg, string StopPeg)
         {
             ObservableCollection<Point> Result = new ObservableCollection<Point>();
             double StartValue = this.MathPegNo(StartPeg);
             double StopValue = this.MathPegNo(StopPeg);
             if (StartValue > 1)
                 MapPointList = this.SplitLineByStartLength(MapPointList, StartValue);
             //共截取的距离
             double ResultLength = StopValue - StartValue;
             //分段计算中的合计距离
             double TotalLength = 0.0;
             //分段计算中的段距离
             double FtrLength = 0.0;
             //计算中的点对象
             Point pt1,pt2;
             //循环点集合,并计算
             for (int i = 0;i< MapPointList.Count;i++)
             {
                 if (i + 1 < MapPointList.Count)
                 {
                     pt1 = MapPointList[i];
                     pt2 = MapPointList[i +1];
                     FtrLength = this.GetDistance(pt1.Y, pt1.X, pt2.Y, pt2.X);
                     TotalLength += FtrLength;
                     if (TotalLength < ResultLength)
                     {
                         //加入集合中点
                         Result.Add(pt1);
                     }
                     else
                     {
                         //超出后在当前直线上取点
                         double RemainderLength = 0;
                         //最后一段直线上的截取
                         RemainderLength = ResultLength - (TotalLength - FtrLength);
                         //由于一条街道上的计算 用三角比例
                         double x = Math.Abs(pt2.X - pt1.X);
                         double y = Math.Abs(pt2.Y - pt1.Y);
                         double x_x = x * (RemainderLength / FtrLength);
                         double y_y = y * (RemainderLength / FtrLength);
                         //判断方向并计算X
                         if (pt1.X > pt2.X)
                             x_x = pt1.X - x_x;
                         else
                             x_x = pt1.X + x_x;
                         //判断方向并计算Y
                         if (pt1.Y > pt2.Y)
                             y_y = pt1.Y - y_y;
                         else
                             y_y = pt1.Y + y_y;
                         //将最后的点加入结果
                         Result.Add(new Point(x_x, y_y));
                         break;
                     }
                 }
                 else//加入最后一个点
                     Result.Add(MapPointList.Last());
             }
             return Result;
         }
//截取超点不为零的点集合
         private ObservableCollection<Point> SplitLineByStartLength(ObservableCollection<Point> MapPointList, double StartLength)
         {
             ObservableCollection<Point> Result = new ObservableCollection<Point>();
             //分段计算中的合计距离
             double TotalLength = 0.0;
             //分段计算中的段距离
             double FtrLength = 0.0;
             //计算中的点对象
             Point pt1, pt2;
             //提前量,是指超过起点距离的第一次检查
             bool IsFirst = true;
             //循环点集合,并计算
             for (int i = 0; i < MapPointList.Count; i++)
             {
                 if (i + 1 < MapPointList.Count)
                 {
                     pt1 = MapPointList[i];
                     pt2 = MapPointList[i + 1];
                     FtrLength = this.GetDistance(pt1.Y, pt1.X, pt2.Y, pt2.X);
                     TotalLength += FtrLength;
                     if (TotalLength > StartLength)
                     {
                         if (IsFirst)
                         {
                             IsFirst = false;
                             //超出后在当前直线上取点
                             double RemainderLength = 0;
                             //最后一段直线上的截取
                             RemainderLength = StartLength - (TotalLength - FtrLength);
                             //由于一条街道上的计算 用三角比例
                             double x = Math.Abs(pt2.X - pt1.X);
                             double y = Math.Abs(pt2.Y - pt1.Y);
                             double x_x = x * (RemainderLength / FtrLength);
                             double y_y = y * (RemainderLength / FtrLength);
                             //判断方向并计算X
                             if (pt1.X > pt2.X)
                                 x_x = pt1.X - x_x;
                             else
                                 x_x = pt1.X + x_x;
                             //判断方向并计算Y
                             if (pt1.Y > pt2.Y)
                                 y_y = pt1.Y - y_y;
                             else
                                 y_y = pt1.Y + y_y;
                             //将最后的点加入结果
                             Result.Add(new Point(x_x, y_y));
                         }
                         else//将起点后面的点集合进行整理
                             Result.Add(pt1);
                     }                        
                 }
                 else//加入最后一个点
                     Result.Add(MapPointList.Last());
             }
             return Result;
         }
C# 根据路线点集合动态分段的更多相关文章
- Mark 创建路径(c#)-动态分段
		http://bbs.esrichina-bj.cn/ESRI/viewthread.php?action=printable&tid=128564 public void CreateRou ... 
- 动态组合lambda 表达式
		//记录实体集合—动态组合lambda 表达式 Expression<Func<AdEntity, bool>> thirdWhere = p => p.Observer ... 
- js动态添加table 数据tr td
		成果库修改: 要求主题列表随成果类型改变而改变 网上查询资料后开工,在成果类型下拉框添加change()事件触发Dwr,查询主题集合——动态创建/编辑Table 概要代码 ... 
- C++中的静态多态和动态多态
		C++中的静态多态和动态多态 今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式( ... 
- JS动态创建Table,Tr,Td并赋值
		JS动态创建Table,Tr,Td并赋值. 成果库修改: 要求主题列表随成果类型改变而改变 网上查询资料后开工,在成果类型下拉框添加change()事件触发Dwr,查询主题集合——动态创建/编辑Tab ... 
- Set集合、List集合
		集合体系:Collection.Map接口 存储数量不等的多个对象,不能存储基本数据类型,如存储基本数据类型会自动装箱 ======================================== ... 
- Java 基础 - Collection集合通用方法及操作/ArrayList和LinkedList的差别优势 /弃用的Vector
		Collection的笔记: /**存储对象考虑使用: * 1.数组, ①一旦创建,其长度不可变!② 长度难于应对实际情况 * 2.Java集合, ①Collection集合: 1.set: 元素无序 ... 
- 集合概述及Collection接口的常用方法
		java集合像是一种容器,可以动态的把多个对象的引用放到容器中 java的集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组 package com.aff.coll; imp ... 
- PHP redis有序集合实现分页
		<?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //设置 redis 字符 ... 
随机推荐
- SICP 锻炼 (1.45)解决摘要
			SICP 1.45是对前面非常多关于不动点的习题的总结. 题目回想了我们之前在1.3.3节使用的不动点寻找方法.当寻找y -> x/y 的不动点的时候,这个变换本身不收敛.须要做一次平均阻尼才干 ... 
- JavaScript插件化开发
			大熊君JavaScript插件化开发 一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那 ... 
- libvlc media player in C# (part 2)
			原文 http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/ I gave some simplified VLC media play ... 
- 如何去除configure的默认选择-g O2
			http://lists.gnu.org/archive/html/autoconf/2006-04/msg00002.html http://www.linuxidc.com/Linux/2013- ... 
- iscroll4实现轮播图效果
			相信很多人和我一样,在使用iscroll的是时候只知道可以手动滑动,不知道iscroll的轮播怎么实现一下就是我做的一个轮播效果,亲测有效: 1.html,当然可以动态添加下面的小圆点 <div ... 
- 2014年3I工作室成员的正式名单
			后3I认真审议和审查工作室的老师及相关人员,今天,新成员首次正式发布,如以下:博才文(11软件).黄彩云(11软件).朱小丹(11软件).海(11软件).欧剑灵(11此计).黄思源(12软件).黄龙营 ... 
- 宿主机跟Vmware中的linux使用host-only,bridge 方式通信
			声明:我的机器在本文中叫 宿机,vmware中的linux就叫linux 本文已经实现了通过host-only模式 宿机 ping通 linux,但是在host-only模式下,linux 没有pin ... 
- 【转】【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
			转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ... 
- ASP.NET MVC之单元测试
			ASP.NET MVC之单元测试分分钟的事2014-07-15 13:05 by 书洞里的猫, 550 阅读, 4 评论, 收藏, 编辑 一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在 ... 
- visual studio code, asp.net5, mvc6资料汇总
			最近在试探性地跟随微软最新发布的一些产品,现列下某些挺好的文章和链接 code.visualstudio.com http://blogs.msdn.com/b/cesardelatorre/arch ... 
