class_docstr: Class to manage uniform ray spatial sampling for all camera scene pixels.
  
  Args:
      min_depth: sampled rays minimal depth from cameras: float
      max_depth: sampled rays maximal depth from cameras: float
      ndc: convert to normalized device coordinates: bool
      device: device for ray tensors: Union[str, torch.device]
docstr: Uniformly sample pixel points in 2d for all scene camera pixels.
  
  Args:
      heights: tensor that holds scene camera image heights (can vary between cameras): math: `(B)`.
      widths: tensor that holds scene camera image widths (can vary between cameras): math: `(B)`.
      sampling_step: defines uniform strides between rows and columns: int.
  
  Returns:
      dictionary of Points2D objects that holds information on pixel 2d coordinates of each ray and the camera
        id it was casted by: Dict[int, Points2D]
docstr_tok: ["Uniformly","sample","pixel","points","in","2d","for","all","scene","camera","pixels",".","Args",":","heights",":","tensor","that","holds","scene","camera","image","heights","(","can","vary","between","cameras",")",":","math",":","`","(","B",")","`",".","widths",":","tensor","that","holds","scene","camera","image","widths","(","can","vary","between","cameras",")",":","math",":","`","(","B",")","`",".","sampling_step",":","defines","uniform","strides","between","rows","and","columns",":","int",".","Returns",":","dictionary","of","Points2D","objects","that","holds","information","on","pixel","2d","coordinates","of","each","ray","and","the","camera","id","it","was","casted","by",":","Dict","[","int",",","Points2D","]"]
code: def sample_points_2d(
      self, heights: Tensor, widths: Tensor, sampling_step: int = 1
  ) -> Dict[int, RaySampler.Points2D]:
      r"""Uniformly sample pixel points in 2d for all scene camera pixels.
  
      Args:
          heights: tensor that holds scene camera image heights (can vary between cameras): math: `(B)`.
          widths: tensor that holds scene camera image widths (can vary between cameras): math: `(B)`.
          sampling_step: defines uniform strides between rows and columns: int.
  
      Returns:
          dictionary of Points2D objects that holds information on pixel 2d coordinates of each ray and the camera
            id it was casted by: Dict[int, Points2D]
      """
      heights = heights.int()
      widths = widths.int()
      points2d_as_flat_tensors: Dict[
          int, RaySampler.Points2D_FlatTensors
      ] = {}
      for camera_id, (height, width) in enumerate(
          zip(heights.tolist(), widths.tolist())
      ):
          n = height * width
          y_grid, x_grid = torch_meshgrid(
              [
                  torch.arange(
                      0,
                      height,
                      sampling_step,
                      device=self._device,
                      dtype=self._dtype,
                  ),
                  torch.arange(
                      0,
                      width,
                      sampling_step,
                      device=self._device,
                      dtype=self._dtype,
                  ),
              ],
              indexing="ij",
          )
          RaySampler._add_points2d_as_flat_tensors_to_num_ray_dict(
              n, x_grid, y_grid, camera_id, points2d_as_flat_tensors
          )
      return RaySampler._build_num_ray_dict_of_points2d(
          points2d_as_flat_tensors
      )
  
imports: import math
  from typing import Dict, List, Tuple
  import torch
  from kornia.core import Device, Tensor, tensor
  from kornia.geometry.camera import PinholeCamera
  from kornia.nerf.camera_utils import cameras_for_ids
  from kornia.utils._compat import torch_meshgrid
  from kornia.utils.helpers import _torch_inverse_cast
label_desc: Use image node_id 2 for calling the UniformRaySampler obj's underlying member method code with example usage: obj.sample_points_2d(heights, widths, sampling_step) and returns: RaySampler