/// <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# 根据路线点集合动态分段的更多相关文章

  1. Mark 创建路径(c#)-动态分段

    http://bbs.esrichina-bj.cn/ESRI/viewthread.php?action=printable&tid=128564 public void CreateRou ...

  2. 动态组合lambda 表达式

    //记录实体集合—动态组合lambda 表达式 Expression<Func<AdEntity, bool>> thirdWhere = p => p.Observer ...

  3. js动态添加table 数据tr td

    成果库修改:      要求主题列表随成果类型改变而改变      网上查询资料后开工,在成果类型下拉框添加change()事件触发Dwr,查询主题集合——动态创建/编辑Table      概要代码 ...

  4. C++中的静态多态和动态多态

    C++中的静态多态和动态多态 今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式( ...

  5. JS动态创建Table,Tr,Td并赋值

    JS动态创建Table,Tr,Td并赋值. 成果库修改: 要求主题列表随成果类型改变而改变 网上查询资料后开工,在成果类型下拉框添加change()事件触发Dwr,查询主题集合——动态创建/编辑Tab ...

  6. Set集合、List集合

    集合体系:Collection.Map接口 存储数量不等的多个对象,不能存储基本数据类型,如存储基本数据类型会自动装箱 ======================================== ...

  7. Java 基础 - Collection集合通用方法及操作/ArrayList和LinkedList的差别优势 /弃用的Vector

    Collection的笔记: /**存储对象考虑使用: * 1.数组, ①一旦创建,其长度不可变!② 长度难于应对实际情况 * 2.Java集合, ①Collection集合: 1.set: 元素无序 ...

  8. 集合概述及Collection接口的常用方法

    java集合像是一种容器,可以动态的把多个对象的引用放到容器中 java的集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组 package com.aff.coll; imp ...

  9. PHP redis有序集合实现分页

    <?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //设置 redis 字符 ...

随机推荐

  1. MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串

    原文:MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串 如何让视图通过某种途径,把符合日期格式的字符串放到路由中,再传递给类型为DateTime的控制 ...

  2. javascript5

    调用对象call object: 声明上下文对象declarative environment record; 作用域链scopechain: 变量解析:variable resolution: 引用 ...

  3. CloudNotes

    CloudNotes 今天,我发布了CloudNotes的一个更新版本:1.0.5484.36793.这个版本与1.0.5472.20097不同的是,它拥有增强的笔记列表,与之前单调的列表系统相比,新 ...

  4. Visual Studio 单元测试之三---压力测试

    原文:Visual Studio 单元测试之三---压力测试 我们都知道大名鼎鼎的LoadRuner,但是很少有人知道Visual Studio自带的Test也可以做些简单的压力测试,下面我们就介绍一 ...

  5. css-缩写

    border缩写 /*缩写前*/ element{ border-top-width:1px; border-top-style:solid; border-top-color:#cccccc; } ...

  6. /bin/bash^M: bad interpreter: No such file or directory

    <今天遇到的问题,  网上有非常多类似的文章,  个人记录下来,  加深记忆,  已经明确的就绕路吧.> 运行一个脚本full_build.sh 时, 一直是提示我: -bash: ./f ...

  7. 【转】android中TextAppearanceSpan的使用

    android中TextAppearanceSpan的使用 Posted on April 17, 2011 在android中如何想word中一样对文字进行丰富的风格设置呢? TextAppeara ...

  8. Android: 自定义Tab样式,一种简单的方式。

    之前看到过论坛里已经有人发过自定义Tab样式的帖子,感觉有些复杂了,这里分享个简单的方法. 1.制作4个9patch的tab样式,可参考android默认的资源 tab_unselected.9.pn ...

  9. .net图片自动裁剪白边函数案例

    1.项目要求上传白底的图片要进行裁剪白边,于是同事谢了个函数感觉很好用. 2. #region 剪切白边 /// <summary> /// 剪切白边 /// </summary&g ...

  10. DataGridView的使用和批量修改

    DataGridView的属性:AllowUserToAddRows:如果为true允许用户添加行,false不允许用户添加行ReadOnly:true表示只读.不能修改单元格中的值,false可以对 ...