Segment

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

Segmento entre dos Point3D, el origen y el destino.

public struct Segment

Segment es un tipo de valor. Las propiedades FirstSegment y LastSegment de ReadOnlyLine devuelven el primer y el último segmento de una línea.

Los métodos AnalyzeRelation, AnalyzeRelationPlaneXY, Distance, Distance2D, Perpendicular, Intersection e InterpolatedZ trabajan con la recta que pasa por el origen y el destino, no con el segmento: los resultados pueden estar fuera del segmento.

Constructores

public Segment(Point3D origin, Point3D destination)

Crea el segmento que va de origin a destination. El constructor sin parámetros de la estructura crea un segmento con los dos extremos en (0, 0, 0).

Propiedades

Propiedad Descripción
Point3D Origin { get; set; } Origen del segmento.
Point3D Destination { get; set; } Destino del segmento.
Point3D DirectionVector { get; } Vector Destination - Origin, sin normalizar.
Window3D Window { get; } Window3D con las coordenadas mínimas y máximas de los dos extremos.

Métodos

Método Descripción
double Distance(Point3D point) Distancia en el espacio de point a la recta. Si el origen y el destino son iguales según Precision.Epsilon, devuelve la distancia entre point y el origen.
double Distance2D(Point3D point) Igual que Distance, pero en el plano X, Y: no tiene en cuenta las coordenadas Z.
Point3D Perpendicular(Point3D point) Pie de la perpendicular a la recta trazada desde point en el plano X, Y. La Z del resultado es la de la recta en ese punto. Si el origen y el destino tienen las mismas X e Y, devuelve el origen.
double InterpolatedZ(Point2D point) Z de la recta interpolada linealmente a partir de la X de point. Si el origen y el destino tienen la misma X según Precision.Epsilon, la interpolación se hace con la Y; si también tienen la misma Y, devuelve la Z del origen. No comprueba que point esté sobre la recta.

Métodos estáticos

Método Descripción
SegmentRelation AnalyzeRelation(Segment a, Segment b) Posición relativa de las dos rectas en el espacio: Crossed, Cutted, Paralel o Coincident. Lee SegmentRelation.
SegmentRelation AnalyzeRelationPlaneXY(Segment a, Segment b) Posición relativa de las proyecciones de las dos rectas en el plano X, Y: Cutted, Paralel o Coincident.
Point3D Intersection(Segment a, Segment b) Punto de corte de las dos rectas en el plano X, Y. La Z del resultado se interpola en la recta de a, como en InterpolatedZ. Lanza InvalidOperationException si las rectas son paralelas o coincidentes en el plano X, Y.
double CalculateAngle(Segment a, Segment b) Ángulo entre las proyecciones en el plano X, Y de los vectores de dirección de a y de b, en radianes, entre 0 y π. Devuelve NaN si uno de los segmentos tiene longitud 0 en el plano X, Y.

AnalyzeRelation y AnalyzeRelationPlaneXY calculan rangos de matrices con los vectores de dirección y el vector que une los dos orígenes, y comparan los determinantes con 0 sin tolerancia. Un segmento con el origen igual al destino se clasifica como Paralel o Coincident.

Ejemplo

Este programa analiza dos segmentos que se cruzan en el espacio y se cortan en el plano X, Y:

using Digi21.Math;

var a = new Segment(new Point3D(0.0, 0.0, 100.0), new Point3D(10.0, 10.0, 110.0));
var b = new Segment(new Point3D(0.0, 10.0, 0.0), new Point3D(10.0, 0.0, 0.0));

// En el espacio las rectas no se tocan; en el plano X, Y se cortan.
Console.WriteLine(Segment.AnalyzeRelation(a, b));        // Crossed
Console.WriteLine(Segment.AnalyzeRelationPlaneXY(a, b)); // Cutted

if (Segment.AnalyzeRelationPlaneXY(a, b) == SegmentRelation.Cutted)
{
    // Intersección en el plano X, Y; la Z se interpola en el segmento a.
    var corte = Segment.Intersection(a, b);
    Console.WriteLine(corte);                            // ≈ (5, 5, 105)
}

var ángulo = Segment.CalculateAngle(a, b);
Console.WriteLine(Angles.RadianToSexagesimal(ángulo));   // ≈ 90

var punto = new Point3D(10.0, 0.0, 0.0);
Console.WriteLine(a.Distance2D(punto));                  // ≈ 7.071
Console.WriteLine(a.Perpendicular(punto));               // (5,5,105)
Console.WriteLine(a.InterpolatedZ(new Point2D(2.0, 2.0))); // 102