VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
random.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3#pragma once
4
5#include <cmath>
6#include <cstdint>
7#include <numbers>
8#include <random>
9
10#include <core/math/vector2.h>
11#include <core/math/vector3.h>
12
13namespace visutwin::canvas
14{
15 class Random
16 {
17 public:
18 static void circlePoint(Vector2& point)
19 {
20 static thread_local std::mt19937 generator(std::random_device{}());
21 static thread_local std::uniform_real_distribution<float> unit(0.0f, 1.0f);
22
23 const float r = std::sqrt(unit(generator));
24 const float theta = unit(generator) * 2.0f * std::numbers::pi_v<float>;
25 point = Vector2(r * std::cos(theta), r * std::sin(theta));
26 }
27
28 static void circlePointDeterministic(Vector2& point, const int index, const int numPoints)
29 {
30 constexpr float goldenAngle = 2.39996322972865332f;
31 const float theta = static_cast<float>(index) * goldenAngle;
32 const float r = std::sqrt(static_cast<float>(index) / static_cast<float>(numPoints));
33 point = Vector2(r * std::cos(theta), r * std::sin(theta));
34 }
35
36 static void spherePointDeterministic(Vector3& point, const int index, const int numPoints,
37 float start = 0.0f, float end = 1.0f)
38 {
39 constexpr float goldenAngle = 2.39996322972865332f;
40 start = 1.0f - 2.0f * start;
41 end = 1.0f - 2.0f * end;
42
43 const float y = start + (end - start) * (static_cast<float>(index) / static_cast<float>(numPoints));
44 const float radius = std::sqrt(std::max(0.0f, 1.0f - y * y));
45 const float theta = goldenAngle * static_cast<float>(index);
46
47 point = Vector3(std::cos(theta) * radius, y, std::sin(theta) * radius);
48 }
49
50 static float radicalInverse(uint32_t i)
51 {
52 uint32_t bits = (i << 16u) | (i >> 16u);
53 bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
54 bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
55 bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
56 bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
57 return static_cast<float>(static_cast<double>(bits) * 2.3283064365386963e-10);
58 }
59 };
60}
static void circlePointDeterministic(Vector2 &point, const int index, const int numPoints)
Definition random.h:28
static void circlePoint(Vector2 &point)
Definition random.h:18
static float radicalInverse(uint32_t i)
Definition random.h:50
static void spherePointDeterministic(Vector3 &point, const int index, const int numPoints, float start=0.0f, float end=1.0f)
Definition random.h:36
2D vector for UV coordinates, screen positions, and 2D math.
Definition vector2.h:18
3D vector for positions, directions, and normals with multi-backend SIMD acceleration.
Definition vector3.h:29