C# 通过point设置一个点的坐标,如何在WPF窗口中显示
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 通过point设置一个点的坐标,如何在WPF窗口中显示相关的知识,希望对你有一定的参考价值。
1、在C#中,Point是一个结构体,表示二维空间内X轴和Y轴的坐标值。
2、如果需要在WPF中显示点,首先应该定义一个点控件,点控件具有一个Point属性,见附件代码。
3、通过修改点控件的Point属性,可以达到移动点位置的效果,详见附件。
private Point poiNextPoint = new Point();
poiNextPoint.X = 80;
poiNextPoint.Y = 100;
如果是这样的话,我直接指定了点的坐标,能直接通过一句话,将这个点显示在窗口中么?
不行,因为Point是结构体,不是UI类型。
参考技术A 你得用一个控件显示啊. point是一个类不能显示追问我现在是通过path绘制了一个坐标系,我需要在这个坐标系中显示二维数组中的点?就是需要指定X和Y。这样的话,应该如何实现呢?
追答我不明白你说的什么 path绘制, 坐标系.
请不要用你个人定义的关键字("坐标系")来同化大家.要用共知的关键字如"二维数组"
我把我的代码发给你看看。1181324794,能加一个好友么?
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
以上是关于C# 通过point设置一个点的坐标,如何在WPF窗口中显示的主要内容,如果未能解决你的问题,请参考以下文章
C# wpf 使用 polyline 做一个贪吃蛇游戏的小蛇移动吃食部分功能
我是菜鸟中的菜鸟,我不会画三角形,用c# 。。GDI,,,只知道用point定义三个点对象,那么然后呢??嘿嘿