raycast.py

Created by pikube

Created on November 14, 2019

2.01 KB

ATTENTION: CE PROGRAMME EXIGE TOUTE LA MEMOIRE DE LA CALCULATRICE (donc supprimer tous les autres programmes python présents avant de l’injecter).

Expérience sur le raycasting: on projette des rayons de lumière dans un espace 2D, et on affiche les “murs” en fonction de la distance à laquelle les rayons touchent un mur (ou non). Pour se déplacer vers l’avant, tapez 5 puis EXE. Pour tourner à droite ou à gauche tapez 4 ou 6, puis EXE. Au début de la méthode paly sont contenues différentes variables: -x,y sont pour la position initiale de l’observateur -direction est l’orientation initiale de l’observateur (en radians –allant de -pi/2 à pi/2–) -step_l est la distance parcourue par un pas -fov est le champ de vision (allant de 0 à 2*pi) -n_rays est le nombre de rayons incidents -ray_steps est la vitesse de propagation d’un rayon -ray_len est le nombre d’unités de vitesse parcourues par un rayon


import kandinsky as k
from math import *
global rays
rays=[]

def fill(a,b,c,d,e):
  k.fill_rect(a,b,c,d,e)

def level():
  fill(0,111,320,111,(0,0,0))
  fill(2,113,316,107,(255,255,255))
  fill(40,113,5,40,(0,0,0))
  fill(80,222-50,40,50,(0,0,0))
  fill(150,141,50,10,(0,0,0))
  fill(200,113,3,50,(0,0,0))
  fill(280,150,360-280,50,(0,0,0))

class ray():
  def __init__(self,x,y,theta,ray_steps,ray_len):
    self.theta=theta
    self.x=x
    self.y=y
    self.ray_steps=ray_steps
    self.ray_len=ray_len
  def project(self):
    self.distance=0
    self.dx=(self.ray_steps)*cos(self.theta)
    self.dy=(self.ray_steps)*sin(self.theta)
    while k.get_pixel(int(self.x+self.dx),int(self.y+self.dy))!=(0,0,0) and self.y>111 and self.distance<self.ray_len:
      fill(int(self.x),int(self.y),1,1,(0,255,0))
      self.x+=self.dx
      self.y+=self.dy
      self.distance+=1

def size_estimator(d):
  return (abs(d-26)-d+31) 

def cast(x,y,direction,fov,n_rays,ray_steps,ray_len):
  for loop in range(n_rays):
    theta=(2*(loop/n_rays)-1)*fov+direction
    rays[loop]=(ray(x,y,theta,ray_steps,ray_len))
    rays[loop].project()

def render():
  fill(0,0,320,111,(255,255,255))
  for loop in range(len(rays)):
    fill(int(loop*320/40),int(55-size_estimator(rays[loop].distance)),int(320/40),int(2*size_estimator(rays[loop].distance)),(0,int(4*size_estimator(rays[loop].distance)),0))
  
  
def play():
  x=60
  y=151
  direction=0
  step_l=15
  fov=pi/4
  n_rays=50
  ray_steps=3
  ray_len=33
  for loop in range(n_rays):
    rays.append(0)
  level()
  cast(x,y,direction,fov,n_rays,ray_steps,ray_len)
  fill(int(x-2),int(y-2),5,5,(0,219,69))
  render()
  while 1:
    dx=step_l*cos(direction)
    dy=step_l*sin(direction)
    ko=input()
    level()
    if ko=="5":
      if k.get_pixel(int(x+dx),int(y+dy))==(248,252,248):
        x+=dx
        y+=dy
    if ko=="4":
      direction+=0.5
    if ko=="6":
      direction-=0.5
    cast(x,y,direction,fov,n_rays,ray_steps,ray_len)
    fill(int(x-2),int(y-2),5,5,(0,219,69))
    render()
play()

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.