C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值
原文: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

posted on 2019-04-09 14:01 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10676497.html

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

  1. java取上一个月_Java获取指定日期前一月(年)或后一月(年)

    /** * 获取指定月的前一月(年)或后一月(年) * @param dateStr * @param addYear * @param addMonth * @param addDate * @re ...

  2. C#Chart控件 获取曲线上点的信息

    使用Chart控件实时画线时,鼠标知道某个点上时,要提示这个点的坐标信息. 我对曲线的ToolTip属性进行了设置,结果是除了X轴上的点,其他的点都无法提示信息.如下图所示: 此时可以用GetTool ...

  3. Crawler:爬虫基于urllib.request库实现获取指定网址上的所有图片

    Crawler:爬虫基于urllib.request库实现获取指定网址上的所有图片 目录 输出结果 核心代码 输出结果 核心代码 # coding=gbk import urllib.request ...

  4. UG\NX二次开发 获取曲线上某个位置的点坐标、切线矢量、主法线矢量、副法线矢量 UF_MODL_ask_curve_props

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取曲线上某个位置的点坐标.切线矢量.主法线矢量.副法线矢量 U ...

  5. Python中按值来获取指定的键

    转自: https://blog.csdn.net/Jerry_1126/article/details/87907162 Python字典中的键是唯一的,但不同的键可以对应同样的值,比如说uid,可 ...

  6. 利用python获取指定url在ATS中缓存对象的信息

    业务需求 给定url,如何查询指定的ATS中是否有该url的缓存对象信息?如果缓存了的话,希望提供该缓存对象的大小,缓存时间,缓存文件名,缓存份数(document alternative)等等信息 ...

  7. django获取指定列的数据

    django获取指定列的数据 model一般都是有多个属性的,但是很多时候我们又只需要查询特定的某一个,这个时候可以用到values和values_list [values()](https://do ...

  8. python pandas 把数据保存成csv文件,以及读取csv文件获取指定行、指定列数据

    文章目录: 1 数据说明 2 把数据集文件信息使用python pandas保存成csv文件 3 使用python pandas 读取csv的每行.每列数据 1 数据说明 1.在test_data目录 ...

  9. python批量生成文件夹_python实现批量获取指定文件夹下的所有文件的厂

    本文实例讲述了python实现批量获取指定文件夹下的所有文件的厂商信息的方法.分享给大家供大家参考.具体如下: 功能代码如下: import os, string, shutil,re import ...

最新文章

  1. vue 发展历程时间轴动画_PPT时间轴如何做出创意感?海量素材免费分享,网友:收藏...
  2. web开发(二十一)之自定义拦截器的使用
  3. java 数据库 空值_java – 是否可以将枚举属性的空值存储到数据库?
  4. linux raw 开机启动,Linux实现redmine自动启动的方法
  5. G1 垃圾收集器原理详解
  6. 使用report找出系统里维护了available status reason的document
  7. spark job stage task概念与区分
  8. TensorFlow学习笔记之 PReLU激活函数原理和代码
  9. 城市道路智慧照明服务认证的流程及作用
  10. python和c 情侣网名_简单情侣网名的介绍
  11. 020.3.25普及C组 母鸡下蛋(hen)【纪中】【模拟】
  12. C#微信公众号开发实践--通过控制台程序发布图文消息(2020/8/4实测可用)
  13. 数据挖掘 - 二手车交易价格预测(阿里天池)
  14. 利用SSM(springmvc+spring+mybatis)实现多表联合查询
  15. mac配置python+appium--安卓版(一)
  16. 【LeetCode】 贴纸拼词(动态规划)
  17. 重定向解决国外服务器与国内域名备案的问题
  18. python实现网站测速软件_网站测速插件是什么-和网站测速插件相关的问题-阿里云开发者社区...
  19. 这9个程序员岗位最牛!AI百万年薪夺冠
  20. 奥维查看行政边界_【百度地图API】如何获取行政区域的边界? (转载)

热门文章

  1. 网站html静态化 教程,新云CMS网站内容管理系统生成HTML静态化教程
  2. TensorFlow2 实现神经风格迁移,DIY数字油画定制照片
  3. 字符串大写字符串转小写js_C ++字符串大写和小写
  4. Android ViewPager示例教程
  5. cv::cornerSubPix()亚像素角点检测
  6. C++和C语言的前世今生,两者有什么血缘关系?
  7. Java基础篇:如何使用instanceof
  8. 前端想要了解的Nginx
  9. 数据库 : 事物以及隔离性导致的问题
  10. 如何成功实现数据治理