No es que esto no tenga sentido, pero simplemente resulta incómodo el 99% del tiempo.
A menudo, en gráficos 2D, los rectángulos se inicializan, almacenan y manipulan como un par de puntos. En ningún idioma en particular,
class Rect:
p1, p2: point
Tiene más sentido definir un rectángulo como dos valores xy dos valores y, así:
class Rect
xleft, xright: int
ytop, ybottom: int
Con dos puntos, si en algún lugar del código fuente desea utilizar el valor y de la parte superior, tendría que decir rect.p1.y (hmmm, deténgase y piense, es p1 o p2) pero con los cuatro valores como miembros de datos simples, es claro y directo: rect.ytop (¡no se requiere pensar!) El uso de dos puntos significa que al tratar con la vertical, debe enredar la horizontal; Hay una relación extraña entre los elementos independientes.
¿Cómo surgió esta idea de dos puntos y por qué persiste? ¿Tiene algún beneficio sobre las coordenadas x e y desnudas?
NOTA AGREGADA: Esta pregunta está en el contexto de rectángulos alineados XY, como en los administradores de ventanas y los kits de herramientas GUI, no en el contexto de formas arbitrarias en la aplicación de dibujo y pintura.
fuente
Respuestas:
¿Has considerado que es menos propenso a errores?
Si usa (Punto1, Punto2), entonces queda muy claro lo que está especificando. Si proporciona 2 puntos, entonces el único error posible es que el usuario ha mezclado sus x e y al construir los puntos, ya que el orden de los puntos no importa.
Si proporciona 4 enteros, si alguien no está prestando atención, puede suministrar (x1, x2, y1, y2) cuando lo desee (x1, y1, x2, y2) o viceversa. Además, algunas API, como la estructura Rect de WCF, definen un rectángulo como (x, y, ancho, alto) que podría causar confusión sobre lo que significa (1, 2, 3, 4). ¿Es eso (x, y, w, h) o (x1, y1, x2, y2) o (x1, x2, y1, y2)?
En general, (Punto1, Punto2) me parece un poco más seguro.
fuente
Siempre me gustó definir un rectángulo como punto + ancho y alto, donde el punto es la esquina superior izquierda del rectángulo.
Y luego agregue los métodos que necesite para obtener las otras métricas. Como la versión de Java
fuente
En realidad, un rectángulo no está definido por 2 puntos. Un rectángulo solo puede definirse por dos puntos si es paralelo a los ejes.
Hay varias formas de representar rectángulos que son paralelos a los ejes:
Para (1), muchas bibliotecas usan una convención para determinar qué dos puntos se utilizan: topLeft y bottomRight, por ejemplo.
La elección de la representación puede estar impulsada por el propósito original de la definición del rectángulo, pero imagino que a menudo es arbitraria . Las representaciones son equivalentes en la información que llevan. Sin embargo, difieren en la facilidad con que se pueden calcular las propiedades del rectángulo y la conveniencia con la que se pueden realizar operaciones en el rectángulo.
Los beneficios de la definición (1) sobre otros incluyen:
fuente
Bueno,
p1: Point
yp2: Point
cada uno tendrá dosint
coordenadas de todos modos, entonces, ¿su clase no equivale a lo mismo?Y si almacena esos dos puntos como
Point
objetos de primera clase , ¿no obtiene un poco más de utilidad de ellos? En la mayoría de los sistemas de coordenadas gráficas que conozco, los puntos se subclasifican de esta manera para crear una jerarquía de objetos:point -> circle -> ellipse
y así sucesivamente.Entonces, si crea un objeto que no usa la
Point
clase, se ha divorciado de ese objeto del resto de la jerarquía de clases.fuente
ytop
/ybottom
, también debería haber una garantía en algún lugar queybottom
esté realmente debajoytop
.Por eso me gusta Delphi's
TRect
. Se define como un registro variante (estructura de unión en C-speak) que se puede interpretar como un punto superior izquierdo y uno inferior derecho, o enteros superior, izquierdo, inferior y derecho, lo que sea más conveniente en este momento.fuente
Seguramente si define su rectángulo como:
entonces sabes de inmediato qué punto es cuál.
Aún mejor sería agregar propiedades adicionales que le permitieran manipular el rectángulo de cualquier forma que necesitara para su aplicación. Estos simplemente actualizarían la estructura de datos subyacente.
Al agregar una transformación a la forma, puede orientar su rectángulo de la forma que desee. Aún necesitaría un cuadro delimitador alineado con el eje para verificaciones de aceptación / rechazo rápidas :)
Sin embargo, si su modelo permite rectángulos en cualquier orientación sin aplicar una transformación, entonces "abajo a la izquierda" y "arriba a la derecha" no tienen significado, lo que lleva de nuevo a "p1" y "p2" (o algo equivalente).
fuente
Creo que tiene más sentido que un rectángulo esté representado por una extensión x e y y un punto; incluso podría hacer que la ubicación apunte al centro del rectángulo para que sea independiente de la rotación
¡pero probablemente fue más fácil codificarlo como dos puntos!
fuente
No me gusta porque hemos arrojado un posible grado de libertad, que esencialmente permite una rotación arbitraria. Un rectángulo 2D general tiene cinco incógnitas (grados de libertad). Podríamos especificarlos como las coordenadas de un punto, las longitudes de los dos lados que forman un vértice con este punto y el ángulo desde la horizontal de la primera línea (se supone que el otro tiene un ángulo 90 grados mayor). También se podría utilizar un número infinito de otras posibilidades, pero hay cinco cantidades independientes que deben especificarse. Algunas opciones conducirán a un álgebra más fácil que otras, dependiendo de lo que se haga con ellas.
fuente
¿No es exactamente lo mismo que 2 puntos? Cómo es esto incómodo ... la mayoría de las rutinas de dibujo requieren puntos, no componentes separados x / y.
fuente
La definición de rectángulos como pares de puntos le permite reutilizar el punto como vértice para otra forma. Solo un pensamiento...
fuente
Creo que es principalmente para establecer la uniformidad entre todas las primitivas de forma.
Claro que puede definir un rectángulo de muchas maneras diferentes, pero ¿cómo define un triángulo, una estrella o un círculo de manera que pueda usar estructuras de datos similares?
Todos los polígonos se pueden definir por sus puntos, con una pequeña cantidad de lógica para determinar qué hacer con los puntos.
Las bibliotecas de gráficos operan principalmente en estos polígonos en términos de vértices y bordes, por lo que los puntos y las líneas entre ellos, todos los cálculos funcionan en estas dos características, bien eso y facetas, pero eso en sí mismo es solo una función de los bordes.
fuente
En dos dimensiones, almacenar un rectángulo como dos puntos es más claro que definir una esquina particular y un ancho y alto: considere el ancho o alto negativo, o los cálculos necesarios para determinar cada opción a partir de la otra.
Realizar rotaciones en un rectángulo definido por puntos también es mucho más simple que uno definido con un punto más ancho y alto.
Esperaría que la encapsulación haga que esta diferenciación no sea importante como usuario de la clase.
Un rectángulo debe definirse como tres puntos para estar bien definido en 3 dimensiones. No estoy completamente seguro del requisito para definir un rectángulo en 4 o más dimensiones.
fuente
Es completamente arbitrario. Necesita cuatro piezas de información para dibujar un rectángulo. El diseñador de la biblioteca decidió representarlo con dos puntos (cada uno con una coordenada xy), pero podría haberlo hecho fácilmente con x / y / w / ho arriba / abajo / izquierda / derecha.
Supongo que la verdadera pregunta del OP es: ¿ por qué se hizo esta elección en particular?
fuente
La elección de los parámetros solo es importante para los diseñadores / codificadores de bajo nivel.
Los usuarios de alto nivel solo necesitan pensar en:
Nota: Para minimizar la pérdida de precisión durante la transformación de escala, a veces es apropiado implementar una segunda clase Rect que utiliza coordenadas de punto flotante, de modo que los resultados intermedios se puedan almacenar con precisión en una secuencia de transformaciones y solo redondearse a entero en el último paso.
fuente
Como dice @Steven, creo que debería ser en términos de un punto (x, y) y un vector de tamaño (w, h). Eso es porque es fácil caer en una ambigüedad. Suponga que tiene el siguiente rectángulo relleno comenzando en el punto (0,0).
Claramente su ancho, altura son (3,3), pero ¿cuál es su segundo punto? ¿Es (2,2) o (3,3)?
Esta ambigüedad puede causar todo tipo de problemas.
Aprendí hace la forma en años duros que es mejor pensar en coordenadas gráficas como las líneas entre los píxeles, no como las líneas de los píxeles son en . De esa manera no hay ambigüedad.
fuente
Podemos definir tanto Pb como Pc así:
y
Por lo tanto, no es necesario definir los cuatro puntos debido a la simetría
fuente