LineArea

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

Métodos que analizan la relación entre una línea y un área.

public static class LineArea

El primer parámetro, line, es una ReadOnlyLine. El segundo, area, es un ReadOnlyPolygon o una ReadOnlyLine cerrada; cada método tiene una sobrecarga para cada tipo.

Los métodos no comprueban que una ReadOnlyLine pasada como area esté cerrada. Si no lo está (tiene menos de 4 vértices o el primer vértice no coincide con el último), ningún punto está dentro de ella.

Cada vértice de la línea está en una de estas posiciones con respecto al área:

Posición Significado
Dentro En el interior del área. Un vértice dentro de un hueco de un polígono no está dentro.
Fuera En el exterior del área o dentro de un hueco.
Sobre el borde Sobre un vértice o un lado del anillo exterior o de un hueco.

Los métodos analizan la posición de los vértices y los vértices comunes; no calculan intersecciones entre lados. A diferencia de AreaArea, las relaciones de LineArea no son excluyentes: por ejemplo, una línea puede cumplir a la vez Join y EndpointJoin.

Métodos estáticos

Método Descripción
Across true si la línea atraviesa el interior del área entre dos de sus vértices situados sobre el borde.
Adjacent true si la línea comparte al menos un lado con el borde del área y ningún vértice de la línea está dentro.
Disjoint true si la línea y el área no tienen vértices comunes y no todos los vértices de la línea están dentro del área.
EndpointJoin true si el primer o el último vértice de la línea coincide con un vértice del área.
Join true si un vértice intermedio de la línea coincide con un vértice del área, sin lados comunes ni cruce.
TerminatesWithin true si la línea tiene algún vértice fuera del área y empieza o termina dentro.
Within true si todos los vértices de la línea están dentro del área.

Todos los métodos lanzan ArgumentNullException si line o area es null.

Ejemplo

Este programa crea un área cuadrada y cinco líneas, analiza la relación de cada línea con el área y guarda las entidades en un archivo BinDouble:

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

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

static Line Línea(string código, params Point3D[] vértices)
{
    var línea = new Line(new Code(código));
    línea.Points.Add(vértices);
    return línea;
}

var área = new Polygon(new Code("AREA"));
área.Points.Add(new[]
{
    new Point3D(0, 0, 0), new Point3D(10, 0, 0), new Point3D(10, 10, 0), new Point3D(0, 10, 0), new Point3D(0, 0, 0),
});

var entra = Línea("ENTRA", new Point3D(-5, 5, 0), new Point3D(5, 5, 0));
var dentro = Línea("DENTRO", new Point3D(3, 3, 0), new Point3D(7, 7, 0));
var borde = Línea("BORDE", new Point3D(0, 0, 0), new Point3D(10, 0, 0));
// Los vértices (0, 5) y (10, 5) están sobre los lados del área y el punto medio entre ellos, dentro.
var cruza = Línea("CRUZA", new Point3D(-5, 5, 0), new Point3D(0, 5, 0), new Point3D(10, 5, 0), new Point3D(15, 5, 0));
var esquina = Línea("ESQUINA", new Point3D(10, 10, 0), new Point3D(15, 15, 0));

Console.WriteLine($"TerminatesWithin(entra, área): {LineArea.TerminatesWithin(entra, área)}"); // True
Console.WriteLine($"Within(dentro, área): {LineArea.Within(dentro, área)}");                   // True
Console.WriteLine($"Adjacent(borde, área): {LineArea.Adjacent(borde, área)}");                 // True
Console.WriteLine($"Across(cruza, área): {LineArea.Across(cruza, área)}");                     // True
Console.WriteLine($"EndpointJoin(esquina, área): {LineArea.EndpointJoin(esquina, área)}");     // True

using var archivo = new BinDouble(args[0]);
archivo.Add(área);
archivo.Add(new Entity[] { entra, dentro, borde, cruza, esquina });
return 0;