Example #1
0
        /// <summary>
        /// 获取运动轨迹
        /// </summary>
        /// <param name="from">来自</param>
        /// <param name="toItem">去</param>
        /// <param name="rgb">颜色:r,g,b</param>
        /// <param name="l">两点间的直线距离</param>
        /// <returns>Path</returns>
        private Path GetParticlePath(ProvincialCapital from, MapToItem toItem, byte[] rgb, out double l)
        {
            Point startPoint = GetProvincialCapitalPoint(from);
            Point endPoint   = GetProvincialCapitalPoint(toItem.To);

            Path  path  = new Path();
            Style style = _ParticlePathStyle;

            path.Style = style;
            PathGeometry pg = new PathGeometry();
            PathFigure   pf = new PathFigure();

            pf.StartPoint = startPoint;
            ArcSegment arc = new ArcSegment();

            arc.SweepDirection = SweepDirection.Clockwise;//顺时针弧
            arc.Point          = endPoint;
            //半径 正弦定理a/sinA=2r r=a/2sinA 其中a指的是两个城市点之间的距离 角A指a边的对角
            double sinA = Math.Sin(Math.PI * m_Angle / 180.0);
            //计算距离 勾股定理
            double x  = startPoint.X - endPoint.X;
            double y  = startPoint.Y - endPoint.Y;
            double aa = x * x + y * y;

            l = Math.Sqrt(aa);
            double r = l / (sinA * 2);

            arc.Size = new Size(r, r);
            pf.Segments.Add(arc);
            pg.Figures.Add(pf);
            path.Data    = pg;
            path.Stroke  = new SolidColorBrush(Color.FromArgb(255, rgb[0], rgb[1], rgb[2]));
            path.Stretch = Stretch.None;
            path.ToolTip = string.Format("{0}=>{1}", from.ToString(), toItem.To.ToString());

            return(path);
        }
