PolygonsWithHoles.cs

This example demonstrates how to create a shapefile holding circular polygons with holes. Here is a screenshot with the results of the code.

```﻿using System;
using System.Windows.Forms;
using AxMapWinGIS;
using MapWinGIS;
using System.Diagnostics;

public partial class MapExamples
{
// <summary>
// Creates a shapefile holding polygons with holes
// </summary>
public void PolygonsWithHoles(AxMap axMap1)
{
Shapefile sf = new Shapefile();
bool result = sf.CreateNewWithShapeID("", ShpfileType.SHP_POLYGON);

if (!result)
{
MessageBox.Show(sf.get_ErrorMsg(sf.LastErrorCode));
}
else
{
double xMin = 0.0;
double yMin = 0.0;
double xMax = 1000.0;
double yMax = 1000.0;
Random rnd = new Random(DateTime.Now.Millisecond);

// builds 10 polygons
for (int i = 0; i < 40; i++)
{
double xCenter = xMin + (xMax - xMin) * rnd.NextDouble();
double yCenter = yMin + (yMax - yMin) * rnd.NextDouble();

// random radius from 10 to 100
double radius = 10 + rnd.NextDouble() * 90;

Shape shp = new Shape();
shp.Create(ShpfileType.SHP_POLYGON);

// polygon must have clockwise order of points (first argument - true)

// holes must have counter-clockwise order of points (fale for the last argument)

for (int j = 0; j < shp.NumParts; j++)
{
Debug.Print("Part is clocwise: " + shp.get_PartIsClockWise(j).ToString());
}

Debug.Print("Shape is valid: " + shp.IsValid);
if (!shp.IsValid)
Debug.Print("Reason: " + shp.IsValidReason);

sf.EditInsertShape(shp, ref i);
}

axMap1.ZoomToLayer(0);

sf.SaveAs(@"c:\polygons.shp", null);
}
}

// <summary>
// Adds a ring to the polygon
// </summary>
private void AddRing(bool clockWise, double x, double y, double radius, ref Shape shp)
{
int partIndex = shp.NumParts;
if (shp.numPoints > 0)
shp.InsertPart(shp.numPoints, ref partIndex);

int count = 0;
for (int j = 0; j < 37; j++)
{
double dx = radius * Math.Cos(j * Math.PI / 18);
double dy = radius * Math.Sin(j * Math.PI / 18);

//dx *= clockWise ? -1 : 1;
dy *= clockWise ? -1 : 1;

Point pnt = new Point();
pnt.x = x + dx;
pnt.y = y + dy;

count = shp.numPoints;
shp.InsertPoint(pnt, ref count);
}
}
}

```