LineLine

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

Métodos que analizan la relación entre dos líneas.

public static class LineLine

Los dos parámetros, a y b, son de tipo ReadOnlyLine. Los métodos tratan una línea cerrada igual que una abierta: el primer vértice y el último son los extremos de la línea.

Los métodos analizan los vértices comunes de las dos líneas; no calculan intersecciones entre lados. Dos líneas que se cruzan sin un vértice común en el cruce son disjuntas. Las relaciones no son excluyentes: por ejemplo, dos líneas pueden cumplir a la vez EndpointJoinEndpoint y Join.

En las descripciones, un vértice intermedio es un vértice que no es ni el primero ni el último de su línea.

Métodos estáticos

Método Descripción
Across true si las dos líneas se cruzan en un vértice intermedio común.
Disjoint true si las dos líneas no tienen ningún vértice común.
EndpointJoinEndpoint true si un extremo de una línea coincide con un extremo de la otra y las líneas no son iguales.
EndpointJoinExcludingEndpoints true si un extremo de a coincide con un vértice intermedio de b.
Equal true si las dos líneas tienen los mismos vértices en el mismo orden o en orden inverso.
Join true si las dos líneas tienen un vértice intermedio común, sin lados comunes ni cruce.
Overlap true si las dos líneas comparten al menos un lado y no son iguales.

Todos los métodos lanzan ArgumentNullException si a o b es null.

Ejemplo

Este programa crea cinco líneas, analiza sus relaciones y guarda cuatro de ellas 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: RelacionesLineaLinea <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 a = Línea("A", new Point3D(0, 0, 0), new Point3D(5, 5, 0), new Point3D(10, 10, 0));
var b = Línea("B", new Point3D(0, 10, 0), new Point3D(5, 5, 0), new Point3D(10, 0, 0));  // Cruza a en el vértice (5, 5).
var c = Línea("C", new Point3D(10, 10, 0), new Point3D(20, 10, 0));                       // Empieza en el último vértice de a.
var d = Línea("D", new Point3D(5, 5, 0), new Point3D(5, -5, 0));                          // Empieza en un vértice intermedio de a.
var inversa = Línea("A", new Point3D(10, 10, 0), new Point3D(5, 5, 0), new Point3D(0, 0, 0));

Console.WriteLine($"Across(a, b): {LineLine.Across(a, b)}");                                         // True
Console.WriteLine($"Disjoint(a, b): {LineLine.Disjoint(a, b)}");                                     // False
Console.WriteLine($"EndpointJoinEndpoint(a, c): {LineLine.EndpointJoinEndpoint(a, c)}");             // True
Console.WriteLine($"EndpointJoinExcludingEndpoints(d, a): {LineLine.EndpointJoinExcludingEndpoints(d, a)}"); // True
Console.WriteLine($"Equal(a, inversa): {LineLine.Equal(a, inversa)}");                               // True

using var archivo = new BinDouble(args[0]);
archivo.Add(new Entity[] { a, b, c, d });
return 0;