Window3D
Espacio de nombres: Digi21.Math
Ensamblado: Digi21.DigiNG
Ventana tridimensional (caja alineada con los ejes), con operaciones de unión, contención, intersección y desplazamiento.
public struct Window3D : IWindow3D, IDesplazable
Implementa: IWindow3D e IDesplazable.
Window3D es una estructura (tipo por valor): una asignación copia la ventana, y los métodos que modifican la ventana (Offset, Inflate y Union de instancia) no tienen efecto si se llaman sobre una copia, por ejemplo sobre el valor que devuelve una propiedad.
Una ventana no inicializada tiene Xmin a null. Es el estado de new Window3D() y de default(Window3D). El método Union de instancia inicializa una ventana no inicializada con los límites del argumento, así que una envolvente se calcula partiendo de new Window3D() y llamando a Union con cada punto.
A diferencia de Window2D, Window3D no tiene un campo público WholeWorld ni métodos Intersection.
Los parámetros Point y PointF son de System.Drawing; Size también. Un Point o un PointF se trata como un punto de Z igual a 0.
Constructores
public Window3D(double xMin, double yMin, double zMin, double xMax, double yMax, double zMax)
public Window3D(Point3D point)
public Window3D(IWindow3D window)
| Constructor | Descripción |
|---|---|
Window3D(double xMin, double yMin, double zMin, double xMax, double yMax, double zMax) |
Crea la ventana con esos límites. No comprueba que cada mínimo sea menor o igual que su máximo: si no se cumple, Valid es false. |
Window3D(Point3D point) |
Crea una ventana de ancho, alto y profundidad 0 en el punto. |
Window3D(IWindow3D window) |
Copia los seis límites de window, incluido un Xmin a null. Lanza NullReferenceException si window es null. |
Propiedades
| Propiedad | Descripción |
|---|---|
| double? Xmin | Coordenada X mínima, o null si la ventana no está inicializada. |
| double Ymin, double Zmin | Coordenadas Y y Z mínimas. |
| double Xmax, double Ymax, double Zmax | Coordenadas X, Y y Z máximas. |
| bool Valid | true si Xmin no es null, Xmin <= Xmax, Ymin <= Ymax y Zmin <= Zmax. |
| double Width, double Height, double Depth | Xmax - Xmin, Ymax - Ymin y Zmax - Zmin. |
| Point3D Center | Centro de la caja. |
| NW, N, NE, E, SE, S, SW, W | Esquinas y puntos medios de los lados en el plano X, Y, de tipo Point3D. La Z de los ocho puntos es Zmin. |
Width, Height, Depth, Center y los ocho puntos lanzan InvalidOperationException si Xmin es null. Si Xmin no es null pero Valid es false, no lanzan excepción y devuelven los valores calculados con esos límites.
Métodos
Offset
public void Offset(double x, double y, double z)
public void Offset(double x, double y)
public void Offset(Point3D offset)
public void Offset(Point2D offset)
Suma x, y y z a los mínimos y máximos de cada eje. Las sobrecargas sin Z (Offset(double, double) y Offset(Point2D)) desplazan 0 en Z. Lanza InvalidOperationException si Xmin es null. Son los métodos de IDesplazable.
Inflate
public void Inflate(double x, double y, double z)
public void Inflate(double x, double y)
public void Inflate(Point3D size)
public void Inflate(Size size)
Resta x, y y z de los mínimos y los suma a los máximos: cada dimensión crece el doble del valor. Un valor negativo reduce la ventana. Inflate(double, double) e Inflate(Size) no cambian la Z; Inflate(Size) usa size.Width y size.Height. Lanza InvalidOperationException si Xmin es null.
Union
public void Union(Point3D point)
public void Union(PointF point)
public void Union(Point point)
public void Union(Window3D window)
public void Union(IWindow3D window)
public void Union(double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
Amplía la ventana para que contenga el punto o la ventana del argumento.
- Si
Xminesnull, la ventana toma los límites del argumento: un punto produce una ventana de dimensiones 0, y una ventana se copia tal cual, aunque no esté inicializada. - Si
Xminno esnully el argumento es una ventana no inicializada, lanzaInvalidOperationException. Union(PointF)yUnion(Point)usan Z igual a 0: la ventana resultante incluye siempre la cota 0.Union(IWindow3D)lanzaNullReferenceExceptionsiwindowesnull.
El orden de los parámetros de Union(double, …) es xMin, xMax, yMin, yMax, zMin, zMax, distinto del orden del constructor.
Contains
public bool Contains(Point3D point)
public bool Contains(PointF point)
public bool Contains(Point point)
public bool Contains(Window3D window)
public bool Contains(IWindow3D window)
Devuelve true si el punto o la ventana del argumento está dentro de esta ventana, bordes incluidos. Contains(Point3D) y las sobrecargas con ventana comparan X, Y y Z; Contains(PointF) y Contains(Point) comparan solo X e Y. Lanza InvalidOperationException si Xmin de esta ventana es null o, en las sobrecargas con ventana, si Xmin del argumento es null.
Intersect e Intersect2D
public bool Intersect(Window3D window)
public bool Intersect2D(Window3D window)
public bool Intersect2D(Point3D point)
Intersect devuelve true si las dos cajas tienen algún punto común en X, Y y Z, incluido un borde compartido. Intersect2D compara solo X e Y: con un punto, devuelve true si la X y la Y del punto están dentro de la ventana. Lanzan InvalidOperationException si Xmin de esta ventana o de window es null.
ToString
public override string ToString()
Devuelve Xmin=… Ymin=… Zmin=… Xmax=… Ymax=… Zmax=… Width=… Height=… Long=… o, si Xmin es null, (Uninitialized window). El texto está en el idioma de la interfaz de usuario (CultureInfo.CurrentUICulture): en español, Ancho, Alto y Largo, y (Ventana sin inicializar).
Métodos estáticos
Union
public static Window3D Union(Window3D a, Window3D b)
public static Window3D Union(IWindow3D a, IWindow3D b)
Devuelve la caja que contiene a y b. Si una de las dos ventanas no está inicializada, devuelve la otra; si ninguna lo está, devuelve a (no inicializada).
public static Window3D Union(Window3D window, Point3D point)
public static Window3D Union(Window3D window, PointF point)
public static Window3D Union(Window3D window, Point point)
public static Window3D Union(IWindow3D window, Point3D point)
public static Window3D Union(IWindow3D window, PointF point)
public static Window3D Union(IWindow3D window, Point point)
public static Window3D Union(Window3D window, double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
public static Window3D Union(IWindow3D window, double xMin, double xMax, double yMin, double yMax, double zMin, double zMax)
Devuelve la caja que contiene window y el punto o la caja de los seis límites. Con PointF o Point, la Z del punto es 0. Si Xmin de window es null, devuelve la caja de dimensiones 0 del punto o la caja de los seis límites.
Las sobrecargas con IWindow3D lanzan NullReferenceException si el argumento es null. Los métodos no modifican sus argumentos.
Operadores
public static explicit operator Window2D(Window3D window)
Convierte la ventana en una Window2D con los mismos Xmin, Ymin, Xmax e Ymax. Descarta Zmin y Zmax. Una ventana no inicializada se convierte en una Window2D no inicializada.
Excepciones
| Excepción | Cuándo |
|---|---|
InvalidOperationException |
Se lee Width, Height, Depth, Center o un punto cardinal, o se llama a Offset, Inflate, Contains, Intersect o Intersect2D, sobre una ventana con Xmin a null, o con un argumento de tipo ventana con Xmin a null. También en el método Union de instancia sobre una ventana inicializada con una ventana no inicializada como argumento. |
NullReferenceException |
Un argumento de tipo IWindow3D es null. |
Ejemplo
Este programa calcula la caja que envuelve tres puntos, comprueba su relación con un punto y con otra caja, y convierte el resultado en una Window2D:
using Digi21.Math;
Point3D[] puntos =
{
new Point3D(440000, 4470000, 612.4),
new Point3D(440250, 4470100, 655.0),
new Point3D(440120, 4469900, 630.8),
};
// Una Window3D creada con new Window3D() no está inicializada: Xmin es null.
var caja = new Window3D();
foreach (var punto in puntos)
caja.Union(punto);
Muestra(caja);
// Contains(Point3D) compara X, Y y Z; Intersect2D compara solo X e Y.
var fueraDeCota = new Point3D(440100, 4470000, 700);
Console.WriteLine(caja.Contains(fueraDeCota)); // False
Console.WriteLine(caja.Intersect2D(fueraDeCota)); // True
var otra = new Window3D(440200, 4470050, 600, 440400, 4470300, 640);
Console.WriteLine(caja.Intersect(otra)); // True
var total = Window3D.Union(caja, otra);
Muestra(total);
// La conversión a Window2D descarta Zmin y Zmax.
var plano = (Window2D)total;
Console.WriteLine($"{plano.Width} x {plano.Height}");
static void Muestra(IWindow3D ventana)
{
if (!ventana.Valid)
{
Console.WriteLine("Ventana no válida");
return;
}
Console.WriteLine($"X: {ventana.Xmin} a {ventana.Xmax}, Y: {ventana.Ymin} a {ventana.Ymax}, Z: {ventana.Zmin} a {ventana.Zmax}");
Console.WriteLine($"{ventana.Width} x {ventana.Height} x {ventana.Depth}, centro {ventana.Center}");
}