Por que a origem das coordenadas de computação gráfica no canto superior esquerdo?

37

Pelo que vi quase todas as coisas, use coordenadas onde (0, 0) está no canto superior esquerdo e o eixo Y positivo vai na direção descendente da tela.

Por que é assim? Por que o eixo Y positivo convencional não sobe como mostrado nos gráficos das aulas simples de matemática?

user3387566
fonte
7
Eu diria que começar do topo e aumentar à medida que você desce faz mais sentido do que a convenção matemática, pois se relaciona mais de perto com a maneira como as línguas indo-européias são lidas e escritas.
Panda Pyjama
3
Penso que o Y + up faz sentido ao desenhar objetos físicos, pois o solo é sua origem e a maior parte do seu mundo está acima do solo. No entanto, para exibições, suponho que esteja relacionado a imitar a maneira como as línguas indo-européias são escritas.
Panda Pajama
4
As coordenadas normalizadas de dispositivos do OpenGL não têm um eixo Y para cima?
Raio
1
Então você está essencialmente perguntando "Qual é a origem da origem?"?
Ken

Respostas:

43

Isso é causado na história. Os computadores antigos tinham tubos de raios catódicos (CRTs) que "desenham" a imagem com um raio catódico do canto superior esquerdo ao canto inferior direito.

Para facilitar a interface entre a memória da placa de vídeo e o CRT, a memória foi lida desde o início e a imagem foi desenhada do canto superior esquerdo (com o endereço de memória mais baixo) para o canto inferior direito (com o endereço de memória mais alto).

Extensão (com base nos comentários)

Os CRTs são baseados em aparelhos de TV analógicos disponíveis na época.

Os aparelhos de TV criam a imagem linha por linha primeiro da esquerda para a direita e depois de cima para baixo . A razão para isso só pode ser assumida com base no estilo de escrita nos países ocidentais.

Uwe Plonus
fonte
7
Claro, mas por que os CRTs são desenhados a partir do canto superior esquerdo (vistos do espectador)? Por que não verticalmente? Por que não da direita para a esquerda? Por que não de baixo para cima?
Panda Pajama
1
Você pode encontrar a criação da imagem de um CRT aqui . Basicamente, isso é para televisão analógica, mas um CRT para um computador tem a mesma tecnologia.
perfil completo de Uwe Plonus
12
Os CRTs de computador @PandaPajama fazem isso porque é assim que os padrões de TV analógica são; inicialmente, para computadores domésticos, muitas vezes as TVs eram usadas em vez de monitores especializados. Por que as primeiras TVs transmitiram informações dividindo-as em linhas de varredura e desenhando linhas de varredura da esquerda para a direita - não tenho certeza, mas isso seria consistente com a maneira como escrevemos, de modo que talvez seja uma razão suficientemente boa para escolher entre opções arbitrárias.
Peteris
2
@Peteris: A maneira como os europeus escrevem #
Mooing Duck
1
Tecnicamente, o CRT desenha do Estágio Superior Direito para o Estágio Inferior Esquerdo.
Ps2goat 17/09/14
3

Essa é uma ótima pergunta que eu já pensei várias vezes. A resposta simples para "por que" é que os formatos de TV também desenhavam suas linhas da esquerda para a direita e de cima para baixo. Os monitores de computador originais eram telas CRT (TVs pequenas); portanto, o formato naturalmente permaneceu o mesmo. Quando os monitores se tornaram telas planas (e as TVs também se tornaram telas planas), era igualmente natural manter o mesmo formato para facilitar a compatibilidade.

É claro que você pode perguntar: por que as TVs são desenhadas dessa maneira? Eles foram inventados no início do século 20, para que você possa imaginar quanto pensamento ou falta dele foi introduzido no design, se foi questionado. Nota: não deve ser desrespeitoso, pois é incrivelmente mais desafiador obter equações para desviar magneticamente os raios para as linhas apropriadas na tela, em oposição a uma matriz simples de pequenas "lâmpadas". (Isso meio que levanta a questão de como eles inventaram os CRTs antes da simples matriz de pontos, no início do século XX?)

No entanto, meu palpite é que provavelmente nunca foi questionado (uma coisa ruim), pois as línguas ocidentais escrevem palavras da esquerda para a direita e de cima para baixo. Provavelmente ninguém concebeu a possibilidade de fazê-lo de maneira diferente.

Pessoalmente, não gosto deste formato. Adquiri essa atitude ao programar jogos e outras simulações envolvendo órbitas elípticas. Sempre que você olha para desenhar equações que envolvem pecado, cos ou tan, você deve inverter cuidadosamente os sinais que lidam com os parâmetros do eixo y ... ou irá desenhar a coisa errada. Um exemplo seria as equações paramétricas para uma elipse desenhada em qualquer ângulo 2D. Pode ser um verdadeiro pesadelo dissecando o pecado pecado, pecado cos, e coisas semelhantes.

