c#用坐标绘制多边形,计算are和质心WPF

时间:2016-02-10 21:28:45

标签: c# wpf polygon area centroid

我正在绘制一个带坐标的不规则多边形,绘制它的工作原理,当我试图计算出错误发生的区域和质心时。

命名空间WpfApplication3

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    // Draw polygon

    public void Window_Loaded(object sender, RoutedEventArgs e)
    {

        Point[] curvePoints =
        {
        new Point(10, 10),
        new Point(13, 11),
        new Point(15, 30),
        new Point(17, 10),
        new Point(20, 10),
        new Point(30, 15),
        new Point(30, 30),
        new Point(60, 40),
        new Point(65, 55),
        new Point(40, 60),
        new Point(40, 65),
        new Point(58, 70),
        new Point(60, 60),
        new Point(90, 60),
        new Point(90, 85),
        new Point(70, 61),
        new Point(60, 85),
        new Point(30, 85),
        new Point(12, 80),
        new Point(12, 78),
        new Point(16, 75),
        new Point(13, 68),
        new Point(17, 65),
        new Point(6, 62),
        new Point(16, 60),
        new Point(28, 56),
        new Point(27, 45),
        new Point(15, 32),
        new Point(15, 50),
        new Point(5, 50),
        new Point(10, 40)
    };

        var pointCollection = new PointCollection(curvePoints);
        var polygon = new Polygon
        {
            Stroke = Brushes.GreenYellow,
            StrokeThickness = 1,
            Fill = Brushes.Blue,
            Points = pointCollection
        };

        const int cx = 200;
        const int cy = 150;
        polygon.Measure(new Size(cx, cy));
        polygon.Arrange(new Rect(0, 0, cx, cy));


        RenderTargetBitmap bmp = new RenderTargetBitmap(cx, cy, 120, 96, PixelFormats.Pbgra32);
        bmp.Render(polygon);

        _image.Source = bmp;

    }


    // Calculate area

    class Point { double X, Y; }
    double PolygonArea(Point[] polygon)
    {
        int i, j;
        double area = 0;
        for (i=0; i < polygon.Length; i++)
        {
            j = (i + 1) % polygon.Length;

            area += polygon[i].X * polygon[j].Y;
            area += polygon[i].Y * polygon[j].X;
        }

        area /= 2;
        return (area < 0 ? -area : area);
    }


    // Calculate Centroid

      Point centroid =

            polygon.points.Aggregate(
                new { xSum = 0.0, ySum = 0.0, n = 0 },
                (acc, p) => new
                 {
                    xSum = acc.xSum + p.X,
                    ySum = acc.ySum + p.Y,
                    n = acc.n + 1
                },
                acc => new Point(acc.xSum / acc.ySum / acc.n));

    public static object polygon { get; private set; }
}

}

重复出现的主要错误是CS1729:MainWindow.Point不包含带有2个参数的构造函数。

所以我猜测我需要一个带有2个参数的构造函数,我只是不知道如何在MainWindow中添加一个。

计算质心时出现另一个错误,CS1061:对象没有定义&#39;点&#39;没有“积分”的延伸方法。 (使用或组装可能会丢失?)

关于如何解决这个问题的任何想法?谢谢!

2 个答案:

答案 0 :(得分:0)

您的问题是public void recursion(int number){ if (number>1) recursion(number-1); System.out.println(number); } ,它在您的MainWindow类中声明了一个私有类。这会覆盖System.Windows.Point,它在构造函数中占用2个参数。不知道为什么你的代码中有这个。删除那段代码。

答案 1 :(得分:-1)

确实你的Point类是不完整的,因为asfaras是一个构造函数。你应该有类似于以下内容的东西:

 class Point
 {
     public double X;
     public doubly Y;

     public Point(x, y)
     {
        X = x;
        Y = y;
     }
 }

另请注意,我将XY字段设为公开 - 如果没有该字段,则无法访问这些字段。但是,为什么不简单地使用System.Windows命名空间,该命名空间已经包含一个定义良好的Point结构....

接下来你遇到了多边形的问题 - polygon的定义仅仅是object,这并不奇怪。 object没有points字段或属性。

我认为您真正想在此处调用的是对Point成员的列表或数组进行操作(就像您在PolygonArea中所做的那样)