Example #2
0
        /// <summary>
        /// 将点加入到动画故事版
        /// </summary>
        /// <param name="runPoint">运动的点</param>
        /// <param name="toEll">达到城市的圆</param>
        /// <param name="sb">故事版</param>
        /// <param name="particlePath">运动轨迹</param>
        /// <param name="l">运动轨迹的直线距离</param>
        /// <param name="from">来自</param>
        /// <param name="toItem">去</param>
        private void AddPointToStoryboard(Grid runPoint, Ellipse toEll, Storyboard sb, Path particlePath, double l, ProvincialCapital from, MapToItem toItem)
        {
            double pointTime    = l / m_Speed;   //点运动所需的时间
            double particleTime = pointTime / 2; //轨迹呈现所需时间(跑的比点快两倍)
            //生成为控件注册名称的guid
            string name = Guid.NewGuid().ToString().Replace("-", "");

            #region 运动的点
            TransformGroup  tfg = new TransformGroup();
            MatrixTransform mtf = new MatrixTransform();
            tfg.Children.Add(mtf);
            TranslateTransform ttf = new TranslateTransform(-runPoint.Width / 2, -runPoint.Height / 2);//纠正最上角沿path运动到中心沿path运动
            tfg.Children.Add(ttf);
            runPoint.RenderTransform = tfg;
            _mapc.RegisterName("m" + name, mtf);

            MatrixAnimationUsingPath maup = new MatrixAnimationUsingPath();
            maup.PathGeometry          = particlePath.Data.GetFlattenedPathGeometry();
            maup.Duration              = new Duration(TimeSpan.FromSeconds(pointTime));
            maup.RepeatBehavior        = RepeatBehavior.Forever;
            maup.AutoReverse           = false;
            maup.IsOffsetCumulative    = false;
            maup.DoesRotateWithTangent = true;//沿切线旋转
            Storyboard.SetTargetName(maup, "m" + name);
            Storyboard.SetTargetProperty(maup, new PropertyPath(MatrixTransform.MatrixProperty));
            sb.Children.Add(maup);
            #endregion

            #region 达到城市的圆
            _mapc.RegisterName("ell" + name, toEll);
            //轨迹到达圆时 圆呈现
            DoubleAnimation ellda = new DoubleAnimation();
            ellda.From         = 0.2;//此处值设置0-1会有不同的呈现效果
            ellda.To           = 1;
            ellda.Duration     = new Duration(TimeSpan.FromSeconds(particleTime));
            ellda.BeginTime    = TimeSpan.FromSeconds(particleTime);//推迟动画开始时间 等轨迹连接到圆时 开始播放圆的呈现动画
            ellda.FillBehavior = FillBehavior.HoldEnd;
            Storyboard.SetTargetName(ellda, "ell" + name);
            Storyboard.SetTargetProperty(ellda, new PropertyPath(Ellipse.OpacityProperty));
            sb.Children.Add(ellda);
            //圆呈放射状
            RadialGradientBrush rgBrush = new RadialGradientBrush();
            GradientStop        gStop0  = new GradientStop(Color.FromArgb(255, 0, 0, 0), 0);
            //此为控制点 color的a值设为0 off值走0-1 透明部分向外放射 初始设为255是为了初始化效果 开始不呈放射状 等跑动的点运动到城市的圆后 color的a值才设为0开始呈现放射动画
            GradientStop gStopT = new GradientStop(Color.FromArgb(255, 0, 0, 0), 0);
            GradientStop gStop1 = new GradientStop(Color.FromArgb(255, 0, 0, 0), 1);
            rgBrush.GradientStops.Add(gStop0);
            rgBrush.GradientStops.Add(gStopT);
            rgBrush.GradientStops.Add(gStop1);
            toEll.OpacityMask = rgBrush;
            _mapc.RegisterName("e" + name, gStopT);
            //跑动的点达到城市的圆时 控制点由不透明变为透明 color的a值设为0 动画时间为0
            ColorAnimation ca = new ColorAnimation();
            ca.To           = Color.FromArgb(0, 0, 0, 0);
            ca.Duration     = new Duration(TimeSpan.FromSeconds(0));
            ca.BeginTime    = TimeSpan.FromSeconds(pointTime);
            ca.FillBehavior = FillBehavior.HoldEnd;
            Storyboard.SetTargetName(ca, "e" + name);
            Storyboard.SetTargetProperty(ca, new PropertyPath(GradientStop.ColorProperty));
            sb.Children.Add(ca);
            //点达到城市的圆时 呈现放射状动画 控制点的off值走0-1 透明部分向外放射
            DoubleAnimation eda = new DoubleAnimation();
            eda.To             = 1;
            eda.Duration       = new Duration(TimeSpan.FromSeconds(2));
            eda.RepeatBehavior = RepeatBehavior.Forever;
            eda.BeginTime      = TimeSpan.FromSeconds(particleTime);
            Storyboard.SetTargetName(eda, "e" + name);
            Storyboard.SetTargetProperty(eda, new PropertyPath(GradientStop.OffsetProperty));
            sb.Children.Add(eda);
            #endregion

            #region 运动轨迹
            //找到渐变的起点和终点
            Point startPoint = GetProvincialCapitalPoint(from);
            Point endPoint   = GetProvincialCapitalPoint(toItem.To);
            Point start      = new Point(0, 0);
            Point end        = new Point(1, 1);
            if (startPoint.X > endPoint.X)
            {
                start.X = 1;
                end.X   = 0;
            }
            if (startPoint.Y > endPoint.Y)
            {
                start.Y = 1;
                end.Y   = 0;
            }
            LinearGradientBrush lgBrush = new LinearGradientBrush();
            lgBrush.StartPoint = start;
            lgBrush.EndPoint   = end;
            GradientStop lgStop0 = new GradientStop(Color.FromArgb(255, 0, 0, 0), 0);
            GradientStop lgStop1 = new GradientStop(Color.FromArgb(0, 0, 0, 0), 0);
            lgBrush.GradientStops.Add(lgStop0);
            lgBrush.GradientStops.Add(lgStop1);
            particlePath.OpacityMask = lgBrush;
            _mapc.RegisterName("p0" + name, lgStop0);
            _mapc.RegisterName("p1" + name, lgStop1);
            //运动轨迹呈现
            DoubleAnimation pda0 = new DoubleAnimation();
            pda0.To           = 1;
            pda0.Duration     = new Duration(TimeSpan.FromSeconds(particleTime));
            pda0.FillBehavior = FillBehavior.HoldEnd;
            Storyboard.SetTargetName(pda0, "p0" + name);
            Storyboard.SetTargetProperty(pda0, new PropertyPath(GradientStop.OffsetProperty));
            sb.Children.Add(pda0);
            DoubleAnimation pda1 = new DoubleAnimation();
            //pda1.From = 0.5; //此处解开注释 值设为0-1 会有不同的轨迹呈现效果
            pda1.To           = 1;
            pda1.Duration     = new Duration(TimeSpan.FromSeconds(particleTime));
            pda1.FillBehavior = FillBehavior.HoldEnd;
            Storyboard.SetTargetName(pda1, "p1" + name);
            Storyboard.SetTargetProperty(pda1, new PropertyPath(GradientStop.OffsetProperty));
            sb.Children.Add(pda1);
            #endregion
        }