Sucintamente falando em termos matemáticos, a tela está no quadrante 4 em vez do quadrante 1. Isso é desnecessariamente complicado.

Entre as três dimensões, o eixo z é considerado "ascendente" na direção positiva. Meio irônico. [EDIT]: Talvez não, veja meu comentário abaixo.

Mais duas coisas que eu percebi / deparei:

Os relógios de sol no hemisfério norte (que possuem ponteiros e discos voltados para o norte paralelos ao solo) sempre giram no sentido horário . Portanto, se colocarmos a hora zero no topo da "face do relógio", o ponteiro da sombra começará a se mover para a direita. Essa pode ser a origem da direção da esquerda para a direita nas línguas ocidentais, propagando-se pelas coordenadas cartesianas e telas de TV / computador.

Os computadores antigos não desenhavam tanto objetos gráficos. Eles desenharam texto em um prompt de comando. Portanto, é natural colocar a linha 0 em y = 0. Se tivéssemos uma origem no canto inferior esquerdo, a matemática para desenhar linhas de texto seria um pouco mais envolvida, e isso poderia ter sido um grande problema para os antigos computadores lentos (que até criaram um atalho para aumentar em 1, pelo amor de Deus, chamado "++"). Além disso, você precisa conhecer a resolução da tela, enquanto que, se você fizer a linha 0 em y = 0, não precisará saber a resolução.

DrZ214
fonte
2
Você fazê-lo soar como o início do século 20 foi povoada por neandertais;)
bummzack
1
Ah, eu estava apenas tentando enfatizar o forte contraste na complexidade entre os CRTs e uma matriz de LEDs. Os CRTs têm uma matemática incrivelmente complexa envolvida na deflexão magnética dos raios de luz. Uma matriz de pontos é muito mais fácil de entender: basta enviar corrente elétrica para os LEDs certos na hora certa. Na verdade, essa vasta magnitude de maior complexidade sugere que o início do século XX foi povoado por mais ou melhores gênios, pois eles tiveram que fazer essa coisa mais complexa em uma era muito mais limitada.
DrZ214
Matrizes de LED foram usadas para exibir informações, nunca se tornaram populares para TVs e monitores de computador. As telas planas modernas não são matrizes de LED, mas LCD retroiluminado. Os LEDs são usados ​​apenas para iluminação de fundo em algumas telas, mas a imagem não é criada pelos LEDs. O LCD é uma técnica simples, mas melhorar a resolução da tela antiga do relógio para centenas ou milhares de pixels na tela (e alguns, porque você precisa de três subpixels para adicionar cor!) Não é necessariamente muito mais fácil do que modular um sinal de onda controlo de um feixe de eM (que é de uma maneira comparável à radiodifusão de rádio)
oerkelens
O eixo Z para cima não é irônico - é matemática. O sistema de coordenadas precisa ser destro, portanto, se + X está à direita e + Y está na tela, isso gera + Z para cima. Assim como se retermos + X para a direita, + Y para baixo, + Z estiver na tela.
tpg2114
1
@ tgp2114 Por que o sistema de coordenadas precisa ser destro?
Taemyr
3

Adendo: Os primeiros gráficos foram feitos em monitores vetoriais , a apenas um passo dos osciloscópios vistos em laboratório, onde (0,0) estaria exatamente no meio da tela, sujeito a um botão giratório para definir a escala X / Y, X / Y offset, e possivelmente inversão X / Y.

O hardware dedicado do Atari "Asteroids" (1979), por exemplo, usava uma tela vetorial; seria interessante saber qual era o seu sistema de coordenadas do programa.

O sistema "Sketchpad" de Ivan Sutherland (1963) foi baseado em uma tela vetorial TX-2 e, em "Sketchpad: Um sistema de comunicação gráfica homem-máquina" (tese de doutorado, janeiro de 1963), ele escreve na página 70ff:

O sistema de coordenadas do sistema de exibição TX-2 tem origem no centro do escopo e requer dez bits de informações de deflexão localizadas à esquerda das subpalavras do computador de 18 bits para cada eixo.

...

