 # coding: cp852
from turtle import *
from math   import *
from time   import *

ORIGIN_3D=(0,0,0)
ORIGIN_2D=(-3,-3)
UNIT     =50
ALPHA    =7/6*pi
lineCOLOR='black'

#---============================[ P3D_to_2D ]==========================================[]
def P3D_to_2D(P):
  '''Przelicza punkt P:3D=(x,y,z) na wsp¢ˆrz©dne ekrany (x,y).
     Korzysta z:
       - ORIGIN_3D - punkt zero 3D,
       - ORIGIN_2D - punkt zero 2D - ekranu,
       - UNIT      - dˆugo˜ci jednostkina osi,
       - ALPHA     - k¥t o˜ OX do OZ na ekranie.'''
  P=[P[i]-ORIGIN_3D[i] for i in range(3)]				# Rozkˆada punkt P-3D na przeliczone wsp¢ˆrz©dne.
  (x,y,z)=P                                                             # Dost©p do wsp¢lrz©dnych punktu.
  (X0,Y0)=ORIGIN_2D					                # Dost©p do wsp¢lrz©dnych 'zerowych' ekranu.
  return [UNIT*a for a in (X0+x+z*cos(ALPHA),Y0+y+z*sin(ALPHA))]	# Zwraca przeliczony punkt.

#---============================[ drawLine ]==========================================[]
def drawLine(P1,P2):
  '''Rysuje linie mi©dzy punktami P1 i P2.'''
  pu()									# Podnosi "pi¢rko" - nie b©dzie rysowaˆ.
  setpos(*P3D_to_2D(P1))						# Ustawia z¢ˆwia w punkcie P1 na elranie
  pd()									# Opuszcza "pi¢rko" - b©dzie rysowaˆ.
  setpos(*P3D_to_2D(P2))						# Przechodzi z¢ˆwiem do punktu P2 na elranie

#---============================[ drawNlines ]==========================================[]
def drawNlines(NL):
  '''NL - lista list N-krzywych.
     Posta† listy N-krzywej: [ kolor wypeˆnienia lub None, lista pumnkt¢w 3D].
     Korzysta z koloru linii - lineCOLOR.'''
  for L in NL:								# Dla ka¾dej listy definicji.
    C,*l=L								# Rozkˆada list© na kolor i list© punkt¢w 3D.
    if C!=None:         						# Brak definicji koloru wypeˆnienia.
      color(lineCOLOR,C)						# Ustala kolor linii i kolor tˆa.
    else:								# Nie ma definicji koloru tˆa.
      color(lineCOLOR,'')                                               # Ustala kolor linii.
    if C:         							# Ma by† tˆo.
      begin_fill()							# Pocz¥tek rejestracji lˆamanej dla wypeˆnienia tˆem.
    for i in range(LEN:=len(l)):					# Dla kolejnych punkt¢w.
      P1=l[i]								# Ustala punkt pocz¥tkowy.
      P2=l[(i+1)%LEN]                                                   # I koncowy - nast©pny (cyklicznie).
      print(f'     {P1} = {P2}')
      drawLine(P1,P2)							# Rysuje lini©.
      update()
    if C:         							# Ma by† tˆo.
      end_fill()							# Wypeˆnienie krzywej tˆem.
    update()
    sleep(1)


ht()									# Hide TURTLE.
# --- Powi©kszenie na caˆy ekran. ----
screen = Screen()				# Praca na ekranie.

# --- FULL SCREEN ---
root = screen._root				# Dost©p do ekranu.
root.attributes("-fullscreen", True)		# Powi©kszenie okna na caˆy ekran.

# --- Bˆyskawiczne rysowanie --- ## Wyˆacza animacje (zmniejsza ilo˜c klatek).
tracer(20, 5)
ht()						# HIDE Turtle
speed(0)

def BB(v,V,L):
  '''We wszystkich punktacjh listy L zamienia zmienn¥ v na warto˜† V.'''
  return [tuple([ V if a==v else a for a in A]) for A in L]

BBx=[('x',0,0),('x',6,0),('x',6,0.5),('x',3,0.5),('x',3,2),('x',0,2),('x',0,1.5),('x',2.5,1.5),('x',2.5,0.5),('x',0,0.5)]
BBz=[(0,0,'z'),(0,3,'z'),(8,3,'z'),(8,0,'z'),(7.5,0,'z'),(7.5,2.5,'z'),(0.5,2.5,'z'),(0.5,0,'z')]

BANK=[
  ['yellow',(0,0,0),(0.5,0,0),(0.5,2.5,0),(7.5,2.5,0),(7.5,0,0),(8,0,0),(8,6,0),(0,6,0)],
  ['orange',*BB('x',0,BBx)],
  ['orange',*BB('x',0.5,BBx)],
  ['orange',*BB('x',8-0.5,BBx)],
  ['red',   *BB('z',0.5,BBz)],
  ['red',   *BB('z',2,BBz)],
  ['orange',*BB('x',8,BBx)],
  ['maroon',(0,3,2),(0,3,0.5),(8,3,0.5),(8,3,2)],
  ['maroon',(0,6,0.5),(0,6,0),(8,6,0),(8,6,0.5)],
  ['red',   (0,3,0.5),(0,6,0.5),(8,6,0.5),(8,3,0.5),(7.5,3,0.5),(7.5,4.5,0.5),(0.5,4.5,0.5),(0.5,3,0.5)],
     ]

drawNlines(BANK)
sleep(1)
input('ENTER')