Example #3
0
        /// <summary>
        /// 获取省会,直辖市,特别行政区的坐标
        /// </summary>
        /// <param name="pc">城市</param>
        /// <returns>Point(Left,Top)</returns>
        private Point GetProvincialCapitalPoint(ProvincialCapital city)
        {
            Point point = new Point(0, 0);

            switch (city)
            {
            case ProvincialCapital.北京:
                point.X = 595;
                point.Y = 247;
                break;

            case ProvincialCapital.天津:
                point.X = 666;
                point.Y = 267;
                break;

            case ProvincialCapital.海:
                point.X = 663;
                point.Y = 414;
                break;

            case ProvincialCapital.重庆:
                point.X = 478;
                point.Y = 435;
                break;

            case ProvincialCapital.石家庄:
                point.X = 571;
                point.Y = 286;
                break;

            case ProvincialCapital.太原:
                point.X = 536;
                point.Y = 308;
                break;

            case ProvincialCapital.沈阳:
                point.X = 683;
                point.Y = 216;
                break;

            case ProvincialCapital.长春:
                point.X = 710;
                point.Y = 176;
                break;

            case ProvincialCapital.哈尔滨:
                point.X = 744;
                point.Y = 136;
                break;

            case ProvincialCapital.南京:
                point.X = 637;
                point.Y = 396;
                break;

            case ProvincialCapital.杭州:
                point.X = 642;
                point.Y = 445;
                break;

            case ProvincialCapital.合肥:
                point.X = 605;
                point.Y = 402;
                break;

            case ProvincialCapital.福州:
                point.X = 616;
                point.Y = 506;
                break;

            case ProvincialCapital.南昌:
                point.X = 589;
                point.Y = 464;
                break;

            case ProvincialCapital.济南:
                point.X = 614;
                point.Y = 319;
                break;

            case ProvincialCapital.郑州:
                point.X = 554;
                point.Y = 360;
                break;

            case ProvincialCapital.武汉:
                point.X = 535;
                point.Y = 415;
                break;

            case ProvincialCapital.长沙:
                point.X = 533;
                point.Y = 474;
                break;

            case ProvincialCapital.广州:
                point.X = 557;
                point.Y = 552;
                break;

            case ProvincialCapital.海口:
                point.X = 503;
                point.Y = 628;
                break;

            case ProvincialCapital.成都:
                point.X = 416;
                point.Y = 425;
                break;

            case ProvincialCapital.贵阳:
                point.X = 464;
                point.Y = 487;
                break;

            case ProvincialCapital.昆明:
                point.X = 388;
                point.Y = 532;
                break;

            case ProvincialCapital.西安:
                point.X = 491;
                point.Y = 358;
                break;

            case ProvincialCapital.兰州:
                point.X = 425;
                point.Y = 331;
                break;

            case ProvincialCapital.西宁:
                point.X = 366;
                point.Y = 318;
                break;

            case ProvincialCapital.拉萨:
                point.X = 247;
                point.Y = 418;
                break;

            case ProvincialCapital.南宁:
                point.X = 485;
                point.Y = 544;
                break;

            case ProvincialCapital.呼和浩特:
                point.X = 481;
                point.Y = 252;
                break;

            case ProvincialCapital.银川:
                point.X = 454;
                point.Y = 300;
                break;

            case ProvincialCapital.乌鲁木齐:
                point.X = 178;
                point.Y = 191;
                break;

            case ProvincialCapital.香港:
                point.X = 565;
                point.Y = 571;
                break;

            case ProvincialCapital.澳门:
                point.X = 555;
                point.Y = 575;
                break;

            case ProvincialCapital.台北:
                point.X = 656;
                point.Y = 545;
                break;
            }
            return(point);
        }
