2011-04-30 16 views
10

¿Alguien puede explicar por qué el tamaño negativo de Rectangle se cruzan de la forma en que lo hacen?¿Cómo se intersectan los rectángulos de tamaño negativo?

var r = new Rectangle(0, 0, 3, 3); 
var r0 = new Rectangle(0, 0, -1, -1); 
var r1 = new Rectangle(1, 1, -1, -1); 
var r2 = new Rectangle(2, 2, -1, -1); 
var r3 = new Rectangle(3, 3, -1, -1); 

System.Console.WriteLine(r.IntersectsWith(r0)); // False 
System.Console.WriteLine(r.IntersectsWith(r1)); // False 
System.Console.WriteLine(r.IntersectsWith(r2)); // True 
System.Console.WriteLine(r.IntersectsWith(r3)); // False 

yo creo r1 y r2 siempre debe cruzarse con r, a pesar de que no lo hacen. r3 debe cruzarse si se considera su tamaño negativo. Si no se consideran los tamaños negativos, r0 deben cruzarse.

¿Por qué funciona así y qué otras advertencias debo tener en cuenta cuando trabajo con estructuras Rectangle?

+0

No tengo idea ... Supongo que el comportamiento de IntersectsWith no está definido para rectángulos de tamaño negativo, aunque no está documentado como tal en [API] (http://msdn.microsoft.com/en-us/ library/y10fyck0.aspx) ... ¿Le sugiero que publique esta pregunta en MSDN como "contenido de la comunidad"? Es una REALMENTE buena pregunta. Uno sospecha que el comportamiento de Rectangle de tamaño negativo no está definido para todas las operaciones espaciales ... ¿Se procesan como se espera? – corlettk

+1

@corlettk: "Contenido de la comunidad" ** no ** está destinado a publicar preguntas.Para eso están los foros de MSDN. –

+0

Thanx Cody. Nunca he usado los foros de MSDN ;-) – corlettk

Respuesta

8

Si crea un rectángulo con un ancho negativo, dibuja un rectángulo que comienza en el punto original (x, y) y dibuja hacia la izquierda en lugar de hacia la derecha.

Si crea un rectángulo con una altura negativa, dibuja un rectángulo que comienza en el punto original (x, y) y dibuja hacia arriba en lugar de hacia abajo.

Por lo tanto, si hace un rectángulo de con decir new Rectangle(5, 4, -1, -2);, entonces obtiene un rectángulo con los siguientes puntos: (5,4), (4,4), (5,2), (4,2).

ejecute el código siguiente para ver un ejemplo:

Rectangle negWidthHeightRect = new Rectangle(5, 4, -1, -2); 
    Console.WriteLine(negWidthHeightRect.Left); 
    Console.WriteLine(negWidthHeightRect.Right); 
    Console.WriteLine(negWidthHeightRect.Bottom); 
    Console.WriteLine(negWidthHeightRect.Top); 
    Console.WriteLine(negWidthHeightRect.Width); 
    Console.WriteLine(negWidthHeightRect.Height); 
    Console.ReadLine(); 

La salida es la siguiente:

5 
4 
2 
4 
-1 
-2 

El comportamiento es un tanto esperar teniendo en cuenta los comentarios de Microsoft en otros controles de rectángulo como (además del sistema. Drawing.Rectangle). Ver MSDM here.

Ahora, ¿por qué el método IntersectsWith del rectángulo produce resultados tan extraños. Es porque está utilizando el siguiente código para implementar el método IntersectsWith:

public bool IntersectsWith(Rectangle rect) 
{ 
    return ((((rect.X < (this.X + this.Width)) && (this.X < (rect.X + rect.Width))) && (rect.Y < (this.Y + this.Height))) && (this.Y < (rect.Y + rect.Height))); 
} 

Si usted sigue a través de la lógica de sí mismo que va a ver por qué a obtener las respuestas que recibe. Lo que Microsoft probablemente debería hacer es o bien:

1) cuando se ve una anchura/altura negativos hacen que la anchura/altura positiva y reajustar la izquierda/Superior

2) o en la lógica IntersectsWith, se debe hacer una Min (x, x + ancho) y Min (y, y + ancho) al hacer la lógica.

Algunos otros más inteligentes que yo pueden tener una forma aún más ingeniosa de hacerlo.

+0

bien investigado – jonsca

0

Mira el primer comentario sobre la respuesta a this question. Parece decir que la altura y el ancho negativos representan un rectángulo dibujado en el cuadrante que está arriba y a la izquierda de la coordenada actual.

+0

, lo que significa que 'Rectángulo (0, 0, -x, -x)' es lo mismo que 'Rectángulo (-x, -x, x, x)'. –

+0

@Dan D. Me parece que es verdad. Me sorprendió por completo que fuera una entrada válida. Hablan de 'ScreenToClient' y' ClientToScreen' en esa respuesta (que personalmente no tengo mucha experiencia), lo que me lleva a creer que es parte de sus maquinaciones internas. – jonsca

+0

@Dan D. ¿Esto implica que 'Rectangle (1, 1, -1, -1)' es lo mismo que 'Rectangle (0, 0, 1, 1)'? Si es así, aún debería cruzarse con 'r'. – dlras2

Cuestiones relacionadas