Não é que isso não faça sentido, mas funciona mal em 99% das vezes.
Geralmente, os retângulos gráficos 2D são inicializados, armazenados e manipulados como um par de pontos. Em nenhum idioma específico,
class Rect:
p1, p2: point
Faz mais sentido definir um retângulo como dois valores x e dois valores y, assim:
class Rect
xleft, xright: int
ytop, ybottom: int
Com dois pontos, se em algum lugar do código-fonte você quiser usar o valor y do topo, você deve dizer rect.p1.y (hmmm, pare e pense, é p1 ou p2), mas com os quatro valores como membros simples dos dados, é claro e direto: rect.ytop (não é necessário pensar!) O uso de dois pontos significa que, ao lidar com a vertical, é necessário emaranhar a horizontal; há uma relação estranha entre elementos independentes.
Como surgiu essa ideia de dois pontos e por que persiste? Tem algum benefício sobre as coordenadas nuas x e y?
NOTA ADICIONADA: Esta pergunta está no contexto de retângulos alinhados com XY, como em gerenciadores de janelas e kits de ferramentas da GUI, não no contexto de formas arbitrárias no aplicativo de desenho e pintura.
fonte
Respostas:
Você considerou menos propenso a erros?
Se você usar (Ponto1, Ponto2), ficará muito claro o que você está especificando. Se você fornecer 2 pontos, o único erro possível é que o usuário misturou seus x e y ao construir os pontos, pois a ordem dos pontos não importa.
Se você fornecer 4 números inteiros, se alguém não estiver prestando atenção, eles poderão fornecer (x1, x2, y1, y2) quando você desejar (x1, y1, x2, y2) ou vice-versa. Além disso, algumas APIs, como a estrutura Rect do WCF, definem um retângulo como (x, y, largura, altura), o que pode causar confusão sobre o que (1, 2, 3, 4) significa. Isso é (x, y, w, h) ou (x1, y1, x2, y2) ou (x1, x2, y1, y2)?
Em suma, (Ponto1, Ponto2) parece um pouco mais seguro para mim.
fonte
Eu sempre gostei de definir um retângulo como um ponto + largura e altura, onde o ponto é o canto superior esquerdo do retângulo.
E adicione os métodos necessários para buscar as outras métricas. Como a versão Java
fonte
Na verdade, um retângulo não é definido por 2 pontos. Um retângulo só pode ser definido por dois pontos se for paralelo aos eixos.
Existem várias maneiras de representar retângulos paralelos aos eixos:
Para (1), muitas bibliotecas usam uma convenção para determinar quais dois pontos são usados - topLeft e bottomRight, por exemplo.
A escolha da representação pode ser orientada pelo objetivo original da definição do retângulo, mas imagino que ela seja frequentemente arbitrária . As representações são equivalentes nas informações que elas carregam. Porém, diferem na facilidade com que as propriedades do retângulo podem ser calculadas e na conveniência com que as operações podem ser executadas no retângulo.
Os benefícios da definição (1) sobre outros incluem:
fonte
Bem,
p1: Point
ep2: Point
cada uma delas terá duasint
coordenadas , de qualquer maneira, então sua classe não equivale à mesma coisa?E se você armazenar esses dois pontos como
Point
objetos de primeira classe , não terá mais utilidade deles? Na maioria dos sistemas de coordenadas gráficas que eu conheço, os pontos são subclassificados dessa maneira para criar uma hierarquia de objetos:point -> circle -> ellipse
e assim por diante.Portanto, se você criar um objeto que não usa a
Point
classe, você o separou do restante da hierarquia de classes.fonte
ytop
/ybottom
, no entanto, também precisaria haver uma garantia em algum lugar queybottom
esteja realmente abaixoytop
.É por isso que eu gosto do Delphi
TRect
. É definido como um registro variante (estrutura de união em C-speak) que pode ser interpretado como um ponto TopLeft e BottomRight, ou inteiros Top, Left, Bottom e Right, o que for mais conveniente no momento.fonte
Certamente, se você definir seu retângulo como:
então você sabe imediatamente qual é o ponto.
Melhor ainda seria adicionar propriedades extras que permitissem manipular o retângulo da maneira que fosse necessária para o seu aplicativo. Isso simplesmente atualizaria a estrutura de dados subjacente.
Ao adicionar uma transformação à forma, você pode orientar seu retângulo da maneira que desejar. Você ainda precisaria de uma caixa delimitadora alinhada ao eixo para verificações rápidas de aceitação / rejeição :)
No entanto, se seu modelo permitir retângulos em qualquer orientação sem aplicar uma transformação, "canto inferior esquerdo" e "canto superior direito" não terão significado, o que leva a "p1" e "p2" (ou algo equivalente).
fonte
acho que faz mais sentido que um retângulo seja representado por uma extensão xey de um ponto; você pode até fazer a localização apontar para o centro do retângulo, para que seja independente da rotação
mas provavelmente foi mais fácil codificá-lo como dois pontos!
fonte
Não gosto disso porque lançamos fora um grau de liberdade potencial, que essencialmente permite uma rotação arbitrária. Um retângulo 2D geral possui cinco incógnitas (graus de liberdade). Poderíamos especificá-los como as coordenadas de um ponto, os comprimentos dos dois lados que formam um vértice com esse ponto e o ângulo da horizontal da primeira linha (sendo o outro assumido um ângulo 90 graus maior). Um número infinito de outras possibilidades também pode ser usado, mas há cinco quantidades independentes que devem ser especificadas. Algumas escolhas levarão a álgebra mais fácil do que outras, dependendo do que for feito com elas.
fonte
Não é exatamente o mesmo que 2 pontos? Como isso é constrangedor ... a maioria das rotinas de desenho exige pontos, não componentes x / y separados.
fonte
Definir retângulos como pares de pontos permite reutilizar o ponto como um vértice para outra forma. Apenas um pensamento...
fonte
Eu acredito que é principalmente estabelecer uniformidade entre todas as formas primitivas.
Claro que você pode definir o retângulo de várias maneiras diferentes, mas como você define um triângulo, uma estrela ou um círculo de uma maneira que possa usar estruturas de dados semelhantes?
Todos os polígonos podem ser definidos por seus pontos, com uma pequena quantidade de lógica para determinar o que fazer com os pontos.
As bibliotecas gráficas operam principalmente nesses polígonos em termos de vértices e arestas, portanto, pontos e linhas entre eles, todos os cálculos funcionam nesses dois recursos, bem isso e facetas, mas isso é apenas uma função das arestas.
fonte
Em duas dimensões, armazenar um retângulo como dois pontos é mais claro do que definir um canto específico e uma largura e altura - considere largura ou altura negativa ou os cálculos necessários para determinar cada opção da outra.
Executar rotações em um retângulo definido por pontos também é muito mais simples do que aquele definido com um ponto mais largura e altura.
Eu esperaria que o encapsulamento tornasse essa diferenciação sem importância como usuário da classe.
Um retângulo deve ser definido como três pontos a serem bem definidos em 3 dimensões. Não tenho muita certeza do requisito para definir um retângulo em 4 ou mais dimensões.
fonte
É completamente arbitrário. Você precisa de quatro informações para desenhar um retângulo. O (s) designer (s) da biblioteca decidiu representá-lo com dois pontos (cada um com uma coordenada xy), mas poderia facilmente fazê-lo com x / y / m / h ou em cima / baixo / esquerda / direita.
Suponho que a verdadeira questão do OP seja: por que essa escolha específica foi feita?
fonte
A escolha dos parâmetros é importante apenas para os projetistas / codificadores de baixo nível.
Usuários de alto nível só precisam pensar em:
Nota: Para minimizar a perda de precisão durante a transformação de escala, às vezes é apropriado implementar uma segunda classe Rect que usa coordenadas de ponto flutuante, para que os resultados intermediários possam ser armazenados com precisão em uma sequência de transformações e arredondados apenas para número inteiro no último passo.
fonte
Como @Steven diz, acho que deveria ser em termos de um (x, y) ponto e um vetor de tamanho (w, h). Isso ocorre porque é fácil cair em uma ambiguidade. Suponha que você tenha o seguinte retângulo preenchido começando no ponto (0,0).
Claramente é a largura, a altura é (3,3), mas qual é o segundo ponto? É (2,2) ou (3,3)?
Essa ambiguidade pode causar todos os tipos de problemas.
Eu aprendi a maneira duros anos atrás que é melhor pensar de coordenadas gráficas como as linhas entre os pixels, não como as linhas de pixels são on . Dessa forma, não há ambiguidade.
fonte
Podemos definir ambos Pb & Pc assim:
e
Portanto, não há necessidade de definir todos os quatro pontos devido à simetria
fonte