zoukankan      html  css  js  c++  java
  • DrawTool画笔之图形笔

    相关知识参考DrawTool画笔之纹理笔  , 图形笔的实现跟纹理笔的实现是一样的,重载Stroke的DrawCore方法,效果图:

    12

    ------------------------------------------------------------

    代码如下:

    /// <summary>
        /// 图形笔
        /// </summary>
        public class ImageStroke : Stroke
        {
            private string imageFile_;
            private System.Windows.Media.ImageSource imageSource_;
            private Point curPoint;
            public ImageStroke(System.Windows.Input.StylusPointCollection points, DrawingAttributes da, string file)
                : base(points, da)
            {
                this.imageFile_ = file;
                this.imageSource_ = new System.Windows.Media.Imaging.BitmapImage(new Uri( this.imageFile_));
            }
    
            protected override void DrawCore(System.Windows.Media.DrawingContext drawingContext, DrawingAttributes drawingAttributes)
            {
                double num = drawingAttributes.Width + 20.0;
                System.Windows.Media.StreamGeometry streamGeometry = new System.Windows.Media.StreamGeometry();
                using (System.Windows.Media.StreamGeometryContext streamGeometryContext = streamGeometry.Open())
                {
                    streamGeometryContext.BeginFigure((Point)base.StylusPoints[0], false, false);
                    drawingContext.DrawImage(this.imageSource_, new Rect(((Point)base.StylusPoints[0]).X - num / 2.0, ((Point)base.StylusPoints[0]).Y - num / 2.0, num, num));
                    this.curPoint = (Point)base.StylusPoints[0];
                    foreach (System.Windows.Input.StylusPoint current in base.StylusPoints)
                    {
                        ImageStroke.DrawImage(ref this.curPoint, (Point)current, num, drawingContext, this.imageSource_);
                    }
                }
            }
    
            public static double GetDistance(Point a, Point b)
            {
                return System.Math.Abs(Point.Subtract(a, b).Length);
            }
            public static Point GetPointBetween(Point a, Point b, double len)
            {
                Vector vector = Point.Subtract(a, b);
                vector.Normalize();
                vector = Vector.Multiply(vector, len);
                return Point.Subtract(a, vector);
            }
    
            public static void DrawImage(ref Point a, Point b, double width, System.Windows.Media.DrawingContext drawingContext, System.Windows.Media.ImageSource imageSource)
            {
                for (double distance = ImageStroke.GetDistance(a, b); distance >= width; distance = ImageStroke.GetDistance(a, b))
                {
                    Point pointBetween = ImageStroke.GetPointBetween(a, b, width);
                    drawingContext.DrawImage(imageSource, new Rect(pointBetween.X - width / 2.0, pointBetween.Y - width / 2.0, width, width));
                    a = pointBetween;
                }
            }
        }

    实例应用可以参考纹理笔,在生成stroke对象时候使用ImageStroke然后将stroke添加到inkcanvas的strokes集合中

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/andy1987/p/4349677.html
Copyright © 2011-2022 走看看