recre3d.py

Created by schraf

Created on June 23, 2023

653 Bytes

Il s’agit ici d’adapter pour la NUMWORKS le programme écrit initialement en BASIC dans la revue MICR’ORIC de 1983 pour l’ordinateur Oric.

Observez le temps d’exécution sur votre calculatrice par rapport à celui annoncé dans la revue…

Exemple de graphique (avec une version légèrement améliorée) pour
f(z) = 70*cos(z*z/100)*exp(-z*z/1000) :

f(z) = 20*sqrt(exp(-sin(z/3))) :

f(z) = 110*cos(z/30)*sqrt(exp(-sin(z/3))) :

Le chapeau :


Ce que vous pouvez modifier dans le script :
- la valeur de m initialement mise à 30 comme dans la revue peut être augmentée.
- au lieu de r=y1 vous pouvez aussi mettre r=60 (et -60 plus loin) pour que la base du graphique ne soit plus un disque mais un carré (mais le visuel est alors moins fun !)
- Le .7 de la ligne 31 permet d’avoir une vue plus ou moins plongeante (testez avec 0.1 et 1 par exemple)
- L’astuce pour ne pas voir les parties cachées de la surface est, pour un x donné, de n’afficher le pixel que si la valeur du y est supérieur au max des valeurs précédentes (par exemple si les valeurs de y sont 3, 5, 9, 6, 15, 11, 13, 18 et 2, les valeurs réellement affichées seront 3,5,9,15 (car le 6 est <9), 18 (car 11 et 13<15) et 18.


from math import *
from kandinsky import *

# Testez avec go(f1), go(f2) etc.
def f1(z): return 110*exp(-z*z/300)
def f2(z): return 90*cos(z*z/70)*exp(-z*z/400)
def f3(z): return 90-z*z/10
def f4(z): return 90*cos(z*z/35)*exp(-z*z/600)
def f5(z): return 80*cos(z/20)*sqrt(exp(-sin(z/3)))

# go(f6,1.9)
def f6(z): return 40*sqrt(exp(-sin(z/1.5)))
  
def go(f,v=.7):
  fill_rect(0,0,320,222,(0,0,0))
  x,m = 10,30  
  q=-m
  while q<m:
    y1=sqrt(m*m-q*q)
    q+=m/150
    l=-m    
    r=y1
    while r>=-y1:
      r-=0.5
      s=f(sqrt(q*q+r*r))-v*r
      if s>l:
        l = s
        set_pixel(int(x),150-int(l),(255,255,255))
    x+=1