Select Git revision
TurnComponent.cpp
DensityField.h 3.58 KiB
#pragma once
#include "CoreMinimal.h"
#include "DensityField.generated.h"
class APointCloud;
USTRUCT(BlueprintType)
struct FVoxel
{
GENERATED_BODY()
private:
FVector WorldPosition;
FIntVector3 GridPosition;
double VoxelDensity;
FVector VoxelGradient;
double ClosePointsNumber;
public:
FVoxel() : WorldPosition(FVector::ZeroVector), GridPosition(FIntVector3::ZeroValue), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), ClosePointsNumber(0.0) {}
FVoxel(const FVector &InPosition, const FIntVector3 &InGridPos) : WorldPosition(InPosition), GridPosition(InGridPos), VoxelDensity(0.0), VoxelGradient(FVector::ZeroVector), ClosePointsNumber(0.0) {}
double GetVoxelDensity() const { return VoxelDensity; }
FIntVector3 GetVoxelGridPos() const { return GridPosition; }
FVector GetVoxelPosition() const { return WorldPosition; }
FVector GetVoxelGradient() const { return VoxelGradient; }
double GetClosePointsNumber() const { return ClosePointsNumber; }
void SetVoxelDensity(const double Density) { this->VoxelDensity = Density; }
void SetVoxelGradient(const FVector &Gradient) { this->VoxelGradient = Gradient; }
void SetClosePointsNumber(const double Dis) { ClosePointsNumber = Dis; }
void AddToVoxelDensity(const double Dis) { VoxelDensity += Dis; }
};
USTRUCT(BlueprintType)
struct FLUTUnit
{
GENERATED_BODY()
TArray<int32> LUTUnit;
void AddToLUT(const int32 TargetInt)
{
LUTUnit.Add(TargetInt);
}
TArray<int32> GetLTUnit() const
{
return LUTUnit;
}
};
class FDensityField
{
// VARIABLES
TArray<FVoxel> VoxelList;
int32 XNum, YNum, ZNum;
float XStep, YStep, ZStep;
FVector GridOrigin;
public:
mutable FCriticalSection DataGuard;
// CONSTRUCTOR
FDensityField();
// INITIALIZATION FUNCTIONS
void InitializeDensityField(const FVector& MinBounds, const FVector& MaxBounds, const int32 XAxisNum, const int32 YAxisNum, const int32 ZAxisNum);
void CalculateVoxelDensities(const APointCloud* PointCloud, float InfluenceRadius, float Sigma);
void CalculateVoxelDensitiesByNumber(const APointCloud* PointCloud, float InfluenceRadius);
void CalculateAndStoreGradients();
// DEBUG FUNCTIONS
void DrawDebugVoxelDensity(const UWorld* World, const AActor* Actor, float Duration, float Scale, float DensityThreshold) const;
// CONVERSION FUNCTIONS
int32 WorldPositionToIndex(const FVector& Position) const;
FIntVector3 WorldToGridPosition(const FVector& Position) const;
bool IsValidGridPosition(int32 XBin, int32 YBin, int32 ZBin) const;
int32 GridPositionToIndex(int32 X, int32 Y, int32 Z) const;
TArray<FVector> IndexToVoxelCornersWorld(const int32 Index) const;
// GETTER AND SETTER FUNCTIONS
FVector GetGridOrigin() const;
FVector IndexToVoxelGradient(int32 Index) const;
FVector IndexToVoxelPosition(int32 Index) const;
FIntVector3 IndexToGridPosition(int32 Index) const;
int32 GetVoxelNumber() const;
double IndexToVoxelDensity(int32 Index) const;
void IndexToVoxelBounds(int32 Index, FVector& OutMinBounds, FVector& OutMaxBounds) const;
double GridPositionToVoxelDensity(int32 XBin, int32 YBin, int32 ZBin) const;
FVector GridPositionToVoxelGradient(int32 XBin, int32 YBin, int32 ZBin) const;
FVector GetStep() const;
int32 GetXNum() const;
int32 GetYNum() const;
int32 GetZNum() const;
bool IsValidWorldPosition(const FVector& Position) const;
TArray<int32> IndexToVoxelNeighbors(const int32 Index) const;
bool IsValidIndex(int32 Index) const;
bool IsValid();
void SetVoxelDensityByIndex(int32 Index, double Density);
void SetVoxelGradientByIndex(int32 Index, const FVector& Gradient);
};