C# 曲线上的点(二) 获取距离最近的点

如何在一条曲线上,获取到距离指定点最近的点位置?

与上一篇 C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值 类似,

我们通过曲线上获取的密集点,通过俩点之间连线,获取连线上最近的点。我们能够获取到一系列最近的点集,最近只取距离最小的点即可。

我们这样的算法是否精确呢?不算太精确,但是对于获取曲线上最近点,基本能满足。

斜率变化不大的线段,点不密集;斜率变化较大的线段,点相当密集,所以由此点集得到的最近点,是相对准确的。

实现方案,以下代码可以直接复用:

1 1 public static Point GetClosestPointOnPath(Point p, Geometry geometry) 2 2 { 3 3 PathGeometry pathGeometry = geometry.GetFlattenedPathGeometry(); 4 4 5 5 var points = pathGeometry.Figures.Select(f => GetClosestPointOnPathFigure(f, p)) 6 6 .OrderBy(t => t.Item2).FirstOrDefault(); 7 7 return points?.Item1 ?? new Point(0, 0); 8 8 } 9 9 1010 private static Tuple<Point, double> GetClosestPointOnPathFigure(PathFigure figure, Point p) 1111 { 1212 List<Tuple<Point, double>> closePoints = new List<Tuple<Point, double>>(); 1313 Point current = figure.StartPoint; 1414 foreach (PathSegment s in figure.Segments) 1515 { 1616 PolyLineSegment segment = s as PolyLineSegment; 1717 LineSegment line = s as LineSegment; 1818 Point[] points; 1919 if (segment != null) 2020 { 2121 points = segment.Points.ToArray(); 2222 } 2323 else if (line != null) 2424 { 2525 points = new[] { line.Point }; 2626 } 2727 else 2828 { 2929 throw new InvalidOperationException(); 3030 } 3131 foreach (Point next in points) 3232 { 3333 Point closestPoint = GetClosestPointOnLine(current, next, p); 3434 double d = (closestPoint - p).LengthSquared; 3535 closePoints.Add(new Tuple<Point, double>(closestPoint, d)); 3636 current = next; 3737 } 3838 } 3939 return closePoints.OrderBy(t => t.Item2).First(); 4040 }

俩点之间的连线,如果当前点在此方向的投影为负或者大于当前长度,则取俩侧的点:

1 1 private static Point GetClosestPointOnLine(Point start, Point end, Point p) 2 2 { 3 3 double length = (start - end).LengthSquared; 4 4 if (Math.Abs(length) < 0.01) 5 5 { 6 6 return start; 7 7 } 8 8 Vector v = end - start; 9 9 double param = (p - start) * v / length; 1010 return (param < 0.0) ? start : (param > 1.0) ? end : (start + param * v); 1111 }

效果图:

点赞
收藏

评论区

加载中...

相关推荐

手把手教你用Python替代Mapinfo更快查找两张表中距离最近的点

一、前言大家好,我是崔艳飞。工作中有时需要把A表中的经纬度点,从B表中匹配一个最近的点出来,用Mapinfo也可以实现,但处理速度慢,特别是数据量大时根本处理不动,此时用Python就能轻松实现,还能显示处理进度,详细如下。二、项目目标用Python实现两张表间最近点的计算。三、项目准备软件:PyCharm需要的库:pandas,xlrd,os

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593

CGAL HelloWorld

点和线段如何创建点和线段,并计算两点之间的距离、点到线段的距离、点与线段的位置关系和中点。定义Kernel(几何图元)操作predicate(位置,距离和中点)Codeinclude<iostreaminclude<CGAL/Simple_cartesian.hty

Docker下dubbo开发三部曲之三:java开发

在前两章《Docker下dubbo开发,三部曲之一:极速体验》(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fblog.csdn.net%2Fboling_cavalry%2Farticle%2Fdetails%2F72303126)和《Docker下dubbo开发,三部曲之二:本地环

Java中当前对象引用

题:计算机画图时,有点的概念,每个点由它的横坐标x和纵坐标y描述。写一个类。求两个点之间的曼哈顿距离横向距离纵向距离例如,一个点(0,0)和另一个点(1,1)的曼哈顿距离为2packagetest;publicclassPoint{

Codeforces Round #611 (Div. 3)

原题面:https://codeforces.com/contest/1283(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fcodeforces.com%2Fcontest%2F1283)A.MinutesBeforetheNewYear题目大意:给定时间,问距离零点