C# 波浪线绘制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C# 波浪线绘制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4901字,纯文字阅读大概需要8分钟。
内容图文
波浪线效果如上
界面绘制操作
1 private Point? _startPoint = null; 2privatevoid ContainerCanvas_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 3 { 4var position = e.GetPosition(ContainerCanvas); 5if (_startPoint == null) 6 { 7 _startPoint = position; 8 } 9else10 { 11//删除预览12if (_previewLineElement != null) 13 { 14 ContainerCanvas.Children.Remove(_previewLineElement); 15 _previewLineElement = null; 16 _lastMovedPoint = null; 17 } 18//确定结束点,绘制波浪线19var myLineElement = new MyLineElement(); 20 myLineElement.DrawLine((Point)_startPoint, position); 21 ContainerCanvas.Children.Add(myLineElement); 22 _startPoint = null; 23 } 24 } 2526private MyLineElement _previewLineElement = null; 27private Point? _lastMovedPoint = null; 2829///<summary>30/// 波浪线绘制预览 31///</summary>32///<param name="sender"></param>33///<param name="e"></param>34privatevoid ContainerCanvas_OnMouseMove(object sender, MouseEventArgs e) 35 { 36var position = e.GetPosition(ContainerCanvas); 37if (_startPoint != null && (_lastMovedPoint == null || _lastMovedPoint != null & (position - (Point)_lastMovedPoint).Length >= 2)) 38 { 39 _lastMovedPoint = position; 40if (_previewLineElement != null) 41 { 42 ContainerCanvas.Children.Remove(_previewLineElement); 43 } 44var myLineElement = new MyLineElement(); 45 myLineElement.DrawLine((Point)_startPoint, position); 46 ContainerCanvas.Children.Add(myLineElement); 47 _previewLineElement = myLineElement; 48 } 49 }
波浪线控件及绘制
1 class MyLineElement : FrameworkElement 2 { 3 public MyLineElement() 4 { 5 _visualShape = new VisualCollection(this); 6 } 7internalvoid DrawLine(Point startPoint, Point endPoint) 8 { 9 List<Point> points = ForgePoints(startPoint, endPoint); 10 DrawLine(points); 11 } 12privateconstint SeparatorPiexl = 4; 13privateconstint AbundancePiexl = 3; 14private List<Point> ForgePoints(Point startPoint, Point endPoint) 15 { 16var points = new List<Point>(); 17 18var lineVector = endPoint - startPoint; 19var lineDistance = lineVector.Length; 20var lineAngle = Math.Atan2(-(endPoint.Y - startPoint.Y), endPoint.X - startPoint.X); 21 22 points.Add(startPoint); 23int index = 0; 24bool isAbundanceUpward = true; 25while (index * SeparatorPiexl < lineDistance) 26 { 27 index++; 28//计算出间隔长度(模拟点到起始点) 29var separatorDistance = index * SeparatorPiexl; 30var abundancePiexl = AbundancePiexl; 31var distanceToStartPoint = Math.Sqrt(Math.Pow(separatorDistance, 2) + Math.Pow(abundancePiexl, 2)); 32//计算出模拟点、起始点,与直线的角度 33var separatorAngle = Math.Atan2(AbundancePiexl, separatorDistance); 34 separatorAngle = isAbundanceUpward ? separatorAngle : -separatorAngle; 35 isAbundanceUpward = !isAbundanceUpward; 36//得到模拟点的水平角度 37var mockPointAngle = lineAngle + separatorAngle; 38//计算出模拟点坐标 39var verticalDistance = distanceToStartPoint * Math.Sin(mockPointAngle); 40var horizontalDistance = distanceToStartPoint * Math.Cos(mockPointAngle); 41var mockPoint = new Point(startPoint.X + horizontalDistance, startPoint.Y - verticalDistance); 42 points.Add(mockPoint); 43 } 44 points.Add(endPoint); 45return points; 46 } 47 48privatevoid DrawLine(List<Point> points) 49 { 50 _visualShape.Clear(); 51 52var geometryTest = new StreamGeometry(); 53using (var ctx = geometryTest.Open()) 54 { 55 ctx.BeginFigure(points[0], true, false); 56if (points.Count % 2 == 0) 57 { 58//绘制二阶贝塞尔函数,需要保证为偶数点 59 ctx.PolyQuadraticBezierTo(points, true, true); 60 } 61else 62 { 63//绘制二阶贝塞尔函数,需要保证为偶数点 64 points.Insert(0, points[0]); 65 ctx.PolyQuadraticBezierTo(points, true, true); 66 } 67 68 ctx.Close(); 69 } 70 71var visual = new DrawingVisual(); 72using (var context = visual.RenderOpen()) 73 { 74 context.DrawGeometry(FillBrush, StrokePen, geometryTest); 75 } 76 _visualShape.Add(visual); 77 } 78 79#region 内部方法 80 81 [Obsolete] 82protectedoverridevoid OnRender(DrawingContext drawingContext) 83 { 84//弃用,改为_visualShape填充实现 85//drawingContext.DrawGeometry(FillBrush, StrokePen, BaseGeometry); 86 } 87 88protectedoverrideint VisualChildrenCount => _visualShape.Count; 89 90protectedoverride Visual GetVisualChild(int index) 91 { 92if (index < 0 || index >= _visualShape.Count) 93 { 94thrownew ArgumentOutOfRangeException(); 95 } 96 97return _visualShape[index]; 98 } 99100#endregion101102#region 曲线属性 103104privatereadonly VisualCollection _visualShape; 105protected Brush FillBrush { get; set; } = Brushes.Transparent; 106public Brush LineBrush { get; set; } = Brushes.DarkSeaGreen; 107protecteddouble BorderThickness { get; set; } = 1.0; 108private Pen _defaultPen = null; 109protected Pen StrokePen 110 { 111get112 { 113if (_defaultPen == null) 114 { 115 _defaultPen = new Pen(LineBrush, BorderThickness); 116 } 117return _defaultPen; 118 } 119set => _defaultPen = value; 120 } 121122#endregion123 }
Github地址:https://github.com/Kybs0/WaveLineTextDemo
原文:https://www.cnblogs.com/kybs0/p/11141190.html
内容总结
以上是互联网集市为您收集整理的C# 波浪线绘制全部内容,希望文章能够帮你解决C# 波浪线绘制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。