Skip to content

Instantly share code, notes, and snippets.

@Zorgatone
Created December 27, 2020 20:02
Show Gist options
  • Save Zorgatone/7f00954030973d58334e2a1bfd1547c3 to your computer and use it in GitHub Desktop.
Save Zorgatone/7f00954030973d58334e2a1bfd1547c3 to your computer and use it in GitHub Desktop.
Planets in Elixir
defmodule Planet do
defstruct [:x, :y]
def gen_planet(x, y) do
xr = rem x, 7
yr = rem y, 11
if x > 4 and y > 8 and xr > 3 and xr < 6 and rem(yr, xr) === 1 do
%Planet{x: x, y: y}
else
nil
end
end
end
defmodule Octree do
defmodule Cube do
defstruct [:size, :cx, :cy, :children]
end
defmodule Children do
defstruct [:tr, :tl, :br, :bl]
end
def empty?(%Octree.Cube{children: children}) do
empty? children
end
def empty?(%Octree.Children{tr: tr, tl: tl, br: br, bl: bl}) do
tr === nil and tl === nil and br === nil and bl === nil
end
end
defmodule Generate do
def gen(cube = %Octree.Cube{size: size, cx: cx, cy: cy}) when size === 1 do
children = %Octree.Children{
tr: Planet.gen_planet(cx, cy),
tl: Planet.gen_planet(cx - 1, cy),
br: Planet.gen_planet(cx, cy - 1),
bl: Planet.gen_planet(cx - 1, cy - 1)
}
if Octree.empty? children do
nil
else
Map.put(
cube,
:children,
children
)
end
end
def gen(%Octree.Cube{size: size, cx: cx, cy: cy}) when size > 1 do
half_size = div size, 2
cube = %Octree.Cube{
size: size,
cx: cx,
cy: cy,
children: %Octree.Children{
tr: Generate.gen(%Octree.Cube{size: half_size, cx: cx + half_size, cy: cy + half_size}),
tl: Generate.gen(%Octree.Cube{size: half_size, cx: cx - half_size, cy: cy + half_size}),
br: Generate.gen(%Octree.Cube{size: half_size, cx: cx + half_size, cy: cy - half_size}),
bl: Generate.gen(%Octree.Cube{size: half_size, cx: cx - half_size, cy: cy - half_size})
}
}
if Octree.empty? cube do
nil
else
cube
end
end
def gen(_) do
raise ArgumentError, "Invalid cube!"
end
end
defmodule Main do
def main do
planets = Generate.gen(%Octree.Cube{size: 32, cx: 0, cy: 0})
IO.inspect planets
end
end
Main.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment