"""Tutorial 21 - Principal-plane BRF of a periodic maize field."""
import numpy as np
import less

scene = less.Scene()
scene.size = 10.0
scene.repetitive = True
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.15))
scene.illumination = less.Illumination(source=less.Sun(zenith=30, azimuth=180), atmosphere=less.NoAtmosphere())
maize = less.Object("maize", mesh=less.asset_path("maize.obj"))
maize.set_property(less.Prospect(cab=45, car=10, cw=0.012, cm=0.006, N=1.55))
positions = less.place.grid(scene, spacing=0.75, jitter=0.04, seed=42)
rng = np.random.default_rng(42)
scene.add(maize, positions=positions, scales=rng.uniform(0.9, 1.1, len(positions)),
          rotations=rng.uniform(0, 360, len(positions)))

zeniths = range(0, 65, 5)
directions = [(z, 180) for z in zeniths] + [(z, 0) for z in zeniths if z > 0]
result = scene.simulate(less.BRFSensor(bands=[650, 850], directions=directions, num_photons=500_000))
for (zenith, azimuth), (red, nir) in zip(result.directions, result.brf):
    print(f"{zenith if azimuth == 180 else -zenith:6.0f} {red:8.4f} {nir:8.4f}")
result.save("21_maize_brf.csv")
