C# 根据路线点集合动态分段

时间:2022-09-05 15:50:43

/// <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&num;)-动态分段

    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&plus;&plus;中的静态多态和动态多态

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

  5. JS动态创建Table&comma;Tr&comma;Td并赋值

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

  6. Set集合、List集合

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

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

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

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

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

  9. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...

随机推荐

  1. juggle

    /** @inheritDoc */ public function advanceTime(time:Number):void { if (time == 0 || (mCurrentTime == ...

  2. EntityFramework 连接数据库出错

    本文转载:http://www.cnblogs.com/shuang121/archive/2012/03/19/2406121.html 总结:选择“是”时,连接字符串的密码会暴露出来,“否”的时候 ...

  3. 用 Asterisk 搭建自己的免费 VoIP 服务器

    原文 http://www.yaoblog.info/?p=5021 1. 这里以 Debian 为例子,安装 Asterisk apt-get update apt-get install aste ...

  4. 组件 layui 常用控件下拉框的应用

    下拉框的显示样式: 针对下拉框的绑定等操作时,在最后务必调用一次 form.render(); 1.基本定义: <div class="layui-form-item"&gt ...

  5. Oracle&lowbar;SQL92&lowbar;连接查询

    Oracle_SQL92_连接查询   笛卡儿积 --笛卡尔积 select * from emp;----14 select * from dept;----4 select * from emp, ...

  6. 一步一步掌握线程机制&lpar;六&rpar;---Atomic变量和Thread局部变量

    前面我们已经讲过如何让对象具有Thread安全性,让它们能够在同一时间在两个或以上的Thread中使用.Thread的安全性在多线程设计中非常重要,因为race condition是非常难以重现和修正 ...

  7. oracle 用一个表的一个字段更新另一个表的一个字段

    案列: 想更新A表的name字段,由于失误,在写这个表的时候,这个字段没有写,发现的时候,已经写了一个多月的数据了.改了之后的过程,会正常的写这个字段, 可是已经写了的数据也不能铲了,重新计算. 好在 ...

  8. 如何在Linux系统通过命令行生成随机文件

    版权声明:本文由胡恒威原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/86 来源:腾云阁 https://www.qclou ...

  9. Week Two

    2018.12.3: 1.[BZOJ 4819] 2.[BZOJ 4827] 3.[P1919] 4.[FFT模板] 2018.12.4: 1.[NTT] 2.[MTT(CRT)] 3.[MTT(my ...

  10. 【POJ】3616 Milking Time(dp)

    Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10898   Accepted: 4591 Des ...