Por conveniência em representar muitas variáveis ​​de componentes e por mais de 18 bits de precisão, o Sketchpad usa um sistema de coordenadas interno para desenhar uma representação separada da representação exigida pelo sistema de exibição. Esse sistema interno é chamado de sistema de coordenadas "página". Ao pensar nos desenhos no Sketchpad, as coordenadas da página são consideradas fixas. Uma transformação de página em escopo permite visualizar no escopo qualquer parte da página desejada, em qualquer grau de ampliação, como se fosse através de uma lupa (...) Um fator de escala para a tela controla o tamanho do quadrado que aparecerá no escopo. O número real salvo é o meio comprimento do lado do quadrado, chamado SCSZ para o SCope SiZe), como mostra a Figura 5.2. Também são salvas as coordenadas da página do centro do quadrado do escopo. Ao alterar esses números, a parte da página mostrada no escopo pode ser alterada em tamanho e movida, mas não girada.

O diagrama 5.2 na página 73 mostra que o "sistema de coordenadas da página" usa a convenção matemática do sistema de coordenadas cartesianas X / Y. (Alguém pode perguntar por que essa convenção é do jeito que é ...)

David Tonhofer
fonte
mas: telas vetor foram utilizados apenas porque a memória era muito raro para representar conexões de uma imagem e vetoriais listas exibíveis + duração da apresentação inteira + precisa de muito menos memória (como polígonos vs. voxels)
Micka
2

Nem tudo está no canto superior esquerdo.

O OpenGL, por exemplo, especifica que a origem está na parte inferior esquerda, e isso é difundido em toda a API: coordenadas de textura, viewports, retângulos texel, a projeção orto padrão: fica na parte inferior esquerda até o fim.

Há uma diferença de pensamento aqui.

Nas telas de computador, como nos livros, quando as pessoas leem (e estou assumindo um idioma como o inglês aqui), elas leem da esquerda para a direita e de cima para baixo. Você fez isso sozinho quando escreveu esta pergunta e o faz quando lê as respostas.

Em matemática e design, quando você plota um gráfico, você tem um eixo X e Y com X positivo indo para a esquerda e Y positivo subindo.

Se você estiver criando algo como uma GUI 2D em um jogo, pode ser mais fácil e mais intuitivo para muitas pessoas defini-lo da maneira "superior esquerda é a origem".

Se você estiver criando algo para imitar um design ou layout em papel milimétrico, pode ser mais fácil e mais intuitivo para muitas pessoas colocá-lo da maneira "inferior esquerda é a origem".

Na verdade, essas duas são convenções bastante informais e, se você estiver configurando uma projeção orto, poderá optar por ter sua origem em qualquer ponto arbitrário da tela (ou desligado), com o X positivo indo para a esquerda ou para a direita e positivo. Y subindo ou descendo. É apenas uma questão de ajustar sua matriz de projeção de acordo.

A única coisa importante é, portanto, escolher qual convenção você vai usar e usá-la de forma consistente.

Maximus Minimus
fonte
Ótima resposta. Estou criando um algoritmo com toneladas de trigonometria que levará a que as coisas sejam desenhadas na tela, e eu estava realmente incerto sobre se estava quebrando algum tabu ou convenção ao ter o eixo y positivo subindo.
Alexander Høst 26/09
-1

Porque as telas começam a renderizar a imagem no canto superior esquerdo. Seria mais fácil relacionar a renderização ou desenho do eixo coordenado quando (0,0,0) estiver no canto superior esquerdo com o eixo + Y entrando na tela.

mohanjot
fonte
-2

Um argumento FOR: (por exemplo)

var R uint32 = 0xFF0000FF; //:Red pixel
var W uint32 = 0xFFFFFFFF; //:White Pixel.
var Pixels []uint32 = { 
W,W,W,R,R,W,W,W,
W,W,R,R,R,R,W,W,
W,R,R,R,R,R,R,R,
W,W,W,R,R,W,W,W,   //:8x8 pixel image of " ↑ "
W,W,W,R,R,W,W,W,
W,W,W,R,R,W,W,W,
W,W,W,R,R,W,W,W,
W,W,W,R,R,W,W,W, }

O código corresponde aos resultados na tela :

insira a descrição da imagem aqui

A seta vermelha ficaria de cabeça para baixo se você NÃO usasse a origem no canto superior esquerdo.

Não sei dizer se é "por que". Só isso, é uma boa razão para a origem no canto superior esquerdo.

J MADISON
fonte
2
"A seta vermelha ficaria de cabeça para baixo se você NÃO usasse a origem superior esquerda" Sim, e daí? Os desenvolvedores de jogos escrevem gráficos através de matrizes 2D no código na maioria das vezes?
Vaillancourt
Não posso falar por todos os desenvolvedores de jogos. Eu faço: newgrounds.com/portal/view/706067 Adam Atomic também, lendo o código fonte do flixel. As bibliotecas OpenGL e SFML definitivamente o fazem. O OpenCL permite abstrair os pontos de dados em X / Y (get_global_id (dim)), mas a alocação de memória inicial é 1D.
J MADISON