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); }