Example #4
0
        /// <summary>
        /// 获取省会,直辖市,特别行政区的坐标
        /// </summary>
        /// <param name="pc">城市</param>
        /// <returns>Point(Left,Top)</returns>
        private Point GetProvincialCapitalPoint(ProvincialCapital city)
        {
            Point point = new Point(0, 0);

            switch (city)
            {
            case ProvincialCapital.北京:
                point.X = 625.71145;
                point.Y = 265.20515;
                break;

            case ProvincialCapital.天津:
                point.X = 646.648895;
                point.Y = 277.719215;
                break;

            case ProvincialCapital.海:
                point.X = 730.844;
                point.Y = 425.208;
                break;

            case ProvincialCapital.重庆:
                point.X = 487.123;
                point.Y = 469.796;
                break;

            case ProvincialCapital.石家庄:
                point.X = 605.527;
                point.Y = 300.853;
                break;

            case ProvincialCapital.太原:
                point.X = 575.685;
                point.Y = 310.961;
                break;

            case ProvincialCapital.沈阳:
                point.X = 725.375;
                point.Y = 214.217;
                break;

            case ProvincialCapital.长春:
                point.X = 742.702;
                point.Y = 173.786;
                break;

            case ProvincialCapital.哈尔滨:
                point.X = 751.847;
                point.Y = 137.687;
                break;

            case ProvincialCapital.南京:
                point.X = 691.682;
                point.Y = 418.295;
                break;

            case ProvincialCapital.杭州:
                point.X = 706.603;
                point.Y = 446.211;
                break;

            case ProvincialCapital.合肥:
                point.X = 661.841;
                point.Y = 418.295;
                break;

            case ProvincialCapital.福州:
                point.X = 706.603;
                point.Y = 528.516;
                break;

            case ProvincialCapital.南昌:
                point.X = 646.439;
                point.Y = 486.16;
                break;

            case ProvincialCapital.济南:
                point.X = 648.845;
                point.Y = 327.807;
                break;

            case ProvincialCapital.郑州:
                point.X = 596.382;
                point.Y = 371.126;
                break;

            case ProvincialCapital.武汉:
                point.X = 617.078;
                point.Y = 451.506;
                break;

            case ProvincialCapital.长沙:
                point.X = 593.975;
                point.Y = 497.231;
                break;

            case ProvincialCapital.广州:
                point.X = 611.303;
                point.Y = 592.531;
                break;

            case ProvincialCapital.海口:
                point.X = 553.545;
                point.Y = 663.766;
                break;

            case ProvincialCapital.成都:
                point.X = 445.73;
                point.Y = 453.912;
                break;

            case ProvincialCapital.贵阳:
                point.X = 492.417;
                point.Y = 533.811;
                break;

            case ProvincialCapital.昆明:
                point.X = 420.22;
                point.Y = 563.171;
                break;

            case ProvincialCapital.西安:
                point.X = 522.259;
                point.Y = 384.121;
                break;

            case ProvincialCapital.兰州:
                point.X = 442.842;
                point.Y = 354.28;
                break;

            case ProvincialCapital.西宁:
                point.X = 408.668;
                point.Y = 340.321;
                break;

            case ProvincialCapital.拉萨:
                point.X = 235.394;
                point.Y = 452.949;
                break;

            case ProvincialCapital.南宁:
                point.X = 520.815;
                point.Y = 605.046;
                break;

            case ProvincialCapital.呼和浩特:
                point.X = 557.877;
                point.Y = 255.128;
                break;

            case ProvincialCapital.银川:
                point.X = 479.422;
                point.Y = 299.891;
                break;

            case ProvincialCapital.乌鲁木齐:
                point.X = 220.474;
                point.Y = 179.562;
                break;

            case ProvincialCapital.香港:
                point.X = 623.817;
                point.Y = 611.784;
                break;

            case ProvincialCapital.澳门:
                point.X = 600.714;
                point.Y = 615.634;
                break;

            case ProvincialCapital.台北:
                point.X = 747.515;
                point.Y = 545.844;
                break;
            }
            return(point);
        }