sample_in_pupil.py 1.2 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import torch
import numpy as np


def RandomGen(pupil_size: float, n_samples: int) -> torch.Tensor:
    """
    Random sample n_samples positions in pupil region
    
    :param pupil_size: multi-layers' parameters configuration
    :param n_samples:  number of samples to generate

    :return: n_samples x 3, with 3D sample position in each row
    """
    samples = torch.empty(n_samples, 3)
    i = 0
    while i < n_samples:
        s = (torch.rand(2) - 0.5) * pupil_size
        if np.linalg.norm(s) > pupil_size / 2.:
            continue
        samples[i, :] = [s[0], s[1], 0]
        i += 1
    return samples


def CircleGen(pupil_size: float, circles: int) -> torch.Tensor:
    """
    Sample positions on circles in pupil region

    :param pupil_size: diameter of pupil
    :param circles:    number of circles to sample
    
    :return: M x 3, with 3D sample position in each row
    """
    samples = torch.zeros(1, 3)
    for i in range(1, circles):
        r = pupil_size / 2. / (circles - 1) * i
        n = 4 * i
        for j in range(0, n):
            angle = 2 * np.pi / n * j
            samples = torch.cat([samples, torch.tensor([[r * np.cos(angle), r * np.sin(angle), 0]])], 0)
    return samples