Polygon

Espacio de nombres: Digi21.DigiNG.Entities
Ensamblado: Digi21.DigiNG

Polígono de lectura y escritura: un contorno exterior y cero o más huecos. Añade a ReadOnlyPolygon los constructores, las colecciones de lectura y escritura del contorno y de los huecos, y JoinPolygons.

public class Polygon : ReadOnlyPolygon

Herencia: Object → Entity → ReadOnlyPolygon → Polygon

Implementa: las interfaces de ReadOnlyPolygon (ICloseable, ISnapable, IClippable, ITrimable) y las de Entity.

El contorno exterior y cada hueco tienen que repetir el primer vértice al final. La clase no cierra los contornos: con un contorno sin cerrar, AnalyzePointPosition devuelve Exterior.

Al añadir el polígono a un archivo de dibujo, el polígono pasa a pertenecer al archivo (Owner) y es de solo lectura: los miembros de esta página que lo modifican lanzan InvalidOperationException.

Los miembros de ReadOnlyPolygon y de Entity se describen en sus páginas.

Constructores

Constructor Descripción
Polygon(Code code) Polígono sin vértices ni huecos con un código.
Polygon(IEnumerable<Code> codes) Polígono sin vértices ni huecos con varios códigos.

Propiedades

Propiedad Descripción
Point3DCollection Points { get; } Vértices del contorno exterior, de lectura y escritura. Oculta ReadOnlyPolygon.Points.
IList<Line> Holes { get; } Huecos, de lectura y escritura. Oculta ReadOnlyPolygon.Holes.

Métodos estáticos

Método Descripción
Polygon JoinPolygons(Entity a, Entity b) Polígono que resulta de unir los recintos de a y b.

Ejemplo

Este programa crea un polígono con un hueco, analiza la posición de tres coordenadas, lo une con un polígono adyacente y escribe el resultado en un archivo .bind:

using Digi21.DigiNG.Entities;
using Digi21.DigiNG.IO.BinDouble;
using Digi21.Math;

if (args.Length != 1)
{
    Console.WriteLine("Uso: CreaPoligono <salida.bind>");
    return 1;
}

// Contorno exterior: el último vértice repite el primero.
var parcela = new Polygon(new Code("080100"));
parcela.Points.Add(new[]
{
    new Point3D(0, 0, 0),
    new Point3D(0, 100, 0),
    new Point3D(100, 100, 0),
    new Point3D(100, 0, 0),
    new Point3D(0, 0, 0),
});

// El hueco pasa a pertenecer al polígono.
var patio = new Line(new Code("080100"));
patio.Points.Add(new[]
{
    new Point3D(40, 40, 0),
    new Point3D(40, 60, 0),
    new Point3D(60, 60, 0),
    new Point3D(60, 40, 0),
    new Point3D(40, 40, 0),
});
parcela.Holes.Add(patio);

Console.WriteLine(parcela.Area);                                             // 9600
Console.WriteLine(parcela.AnalyzePointPosition(new Point3D(50, 50, 0)));     // Exterior
Console.WriteLine(parcela.AnalyzePointPosition(new Point3D(10, 10, 0)));     // Interior
Console.WriteLine(parcela.AnalyzePointPosition(new Point3D(0, 50, 0)));      // Tangent

// Un polígono adyacente por el lado X = 100.
var vecina = new Polygon(new Code("080100"));
vecina.Points.Add(new[]
{
    new Point3D(100, 0, 0),
    new Point3D(100, 100, 0),
    new Point3D(150, 100, 0),
    new Point3D(150, 0, 0),
    new Point3D(100, 0, 0),
});

// JoinPolygons lanza Exception si la unión no forma un único polígono.
var unión = Polygon.JoinPolygons(parcela, vecina);
Console.WriteLine($"{unión.Width} x {unión.Height}, {unión.Holes.Count} huecos");

using var archivo = new BinDouble(args[0]);
archivo.Add(unión);
return 0;