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

如下图形:

实现方案

曲线上的点集

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

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

     public List<Point> GetPointsOnPath(Geometry geometry)
{
List<Point> points = new List<Point>();
PathGeometry pathGeometry = geometry.GetFlattenedPathGeometry();
foreach (var figure in pathGeometry.Figures)
{
var ordinateOnPathFigureByAbscissa = GetOrdinateOnPathFigureByAbscissa(figure);
points.AddRange(ordinateOnPathFigureByAbscissa);
}
return points;
}
private List<Point> GetOrdinateOnPathFigureByAbscissa(PathFigure figure)
{
List<Point> outputPoints = new List<Point>();
Point current = figure.StartPoint;
foreach (PathSegment s in figure.Segments)
{
PolyLineSegment segment = s as PolyLineSegment;
LineSegment line = s as LineSegment;
Point[] points;
if (segment != null)
{
points = segment.Points.ToArray();
}
else if (line != null)
{
points = new[] { line.Point };
}
else
{
throw new InvalidOperationException("尼玛!");
}
foreach (Point next in points)
{
var ellipse = new Ellipse()
{
Width = ,
Height = ,
Fill = Brushes.Blue
};
Canvas.SetTop(ellipse, next.Y);
Canvas.SetLeft(ellipse, next.X);
ContentCanvas.Children.Add(ellipse);
current = next;
}
}
return outputPoints;
}

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

曲线上的点

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

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

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

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

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

         private bool TryGetOrdinateOnVectorByAbscissa(Point start, Point end, double abscissa, out double ordinate)
{
ordinate = 0.0;
if ((start.X < end.X && abscissa >= start.X && abscissa <= end.X) ||
(start.X > end.X && abscissa <= start.X && abscissa >= end.X))
{
var xRatio = (abscissa - start.X) / (end.X - start.X);
var yLength = end.Y - start.Y;
var y = yLength * xRatio + start.Y;
ordinate = y;
return true;
}
return false;
}

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

Github: Demo

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

  1. File常用的方法操作、在磁盘上创建File、获取指定目录下的所有文件、File文件的重命名、将数据写入File文件

    文章目录 1.基本介绍 2.构造方法 3.常用的方法 4.代码实例 4.1 创建文件和目录(目录不存在) 4.1.1 代码 4.1.2 测试结果 4.2 测试目录存在的情况.直接写绝对的路径名 4.2 ...

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

    如何在一条曲线上,获取到距离指定点最近的点位置? 与上一篇 C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值 类似, 我们通过曲线上获取的密集点,通过俩点之间连线,获取连线上最近的点.我们能够获取 ...

  3. 如何通过源生js获取一个元素的具体样式值 /* getCss:获取指定元素的具体样式的属性值 curElement:[dom对象] attr:[string] */

    昨天的博客些的真的是惨不忍睹啊!!!但是我的人生宗旨就是将不要脸的精神进行到底,所以,今天我又来了.哈哈哈哈哈! 方法一:元素.style.属性名:(这个有局限性--只能获取行内样式的值,对于样式表或 ...

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

    2015-12-17 //获取指定图层上所有实体ID AcDbObjectIdArray GetAllEntityId(const TCHAR* layername) { AcDbObjectIdAr ...

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

    参考文献: FileInfo 的使用  https://msdn.microsoft.com/zh-cn/library/system.io.fileinfo_methods(v=vs.110).as ...

  6. C#与JS实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...

  7. django获取指定列的数据

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

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

    function getWeekRange($date){    $ret=array();    $timestamp=strtotime($date);    $w=strftime('%u',$ ...

  9. 【百度地图API】如何调整结果面板的样式?如何获取指定页码的结果?

    原文:[百度地图API]如何调整结果面板的样式?如何获取指定页码的结果? 摘要: 1.你是否想自定义查询后,结果面板的显示样式? 2.数据接口每次只返回10条结果,如何取到单独每一页的结果? ---- ...

随机推荐

  1. springboot读取自定义配置文件节点

    今天和大家分享的是自定义配置信息的读取:近期有写博客这样的计划,分别交叉来写springboot方面和springcloud方面的文章,因为springboot预计的篇章很多,这样cloud的文章就需 ...

  2. python中os.path.dirname(__file__) 命令行 参数没有绝对路径导致数据库找不到

    (1).当"print os.path.dirname(__file__)"所在脚本是以完整路径被运行的, 那么将输出该脚本所在的完整路径,比如: python d:/python ...

  3. ASP.NET中的Cookie对象

    1.Cookie对象 Cookie对象一般用于在客户端保存一些针对某个用户的信息. Cookie本质上只是一小段文本字符串,改字符串一般保存在用户计算机特定文件夹下的某个文件中,每个Cookie都保存 ...

  4. 【转】W3C中国与百度联合组织移动网页加速技术研讨会

    2017 年 8 月 30 日,W3C 会员百度在北京中关村软件园国际会议中心主办了 "移动网页加速技术研讨会",W3C 中国以及腾讯.阿里巴巴及 UC.搜狗.小米.傲游.中国移动 ...

  5. Java实现大批量数据导入导出(100W以上) -(二)导出

    使用POI或JXLS导出大数据量(百万级)Excel报表常常面临两个问题: 1. 服务器内存溢出: 2. 一次从数据库查询出这么大数据,查询缓慢. 当然也可以分页查询出数据,分别生成多个Excel打包 ...

  6. 为自己搭建一个分布式 IM 系统二【从查找算法聊起】

    前言 最近这段时间确实有点忙,这篇的目录还是在飞机上敲出来了的. 言归正传,上周更新了 cim 第一版:没想到反响热烈,最高时上了 GitHub Trending Java 版块的首位,一天收到了 3 ...

  7. 『Zap Möbius反演』

    Zap Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为F ...

  8. Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!

    python3爬虫遇到了反爬 当你兴冲冲的打开一个网页,发现里面的资源好棒,能批量下载就好了,然后感谢写个爬虫down一下,结果,一顿操作之后,发现网站竟然有反爬措施,尴尬了. 接下来的几篇文章,我们 ...

  9. 非常贴心的轮子 FreeSql

    FreeSql 项目从2018年11月28日开发至今,版本已发布至 v0.3.12,版本规则:年数-月-日-当日版本号.目前主要包括 FreeSql.FreeSql.Repository 两个项目的维 ...

  10. 学习 JavaScript (五)核心概念:语句

    语句 语句被称作是流控制语句,通常有标志性的一个或者多个关键字,if . do-while. while.for. for-in. label. break.continue.with.switch. ...