sexta-feira, 29 de abril de 2022

Tutorial do Concurso #10: Gráficos 3D

Apresentamos hoje mais um pequeno programa escrito em BASIC Apascalado para familiarizar os concorrentes com esta técnica insólita de programar no ZX Spectrum. Os programas vão ser todos escritos em inglês para benefício dos concorrentes estrangeiros.

Hoje temos algo completamente diferente, como diziam os saudosos Monty Python: um programa para desenhar gráficos 3D. Este programa é inspirado nos primeiros anúncios do ZX Spectrum que mostravam um gráfico 3D.

Se examinarmos atentamente o gráfico, chegamos à conclusão que é o desenho duma função matemática da forma: z = F(x,y)


Se fosse para desenhar um função y = f(x) seria mais simples: Nesse caso iríamos querer visualizar valores da função ao longo dum segmento de recta (eixo XX). O desenho variava em YY (vertical do ecrã) ao longo do eixo dos XX (horizontal do ecrã).

Mas, a função Y = F(x,y) varia num plano XY, ou seja, vamos querer visualizar pontos da função em vários pontos dum rectângulo. Para vermos melhor, é melhor visualizarmos o gráfico numa perspectiva (o mais simples é uma perspectiva ortogonal). Isso significa fazer uma transformação do rectângulo do ecran num losango (rectângulo inclinado). 

Depois é só calcularmos o valor da função em vários pontos do losango e mostrarmos esses valores na vertical como se fossem pilares.


A função pode ser visualizada de qualquer ângulo mas para simplificar vamos visualizar sempre no mesmo ângulo com a seguinte formula:

LET ecranX = 10*x - 2.5*y
LET ecranY = 2.5*x + 2.5*y + z
PLOT ecranX,ecranY


Agora só falta esconder as linhas ocultas.

Este problema parece ser o mais complicado de todos mas na verdade basta fazer um truque de ilusionismo.

Começamos por desenhar os pontos mais perto de nós e depois só falta declarar um array H(255) para armazenar o valor máximo até agora desenhado em cada coordenada X do ecrã. Assim, podemos evitar desenhar valores inferiores que estão por trás do que já foi desenhado.

REM actualizar o valor máximo
IF ecranY > H(ecranX) THEN LET H(ecranX) = ecranY
REM evitar valores inferiores aos ja' desenhados
IF  ecranY < H(ecranX) THEN LET ecranY = H(ecranX)
REM desenhar no ecran
PLOT ecranX,ecranY

E, finalmente, eis o resultado final:


O problema de programas deste tipo é que exigem grande quantidade de cálculos e, por isso, o programa demora muito tempo a obter o resultado final. Isto é bem evidente quando executado no ZX Spectrum. Para quem tem pouca paciência, o melhor é usar um emulador que permita acelerar a velocidade de processamento (ver opção ZX Script no fim deste artigo).

Sugestão de melhoramento: terminar o processamento quando for premida a tecla "f" para podermos experimentar logo outra função em vez de esperar que o programa acabe de completar o desenho.

Outra sugestão de melhoramento: além de linhas horizontais acrescentar também linhas verticais para o desenho ficar quadriculado.

Convidamos os leitores a examinar as listagens e a fazer alterações no programa. Todos os programas BASIC Apascalado que apresentamos nesta série podem ser melhorados e todos os leitores estão convidados a melhorá-los.

Para ler as 2 listagens é mais fácil aqui.

Para fazer download dos 3 ficheiros, clicar aqui.

Para correr o programa online, clicar aqui.

Para correr o programa a alta velocidade, clicar aqui para correr a versão ZX Script:

Quem estiver interessado em participar no concurso, pode ler o regulamento aqui.

Sem comentários:

Enviar um comentário