Skip to content

AcresLidarCanopy.h#

Acres/Source/Acres/AcresLidarCanopy.h Generated

FAcresLidarCropModel#

struct FAcresLidarCropModel

Parameters of the crop and ground cover returns. The defaults are the values of the game.

Name Type Unit Default Description
DefaultHeightM static constexpr double m Calibrated full-height defaults: corn, soybean, potato. Render-mesh bounds are not canopy heights.
FillPerCell, CoverFillPerCell double Probability that one cell of CellM inside a canopy stops the beam, for corn, soybean and potato (AcresSensors.cpp FarCropFill: 0.1 m x G x leaf area density, G = 0.5), and for the grass ground cover.
PlantsFillScale double 1 A factor on the same probability of the plants of a place with no crop of the map (FAcresLidarCanopy::KindPlants). Each such patch has its own measured probability (FAcresLidarCanopy::Add).
CellM, StepM double Cell size of the plants and step of the walk along the beam, m.
HeightScale double Factor on the canopy height of each crop kind (1: the height of the growth state; 0.03: all cut, the stubble of the game; 0: no crop of that kind). For studies of a site whose crop state is not known.
CrushedShare, HarvestedShare double Height of a crushed and of a harvested sample as a share of the canopy height (the game: 12 % and 3 %).
CoverMaxPathM double m 3 The longest walk through the ground cover in front of a ground hit, m.
bTopStretch bool true True: a canopy that the beam enters through its top stretches the echo as level ground at that height does (AcresLidarPhysics::PulsePeakFactor with the vertical divergence). The footprint of a beam that goes down into a low crop, into stubble or into the grass cover at a low angle has a long range extent, as on the ground. False: no stretch for plants, the rule of the game (its far crops and its stubble then give returns where bare ground gives none).
bTopRelief bool true True: the top of a canopy has the relief of the ground below it. The stretch of bTopStretch then uses the tilt of the ground material at the place of the plant cell (FAcresLidarPattern::GroundMicroSlopeDeg), as a ground hit does. Cut fields lose ground returns at a low angle in the recorded scans as bare soil does (Calibration/Polaris/lidar_results.md, section 7). False: a level top (the versions before 10 October 2026).
bCoverCalibrated bool true True: a return from the grass cover has the backscatter of the grass ground below it, and only its range is that of the blade. The reflectivity of the grass material comes from recorded scans of real grass, with its blades. False: the two contributions of the game, (1 - transmission) x grass and the ground behind the blade at the square of the transmission (0.75 times the reflectivity of grass when the two are one echo).

FAcresLidarCropState#

struct FAcresLidarCropState

The crushed and the harvested sample masks of one environment (FAcresFarmState), by the index of a tile patch and by the ordinal of a regional patch. A null map is an empty map.

FAcresLidarCanopy#

class FAcresLidarCanopy

The crop patches as the LiDAR sees them: boxes on a lattice with a height, found through a grid.

Fill it with Add (in any order), then call Build. After Build the object is read-only: Trace may run on many threads at once.

Example

FAcresLidarCanopy Canopy;
Canopy.Add(10, 0, 0, 2.4, 0, 0, false);
Canopy.Build();
FAcresLidarOptions Options;
Options.Canopy = &Canopy;
Name Type Unit Default Description
HalfX, HalfY static constexpr double Half size of a patch along x (east) and y (north), m.
KindPlants static constexpr int 3 The kind of a patch of plants that are not a crop of the map (the kinds 0 to 2 are corn, soybean, potato). Such a patch has no crushed and no harvested samples, and HeightScale does not change its height. Its Id is the probability that one of its cells stops a beam, in units of PlantsFillUnit.

FAcresLidarCanopy::Add#

Adds one patch.

Argument Description
HeightM Canopy height at the growth of the field, m.
Kind Crop kind 0 corn, 1 soybean, 2 potato, or KindPlants.
Id Index of a tile patch or ordinal of a regional patch (the key of FAcresLidarCropState).
bRegion True for a regional patch.
void Add(double X, double Y, double Z, double HeightM, int Kind, uint32_t Id, bool bRegion);

FAcresLidarCanopy::Build#

Makes the grids. Call it one time after the last Add.

void Build();

FAcresLidarCanopy::Trace#

The first plant cell that stops a ray.

Argument Description
MaxT Farthest range, m (the solid hit of the beam).
State Crushed and harvested samples.
Model Fill and height factors.
T Receives the range of the cell, m.
Kind Receives the crop kind.
bTop Receives true when the ray came into the canopy of the cell through its top, and false when it came in through a side (the wall of a field, of a row of patches or of a cut strip).

Returns: True when a cell stops the ray before MaxT.

bool Trace(const FVec3& Origin, const FVec3& Direction, double MaxT, const FAcresLidarCropState& State, const FAcresLidarCropModel& Model, double& T, int& Kind, bool& bTop) const;

FAcresLidarCanopy::CellStops#

True when the plant cell at a point stops a beam with the probability Fill (a fixed value of the cell; the hash of the game, with its axes: X east, Y south).

static bool CellStops(const FVec3& Point, double CellM, double Fill);

FAcresLidarCanopy::PatchCount#

Patches added; patches whose lattice cell had the centre of a different patch before (they are found through a list).

size_t PatchCount() const ;

FAcresLidarCanopy::PlantPatchCount#

Patches of the kind KindPlants.

size_t PlantPatchCount() const ;