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

获取直线上的点,很容易,那曲线呢?二阶贝塞尔、三阶贝塞尔、多段混合曲线,如何获取指定横坐标对应的纵坐标?

如下图形:

实现方案

曲线上的点集

Geometry提供了一个函数GetFlattenedPathGeometry,可以获取其绘制后显示的多边形。

我们可以通过其Figures -> PathSegment -> Point,

 1     public List<Point> GetPointsOnPath(Geometry geometry)
 2     {
 3         List<Point> points = new List<Point>();
 4         PathGeometry pathGeometry = geometry.GetFlattenedPathGeometry();
 5         foreach (var figure in pathGeometry.Figures)
 6         {
 7             var ordinateOnPathFigureByAbscissa = GetOrdinateOnPathFigureByAbscissa(figure);
 8             points.AddRange(ordinateOnPathFigureByAbscissa);
 9         }
10         return points;
11     }
12     private List<Point> GetOrdinateOnPathFigureByAbscissa(PathFigure figure)
13     {
14         List<Point> outputPoints = new List<Point>();
15         Point current = figure.StartPoint;
16         foreach (PathSegment s in figure.Segments)
17         {
18             PolyLineSegment segment = s as PolyLineSegment;
19             LineSegment line = s as LineSegment;
20             Point[] points;
21             if (segment != null)
22             {
23                 points = segment.Points.ToArray();
24             }
25             else if (line != null)
26             {
27                 points = new[] { line.Point };
28             }
29             else
30             {
31                 throw new InvalidOperationException("尼玛!");
32             }
33             foreach (Point next in points)
34             {
35                 var ellipse = new Ellipse()
36                 {
37                     Width = 6,
38                     Height = 6,
39                     Fill = Brushes.Blue
40                 };
41                 Canvas.SetTop(ellipse, next.Y);
42                 Canvas.SetLeft(ellipse, next.X);
43                 ContentCanvas.Children.Add(ellipse);
44                 current = next;
45             }
46         }
47         return outputPoints;
48     }

最终界面显示,获取的点集是如下布局的:

曲线上的点

我们发现,拐角越大,获取的点越密集。所以可以看出,角度变化越大,需要的点越密集。

直线通过斜率很容易获取横坐标对应的纵坐标,那么这有如此多点的曲线呢?

我们是不是可以曲线救国,通过相邻的俩个点画直接,从而获取俩点间的点坐标呢?我们来尝试下~

还是原来的代码,传入一个X坐标参数即可。

然后俩点之间,获取X坐标对应的Y坐标:

 1         private bool TryGetOrdinateOnVectorByAbscissa(Point start, Point end, double abscissa, out double ordinate)
 2         {
 3             ordinate = 0.0;
 4             if ((start.X < end.X && abscissa > start.X && abscissa < end.X) ||
 5                 (start.X > end.X && abscissa < start.X && abscissa > end.X))
 6             {
 7                 var xRatio = (abscissa - start.X) / (end.X - start.X);
 8                 var yLength = end.Y - start.Y;
 9                 var y = yLength * xRatio + start.Y;
10                 ordinate = y;
11                 return true;
12             }
13             return false;
14         }

点击窗口,在曲线上,获取点击处X坐标对应的点。效果图如下:

Github: Demo

原文地址:https://www.cnblogs.com/kybs0/p/10596426.html

时间: 2024-11-10 06:51:16

C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值的相关文章

获取指定类上的@RequestMapping注解的请求信息

通过上一篇博客,我们能够轻松的得到制定类上的制定注解.现在,我们尝试获取指定类上的@RequestMapping注解,并获取该控制层的全部请求信息.在这里,提供一个实体类,用于存放请求的部分信息. public class RequestUrlInfo implements Comparable<RequestUrlInfo>{ private String name; //mapping的名称 private String value; //mapping的请求路径 private Requ

objectARX 获取指定图层上所有实体ID

2015-12-17 1 //获取指定图层上所有实体ID 2 AcDbObjectIdArray GetAllEntityId(const TCHAR* layername) 3 { 4 AcDbObjectIdArray entIds; 5 bool bFilterlayer = false; 6 AcDbObjectId layerId; 7 //获取指定图层对象ID 8 if (layername != NULL) 9 { 10 AcDbLayerTable *pLayerTbl = NU

CAD返回指定参数在曲线上,到开始点的曲线上长度(网页版)

主要用到函数说明: IMxDrawCurve::GetDistAtParam 返回指定参数在曲线上,到开始点的曲线上长度,具体说明如下: 参数 说明 [in] DOUBLE dParam 曲线参数 [out] DOUBLE* pDis 返回到开始点的曲线上长度 js代码实现如下:     var ent = mxOcx.GetEntity("选择曲线:");     if (ent == null)         return;     var curve;     if (ent.

CAD得到指定参数在曲线上的点坐标(网页版)

主要用到函数说明: IMxDrawCurve::GetPointAtParam 得到指定参数在曲线上的点坐标,具体说明如下: 参数 说明 [in] DOUBLE dParam 曲线上的参数 [out] IMxDrawPoint** pPoint 返回曲线的点 js代码实现如下:     var ent = mxOcx.GetEntity("选择曲线:");     if (ent == null)         return;     var curve;     if (ent.O

c# 获取指定目录下的所有文件并显示在网页上

参考文献: FileInfo 的使用  https://msdn.microsoft.com/zh-cn/library/system.io.fileinfo_methods(v=vs.110).aspx 网页表格的生成  http://www.w3school.com.cn/html/html_tables.asp C# 通过文件扩展名获取图标和描述 http://www.csframework.com/archive/2/arc-2-20110514-1478.htm   http://ww

使用jquery获取指定li元素后面的所有兄弟元素

使用jquery获取指定li元素后面的所有兄弟元素:如果我们已经获取了一个li元素,那么如何获取此li元素后面的所有的兄弟元素,下面就通过代码实例做一下简单介绍.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /&g

获取指定时间区间作业运行情况

背景:数据库服务器定期重启,想知道重启期间对作业的影响.通俗点就是服务器在重启这段时间,有哪些作业计划要运行,重启后是否要手动执行这些作业?第一次重启的时候,按照最笨的方式,把所有作业看一遍,然后人为判断有哪些作业将受到影响,再根据作业具体代码,确定是否需手动执行.后来老大说要弄个过程出来,通过传入起止时间参数,返回区间内的作业计划.PS:参考各类资料,修改过很多遍,最后成型在6月初,很多细节上的修改自己也记不清楚了,一直懒得整理.先放上代码,以及效果图. 1 /****************

获取指定元素的某一个样式属性值

1."元素.style.样式属性名" ->oDiv.style.height 弊端:"只能"获取在"行内"上编写过的样式,不管在哪些了对应的样式,只要没有在行内上写过,都获取不到 oDiv.style.height 由于height并没有写在行内样式上(写在样式表里了),所以获取的结果依然是"" 2.通过 window.getComputedStyle 获取所有经过浏览器计算的样式(只要的你的元素在浏览器加载的时候渲染过

php获取指定日期所在星期的开始时间与结束时间

function getWeekRange($date){    $ret=array();    $timestamp=strtotime($date);    $w=strftime('%u',$timestamp);    $ret['sdate']=date('Y-m-d 00:00:00',$timestamp-($w-1)*86400);    $ret['edate']=date('Y-m-d 23:59:59',$timestamp+(7-$w)*86400);    retur