点到折线最短距离所在点距离折线起点的累积距离

原创 2015年07月08日 21:08:21

点到折线最短距离所在点 距离  折线起点 的累积距离

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Geometry;
using RGeos.Geometry

namespace RGeos.Geometry
{
    public class CulmulateDistance
    {
        /// <summary>
        /// 点到折线最短距离处距离折线起点的累积距离
        /// </summary>
        /// <param name="P">任意一点</param>
        /// <param name="polyline">折线</param>
        /// <returns></returns>
        public static double CulmulateDist_Point_to_Polyline(IPoint P, IPolyline polyline)
        {
            ISegmentCollection segs = polyline as ISegmentCollection;
            double min = double.MaxValue;
            int segIndex = -1;//最短距离所在档的索引
            for (int i = 0; i < segs.SegmentCount; i++)
            {
                //点到每条线段的最短距离
                double dis = Dist_Point_to_Segment(P, segs.get_Segment(i));
                if (dis < min)
                {
                    min = dis;
                    segIndex = i;//取出最小的一个
                }
            }
            double culmulateDis = 0;
            for (int i = 0; i < segs.SegmentCount; i++)
            {
                if (segIndex != i)
                {
                    culmulateDis += segs.get_Segment(i).Length;
                }
                else
                {
                    ISegment current = segs.get_Segment(i);
                    Vector3d v = new Vector3d();
                    v.X = current.ToPoint.X - current.FromPoint.X;
                    v.Y = current.ToPoint.Y - current.FromPoint.Y;

                    Vector3d w = new Vector3d();
                    w.X = P.X - current.FromPoint.X;
                    w.Y = P.Y - current.FromPoint.Y;

                    double c1 = dot(w, v);//投影长度
                    if (c1 <= 0)//这种情况最短距离在该线段的起点处
                    {
                        break;
                    }
                    double c2 = dot(v, v);
                    if (c2 <= c1)//这种情况最短距离在该线段的终点处                      
                    {
                        culmulateDis += Math.Sqrt(c2);
                        break;
                    }

                    double b = c1 / c2;
                    culmulateDis += Math.Sqrt(c1);
                    IPoint Pb = new PointClass();
                    Pb.X = current.FromPoint.X + b * v.X;
                    Pb.Y = current.FromPoint.Y + b * v.Y;
                    break;
                }
            }
            return culmulateDis;
        }

        public static IPoint GetCentrePoint(IPolygon polygon)
        {
            IArea pArea = polygon as IArea;
            IPoint pt = new PointClass();
            pt.X = pArea.Centroid.X;
            pt.Y = pArea.Centroid.Y;
            return pt;
        }

        public static double Dist_Point_to_Segment(IPoint P, ISegment S)
        {
            Vector3d v = new Vector3d();
            v.X = S.ToPoint.X - S.FromPoint.X;
            v.Y = S.ToPoint.Y - S.FromPoint.Y;

            Vector3d w = new Vector3d();
            w.X = P.X - S.FromPoint.X;
            w.Y = P.Y - S.FromPoint.Y;

            double c1 = dot(w, v);
            if (c1 <= 0)
                return d(P, S.FromPoint);

            double c2 = dot(v, v);
            if (c2 <= c1)
                return d(P, S.ToPoint);

            double b = c1 / c2;
            IPoint Pb = new PointClass();
            Pb.X = S.FromPoint.X + b * v.X;
            Pb.Y = S.FromPoint.Y + b * v.Y;
            return d(P, Pb);
        }
        /// <summary>
        /// 向量的模
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public static double norm(Vector3d v)
        {
            return Math.Sqrt(dot2(v, v));  // norm = length of vector
        }
        /// <summary>
        /// 2D数量积,点乘
        /// </summary>
        /// <param name="u"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        public static double dot2(Vector3d u, Vector3d v)
        {
            return ((u).X * (v).X + (u).Y * (v).Y);
        }
        public static double dot(Vector3d u, Vector3d v)
        {
            return ((u).X * (v).X + (u).Y * (v).Y + (u).Z * (v).Z);
        }

        public static double d(IPoint P, IPoint P1)
        {
            return Math.Sqrt((P1.X - P.X) * (P1.X - P.X) + (P1.Y - P.Y) * (P1.Y - P.Y));
        }

        /// <param name="x">增量X</param>
        /// <param name="y">增量Y</param>
        /// <returns>象限角</returns>
        public static double GetQuadrantAngle(double x, double y)
        {
            double theta = Math.Atan(y / x);
            if (x > 0 && y == 0) return 0;
            if (x == 0 && y > 0) return Math.PI / 2;
            if (x < 0 && y == 0) return Math.PI;
            if (x == 0 && y < 0) return 3 * Math.PI / 2;

            if (x > 0 && y > 0) return theta;
            if (x > 0 && y < 0) return Math.PI * 2 + theta;
            if (x < 0 && y > 0) return theta + Math.PI;
            if (x < 0 && y < 0) return theta + Math.PI;
            return theta;
        }
    }
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

地图上点到范围的最短距离算法

锐角三角形
  • u010367582
  • u010367582
  • 2016年08月09日 16:34
  • 4864

点到线段的最短距离

点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。  ...
  • angelazy
  • angelazy
  • 2014年08月11日 11:28
  • 16142

点到线段的最短距离算法

点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。 图...
  • zhenxin066
  • zhenxin066
  • 2014年03月05日 14:23
  • 1376

地图上点到范围的最短距离算法

锐角三角形
  • u010367582
  • u010367582
  • 2016年08月09日 16:34
  • 4864

点到线段的最短距离

点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。  ...
  • angelazy
  • angelazy
  • 2014年08月11日 11:28
  • 16142

点到椭圆的最短距离

Minimum Distance to an EllipseDate: 06/10/99 at 11:18:23 From: Christian Gauthier Subject: Geometr...
  • stereohomology
  • stereohomology
  • 2015年09月02日 10:19
  • 1646

经纬坐标系中求点到线段距离的方法

提出一种在经纬坐标系中,计算点到线段距离的简单方法,这种方法比较实用,而且不存在二次误差,实用于广大求偏航、出区域等算法中...
  • ufoxiong21
  • ufoxiong21
  • 2015年06月14日 00:39
  • 1895

点到圆弧的距离(csu1503)

1503: 点到圆弧的距离 Time Limit: 1 Sec  Memory Limit: 128 MB  Special Judge Submit: 325  Solved: 70 [Sub...
  • u010579068
  • u010579068
  • 2015年07月30日 22:16
  • 1062

csu 点到圆弧的最短距离

Description 输入一个点P和一条圆弧(圆周的一部分),你的任务是计算P到圆弧的最短距离。换句话说,你需要在圆弧上找一个点,到P点的距离最小。 提示:请尽量使用精确算法。相比之下,近似算法更难...
  • Law_light
  • Law_light
  • 2017年06月13日 22:29
  • 236

三维空间里点到直线的距离

三维欧式空间点到直线的距离计算方法。使用叉积的表示方法直线用固定点OO对应的向量 o⃗ \vec o 和直行的方向单位向量 a⃗ 0\vec a_0 表示;任意点 QQ 对应的向量 q⃗ \vec q...
  • lcfactorization
  • lcfactorization
  • 2016年11月22日 14:32
  • 2760
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:点到折线最短距离所在点距离折线起点的累积距离
举报原因:
原因补充:

(最多只允许输入30个字)