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 字符 ...
随机推荐
- 苹果iOS苹果公司的手机用户都有权索赔
大家知道.手机中的操作系统(基础软件)存储在手机固(firm,ware)之中,一般而言,手机用户自己是不能修改的. 苹果iOS手机的系统后门(服务程序)也存储在手机固件之中.手机用户自己是无法删除的. ...
- IE8下div中2个button仅仅显示一个
IE8下div中2个button仅仅显示一个,代码例如以下: <div id="adviceType" style="display: none;" &g ...
- 解决Ubuntu Adobe Reader 菜单栏空白
sudo gedit /usr/local/share/applications/AdobeReader.desktop将 ”Exec=acroread“ 用 ”Exec=env UBUNTU_ME ...
- Android从无知到有知——NO.4
因为我们做的是手机安全卫士,因此,我们需要一个地图定位功能,些相关的项目,也有一些教程.到百度官方下载了相关的jar包和API,但自己建项目的时候却不是那么顺利,bug不断,弄得心烦意乱,最后最终臣服 ...
- Mac OSX系统安装和配置Zend Server 6教程(2)
继上一节安装好Zend Server 6以后,我们需要修改配置文件.首先修改服务器监听端口.默认的情况下Zend Server 6安装以后的端口是10088.一般开发者使用的都是HTTP默认端口80. ...
- C#可扩展编程之MEF
C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻 前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在 ...
- Run QTP script wiht host in HPQC
- Date的使用
方法 说明 Date() 返回当日的日期和时间 getDate() 获取当天(1-31) getDay() 获取当天的星期(0-6) getMonth() 获取月份(0-11) getFullYear ...
- effective java读书小记(一)创建和销毁对象
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...
- JS菜单条智能定位效果
JS仿淘宝详情页菜单条智能定位效果 2014-01-15 15:40 by 龙恩0707, 1366 阅读, 9 评论, 收藏, 编辑 类似于淘宝详情页菜单条智能定位 对于每个人来说并不陌生!如下截图 ...