Пример #1
0
        void UpdateGeometry(CacheKey key)
        {
            int    apexs       = 5;
            double OuterRadius = key.OuterRadius;
            double InnerRadius = key.OuterRadius / 2.0;

            if (cache.TryGetValue(key, out _path))
            {
                _key = key;
                return;
            }
            PathFigure         figure   = new PathFigure();
            PolyLineSegment    segments = new PolyLineSegment();
            double             add      = 2 * Math.PI / (apexs * 2);
            double             angle    = add;
            RotateTransform    trans    = new RotateTransform(-90.0, OuterRadius, 0.0);
            TranslateTransform trans2   = new TranslateTransform(key.X, key.Y);

            Point[] points = new Point[apexs * 2];

            figure.StartPoint = trans2.Transform(trans.Transform(new Point(OuterRadius, 0)));
            for (int i = 0; i < points.Length - 1; i++, angle += add)
            {
                Point p = (i % 2 == 0 ? new Point(InnerRadius * Math.Cos(angle), InnerRadius * Math.Sin(angle))
                                        : new Point(OuterRadius * Math.Cos(angle), OuterRadius * Math.Sin(angle)));
                segments.Points.Add(trans2.Transform(trans.Transform(p)));
            }
            figure.Segments.Add(segments);
            figure.IsClosed = true;
            _path           = new PathGeometry(new PathFigure[] { figure });
            segments.Freeze();
            figure.Freeze();
            _path.Freeze();
            _key = key;
            cache.Add(key, _path);
        }