ISnapable
Espacio de nombres: Digi21.DigiNG.Entities
Ensamblado: Digi21.DigiNG
Entidad sobre la que se puede tentativar (snap, enganchar el cursor a un vértice o a un segmento): calcula el vértice más cercano, la proyección sobre el segmento más cercano y la distancia a una coordenada.
public interface ISnapable
Tipos que la implementan: ReadOnlyLine, ReadOnlyPolygon, ReadOnlyPoint, ReadOnlyText y sus tipos derivados (Line, Polygon, Point, Text). ReadOnlyComplex no la implementa.
Las distancias que devuelven NearestVertex y NearestSegment se miden en el plano XY. En un polígono solo se analizan los vértices y segmentos del contorno exterior: los huecos no se tienen en cuenta.
Métodos
| Miembro | Descripción |
|---|---|
Point3D Distance(Point3D coordinate) |
Devuelve el vector desde coordinate hasta el punto de la entidad más cercano. |
double NearestSegment(Point3D coordinate, out Point3D calculatedCoordinate, out int segment) |
Busca el segmento más cercano a coordinate y devuelve la proyección perpendicular sobre él, su índice y la distancia. |
double NearestVertex(Point3D coordinate, out Point3D nearestVertex, out int vertex) |
Busca el vértice más cercano a coordinate y devuelve sus coordenadas, su índice y la distancia. |
Ejemplo
Este programa busca, para una misma coordenada, el vértice y el segmento más cercanos de una línea y de un punto, y la distancia a cada entidad:
using Digi21.DigiNG.Entities;
using Digi21.DigiNG.IO.BinDouble;
using Digi21.Math;
if (args.Length != 1)
{
Console.WriteLine("Uso: Tentativas <salida.bind>");
return 1;
}
using var archivo = new BinDouble(args[0]);
var línea = new Line(new Code("040101"));
línea.Points.Add(new Point3D(0.0, 0.0, 0.0));
línea.Points.Add(new Point3D(100.0, 0.0, 10.0));
línea.Points.Add(new Point3D(100.0, 100.0, 20.0));
var poste = new Point(new Code("030101")) { Coordinate = new Point3D(50.0, 30.0, 5.0) };
var cursor = new Point3D(40.0, 5.0, 0.0);
foreach (ISnapable entidad in new ISnapable[] { línea, poste })
{
var distanciaVértice = entidad.NearestVertex(cursor, out Point3D vértice, out int índiceVértice);
Console.WriteLine($"Vértice {índiceVértice} en {vértice}, a {distanciaVértice} (XY)");
try
{
var distanciaSegmento = entidad.NearestSegment(cursor, out Point3D proyección, out int segmento);
Console.WriteLine($"Segmento {segmento}, proyección {proyección}, a {distanciaSegmento} (XY)");
}
catch (Exception e)
{
// Una línea lanza Exception si la proyección no cae dentro de ningún segmento.
Console.WriteLine(e.Message);
}
// Vector desde el cursor hasta el punto más cercano de la entidad.
Point3D vector = entidad.Distance(cursor);
Console.WriteLine($"Distancia 3D {vector.Module}, en XY {vector.Point2D.Module}");
}
archivo.Add(línea);
archivo.Add(poste);
return 0;