/// <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. 给phpcms v9加入一个主题radio无线电button,它可反复使用,以创建不同的专题部分内容编辑器,添加一个主题来定义自己的领域

    1. 2. 找到 phpcms\modules\special\templates中的special_add.tpl.php和special_edit.tpl.php文件 special_add.tp ...

  2. C程序中引用自定义的C函数模块

    原文:C程序中引用自定义的C函数模块 我们知道,刚开始接触C语言编程,一般都是在一个.c或者.cpp(以下只说.c)的文件中编写代码,其中一定会有一个入口函数, 也就是main()函数,你可以将程序代 ...

  3. 关于phpcms中模块_tag.class.php中的pc_tag()方法的含义

    关于phpcms中模块_tag.class.php中的pc_tag()方法的含义:        在phpcms系统中自己写后台模块,要在前台模板中显示出来须要在\phpcms\modules\自定义 ...

  4. PHP 13: 类

    原文:PHP 13: 类 Notice: This article is working on progress!本章将介绍PHP类.现在,基本上每种语言都支持面向对象,当然PHP也不列外.PHP在以 ...

  5. leetcode[68] Climbing Stairs

    n个台阶,每次可以走一步或者两步,总共有多少种走法. 第一感觉想到的是递归,n为1的时候1种,2的时候2中.其他时候就是 fun(n) = fun(n-1) + fun(n-2);递归的代码很简单.如 ...

  6. Linux内核头文件与内核与库的关系

    看上一篇文章中对buildroot的介绍,里面的文档第 3.1.1.1 Internal toolchain backend 节内容 C库会去访问Linux kernel headers(*.h)文件 ...

  7. Windows环境搭建Web自动化测试框架Watir

    Windows环境搭建Web自动化测试框架Watir 一.前言     Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将We ...

  8. 分析Java因为语言慢

    Java在早期的(例JDK1.2一旦)这是很慢.也许是因为有很多的优化,以提高装置的版本号,Java这是越来越快,所以这是现在非常的Java和C/C++什么什么慢速争议. 我想我自己的理解.谈论的影响 ...

  9. VMWare 11安装操作系统 - 初学者系列 - 学习者系列文章

    在2010年的时候,我写过一篇关于VMWare的安装操作系统的博文.但是今天在QQ群里有人问起VMWare安装操作系统的问题,虽然回答了,但是回头看了下当时那篇博文,决定重新写一文. 首先要获取VMW ...

  10. Couchbase 服务器

    安装 Couchbase 服务器 一. 下载安装包 首先,到官网下载安装包:http://www.couchbase.com/ 下载的地址:http://www.couchbase.com/downl ...