Advertisement
TeoremaPi

Crear cristal con hexagonal compacta

Mar 23rd, 2020
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.61 KB | None | 0 0
  1. -- distacina entre una capa y otra
  2. distCapas = 2
  3. -- distancia entre una linea y otra dentro de la misma capa
  4. distLineas = 3
  5. -- distancia entre un atomo y otro dentro de la misma linea
  6. distAtomos = 4
  7.  
  8. -- desfase de espacios entre el primer atomo de una fila y el de la siguiente en la misma capa
  9. -- 0 = si no hay desfase
  10. desfaseAtomos = 2
  11. -- desfase en X entre entre un atomo y otro de la fila equivalente en la capa inferior
  12. desfaseHX = 2
  13. -- desfase en Y entre entre una fila y otra equivalente en la capa inferior
  14. desfaseHY = 4
  15.  
  16. xMax = 20
  17. yMax = 20
  18. hMax = 20
  19.  
  20. -- x+ = hacia delante
  21. x = 1
  22. -- y+ = hacia la derecha
  23. y = 1
  24. -- h+ = hacia arriba
  25. h = 1
  26.  
  27. -- coordenada Y de la primera linea de la capa
  28. yInit = 1
  29.  
  30. turtle.select(1)
  31.  
  32. -- Funcion que coloca un atomo bajo la tortuga si es necesario
  33. function colocarAtomo(xf,yf,hf)
  34.  
  35.  fila = (yf - yInit)/distLineas
  36.  capa = (hf - 1)/distCapas
  37.  
  38.  desfase = desfaseAtomos*fila + desfaseHX*capa
  39.  
  40.  condicion = xf <= xMax and xf >= 1 and (xf - desfase)%distAtomos == 1
  41.  
  42.  print(condicion)
  43.  
  44.  if condicion then
  45.   while (turtle.getItemCount() == 0) and (turtle.getSelectedSlot() < 16) do
  46.    turtle.select(turtle.getSelectedSlot() + 1)
  47.   end
  48.  
  49.   if (turtle.getItemCount() == 0) and (turtle.getSelectedSlot() == 16) then
  50.    return false
  51.   end
  52.  
  53.   turtle.placeDown()
  54.   return true
  55.  
  56.  end
  57. end
  58.  
  59.  
  60. -- Funcion que calcula si la cooredada Y corresponde a una linea de atomos en esa capa
  61. function esLinea(xf,yf,hf)
  62.  fila = (yf - 1)/distLineas
  63.  capa = (hf - 1)/distCapas
  64.  
  65.  -- IF para la hexagonal compacta
  66. if capa%2 == 1 then
  67.  desfaseHY = 1
  68. else
  69.  desfaseHY = 0
  70. end
  71.  
  72.  desfase = desfaseHY*capa
  73.  
  74.  return (yf - desfase)%distLineas == 1
  75. end
  76.  
  77.  
  78. -- Bucle principal
  79. while h <= hMax do
  80.  
  81.  -- Comprobar si a esta coordena Y le corresponde una linea de atomos
  82.  if not esLinea(x,y,h) then
  83.  
  84.   turtle.turnRight()
  85.  
  86.   while (not esLinea(x,y,h)) and y <= yMax do
  87.    turtle.forward()
  88.    y = y + 1
  89.   end
  90.  
  91.   yInit = y
  92.  
  93.   turtle.turnLeft()
  94.  else
  95.   yInit = 1
  96.  end
  97.  
  98.  -- Bucle de la capa
  99.  while y <= yMax do
  100.  
  101.   if x == xMax then
  102.    xDif = -1
  103.   else
  104.    xDif = 1
  105.   end
  106.  
  107.   -- Bucle de la fila
  108.   while x>0 and x<=xMax do
  109.    
  110.    print('normal',x,y)
  111.    
  112.    if colocarAtomo(x,y,h) == false then
  113.     return
  114.    end
  115.    
  116.    turtle.forward()
  117.    x = x + xDif
  118.    
  119.   end
  120.  
  121.   -- Dar la vuelta
  122.   if x > xMax then
  123.    -- al final del cristal girar a la derecha
  124.    turtle.turnRight()
  125.  
  126.    turtle.forward()
  127.    y = y+1
  128.  
  129.    while (not esLinea(x,y,h)) and y <= yMax do
  130.     turtle.forward()
  131.     y = y+1
  132.     print('der',x,y)
  133.    end
  134.    
  135.    turtle.turnRight()
  136.  
  137.   else
  138.    -- al principio del cristal girar a la izquierda
  139.    turtle.turnLeft()
  140.    
  141.    turtle.forward()
  142.    y = y+1
  143.  
  144.    while (not esLinea(x,y,h)) and y <= yMax do  
  145.     turtle.forward()
  146.     y = y+1
  147.     print('izq',x,y)
  148.    end
  149.    
  150.    turtle.turnLeft()
  151.  
  152.   end
  153.  
  154.   -- nada mas girar, comprobar si hay que colocar un atomo
  155.   if y <= yMax then
  156.    if colocarAtomo(x,y,h) == false then
  157.     return
  158.    end
  159.    
  160.    turtle.forward()
  161.    x = x - xDif
  162.   end
  163.  
  164.  end
  165.  
  166.  -- Vuelta a casa (1,1,h)
  167.  -- moverse a x=1
  168.  if x > xMax then
  169.   while x>1 do
  170.    turtle.forward()
  171.    x = x - 1
  172.   end
  173.  
  174.   turtle.turnRight()
  175.  
  176.  else
  177.   while x<1 do
  178.    turtle.forward()
  179.    x = x + 1
  180.   end
  181.  
  182.   turtle.turnLeft()
  183.  
  184.  end
  185.  
  186.  -- moverse a y=1
  187.  while y>1 do
  188.   turtle.forward()
  189.   y = y - 1
  190.  end
  191.  
  192.  -- Girar y subir hasta la siguiente altura
  193.  turtle.turnRight()
  194.  turtle.up()
  195.  h = h+1
  196.  
  197.  while (not (h%distCapas == 1)) and (h<=hMax) do
  198.   turtle.up()
  199.   h = h+1
  200.  end
  201.  
  202. end
  203.  
  204. print('Stop',x,y,h)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement