扩展标准Polygon类

时间:2014-02-03 19:01:22

标签: wpf union polygon

我正在尝试创建一个可以联合多边形的程序。我想创建一个Polygon类,它可以执行一些操作,如Initialize,FindOfOrientation等。我正在使用WPF和一个抽象类 - Shape。我想继承它并使用这个类的一些属性。但是我对Property有问题:" System.Windows.Media.Geometry DefiningGeometry"我应该怎样做到这一点?

 class SpecialPolygon: Shape
{

    #region Constants
    private const int STROKE_THIKNESS = 1; // Толщина линии
    private const double OPACITY = 0.5;    // Прозрачность
    #endregion

    int _amountOfVertexes;                // Количество сторон полигона
    List<Point> _listOfVertexes;          // Список всех вершин
    List<Stroke> _listOfStrokes;         // Список ребер
    PointCollection Points { get; set; }
    protected override System.Windows.Media.Geometry DefiningGeometry

    {
       WHAT I SHOULD WRITE IN THIS CASE ???

    }

    /// <summary>
    /// Конструктор с параметрами инициализирует полигон с заданным количеством вершин
    /// </summary>
    /// <param name="amountOfVertexes">Число вершин</param>
    /// <param name="listOfVertexes">Список координат</param>
    public SpecialPolygon(int amountOfVertexes, List<Point> listOfVertexes)
    {
        _amountOfVertexes = amountOfVertexes;
        _listOfVertexes = listOfVertexes;
        _listOfStrokes = new List<Stroke>();

        this.Stroke = System.Windows.Media.Brushes.Black;
        this.Fill = System.Windows.Media.Brushes.LightBlue;
        this.StrokeThickness = STROKE_THIKNESS;
        this.Opacity = OPACITY;
        this.Points = new PointCollection();

        for (int i = 0; i < _amountOfVertexes; i++)
        {
            Point a;
            a = _listOfVertexes[i];
            this.Points.Add(a);
        }
            // Записываем каждую пару точек в отрезок.(Точка начала отрезка и конца)
        for (int i = 0; i < _amountOfVertexes - 1; i++)
            {
                Stroke stroke = new Stroke(_listOfVertexes[i], _listOfVertexes[i + 1]);
                this._listOfStrokes.Add(stroke);
            }
  // Не забываем записать последний отрезок, соединяющий конец ломанной с её началом
  // Таким образом получается полигон
        Stroke lastStroke = new Stroke(_listOfVertexes[_amountOfVertexes - 1], _listOfVertexes[0]);         
        this._listOfStrokes.Add(lastStroke);
    }

1 个答案:

答案 0 :(得分:0)

我不会详细讨论已经多次写过的主题,我只会给你一个摘要和一本书的链接,这本书有一个很好的部分,可以回答你所有的问题,可能还有一些问题。你甚至都没有。正如@Clemens简洁地说, DefiningGeometry属性只会返回构成Shape 的几何。

以下有关如何创建Geometry对象的示例取自优秀的WPF Control Development Unleashed书:

private Geometry GetArcGeometry()
{
    Point startPoint = PointAtAngle(Math.Min(StartAngle, EndAngle));
    Point endPoint = PointAtAngle(Math.Max(StartAngle, EndAngle));
    Size arcSize = new Size(Math.Max(0, (RenderSize.Width –
    StrokeThickness)/2),
    Math.Max(0, (RenderSize.Height - StrokeThickness)/2));
    bool isLargeArc = Math.Abs(EndAngle - StartAngle) 180;
    StreamGeometry geom = new StreamGeometry();
    using (StreamGeometryContext context = geom.Open())
    {
        context.BeginFigure(startPoint, false, false);
        context.ArcTo(endPoint, arcSize, 0, isLargeArc,
        SweepDirection.Counterclockwise, true, false);
    }
    geom.Transform = new TranslateTransform(StrokeThickness/2,
    StrokeThickness/2);
    return geom;
}

我建议您阅读示例:构建循环分钟计时器部分,从第40页开始,但实际上,您可能比阅读整个事情要糟糕得多。虽然我建议您为自己阅读材料,但似乎您可以阅读StackOverflow Help Center的各个页面...这将有助于您充分利用本网站