Calculating Area of Irregular Polygon in C#
area, arrays, c#, list, polygon
Solution
Using lambda expressions this becomes trivial!
var points = GetSomePoints();
points.Add(points[0]);
var area = Math.Abs(points.Take(points.Count - 1)
.Select((p, i) => (points[i + 1].X - p.X) * (points[i + 1].Y + p.Y))
.Sum() / 2);
The algorithm is explained here:
[This method adds] the areas of the trapezoids defined by the polygon's edges dropped to the X-axis. When the program considers a bottom edge of a polygon, the calculation gives a negative area so the space between the polygon and the axis is subtracted, leaving the polygon's area.
The total calculated area is negative if the polygon is oriented clockwise [so the] function simply returns the absolute value.
This method gives strange results for non-simple polygons (where edges cross).
Problem
I've managed to write a 'for dummies' how to calculate the area of irregular polygon in C#, but I need it to be dynamic for any amount of verticies. Can someone please help? Class: ``` public class Vertex { private int _vertexIdx; private double _coordX; private double _coordY; private double _coordZ; public Vertex() { } public Vertex(int vertexIdx, double coordX, double coordY, double coordZ) { _vertexIdx = vertexIdx; _coordX = coordX; _coordY = coordY; _coordZ = coordZ; } public int VertexIdx { get { return _vertexIdx; } set { _vertexIdx = value; } } public double X { get { return _coordX; } set { _coordX = value; } } public double Y { get { return _coordY; } set { _coordY = value; } } public double Z { get { return _coordZ; } set { _coordZ = value; } } } ``` Form_Load: ``` List<Vertex> verticies = new List<Vertex>(); verticies.Add(new Vertex(1, 930.9729, 802.8789, 0)); verticies.Add(new Vertex(2, 941.5341, 805.662, 0)); verticies.Add(new Vertex(3, 946.5828, 799.271, 0)); verticies.Add(new Vertex(4, 932.6215, 797.0548, 0)); ``` `dataGridView1.DataSource = verticies;` Code to calculate when button is pressed: (hard-coded for 4 points polygon - should be for any amount...) ``` // X-coords double x1; double x2; double x3; double x4; double x5; // Y-coords double y1; double y2; double y3; double y4; double y5; // Xn * Yn++ double x1y2; double x2y3; double x3y4; double x4y5; // Yn * Xn++ double y1x2; double y2x3; double y3x4; double y4x5; // XnYn++ - YnXn++ double x1y2my1x2; double x2y3my2x3; double x3y4my3x4; double x4y5my4x5; double result; double area; x1 = Convert.ToDouble(dataGridView1.Rows[0].Cells[1].Value.ToString()); y1 = Convert.ToDouble(dataGridView1.Rows[0].Cells[2].Value.ToString()); txtLog.Text += String.Format("X1 = {0}\tY1 = {1}\r\n", x1, y1); x2 = Convert.ToDouble(dataGridView1.Rows[1].Cells[1].Value.ToString()); y2 = Convert.ToDouble(dataGridView1.Rows[1].Cells[2].Value.ToString()); txtLog.Text += String.Format("X2 = {0}\tY2 = {1}\r\n", x2, y2); x3 = Convert.ToDouble(dataGridView1.Rows[2].Cells[1].Value.ToString()); y3 = Convert.ToDouble(dataGridView1.Rows[2].Cells[2].Value.ToString()); txtLog.Text += String.Format("X3 = {0}\tY3 = {1}\r\n", x3, y3); x4 = Convert.ToDouble(dataGridView1.Rows[3].Cells[1].Value.ToString()); y4 = Convert.ToDouble(dataGridView1.Rows[3].Cells[2].Value.ToString()); txtLog.Text += String.Format("X4 = {0}\tY4 = {1}\r\n", x4, y4); // add the start point again x5 = Convert.ToDouble(dataGridView1.Rows[0].Cells[1].Value.ToString()); y5 = Convert.ToDouble(dataGridView1.Rows[0].Cells[2].Value.ToString()); txtLog.Text += String.Format("X5 = {0}\tY5 = {1}\r\n", x5, y5); txtLog.Text += "\r\n"; // Multiply x1y2 = x1 * y2; x2y3 = x2 * y3; x3y4 = x3 * y4; x4y5 = x4 * y5; y1x2 = y1 * x2; y2x3 = y2 * x3; y3x4 = y3 * x4; y4x5 = y4 * x5; // Subtract from each other x1y2my1x2 = x1y2 - y1x2; x2y3my2x3 = x2y3 - y2x3; x3y4my3x4 = x3y4 - y3x4; x4y5my4x5 = x4y5 - y4x5; // Sum all results result = x1y2my1x2 + x2y3my2x3 + x3y4my3x4 + x4y5my4x5; area = Math.Abs(result / 2); txtLog.Text += String.Format("Area = {0}\r\n", area); ``` Example output: X1 = 930.9729 Y1 = 802.8789 X2 = 941.5341 Y2 = 805.662 X3 = 946.5828 Y3 = 799.271 X4 = 932.6215 Y4 = 797.0548 X5 = 930.9729 Y5 = 802.8789 Area = 83.2566504099523