ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
LineSet.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <Logging.h>
11 
12 #include <string>
13 
21 
22 namespace cloudViewer {
23 namespace t {
24 namespace geometry {
25 
26 class TriangleMesh;
27 
84 
85 class LineSet : public Geometry, public DrawableGeometry {
86 public:
88  LineSet(const core::Device &device = core::Device("CPU:0"));
89 
105  LineSet(const core::Tensor &point_positions,
106  const core::Tensor &line_indices);
107 
108  virtual ~LineSet() override {}
109 
115  LineSet To(const core::Device &device, bool copy = false) const;
116 
118  LineSet Clone() const { return To(GetDevice(), /*copy=*/true); }
119 
121  std::string ToString() const;
122 
124  const TensorMap &GetPointAttr() const { return point_attr_; }
125 
128 
133  core::Tensor &GetPointAttr(const std::string &key) {
134  return point_attr_.at(key);
135  }
136 
139  core::Tensor &GetPointPositions() { return GetPointAttr("positions"); }
140 
142  const TensorMap &GetLineAttr() const { return line_attr_; }
143 
146 
151  core::Tensor &GetLineAttr(const std::string &key) {
152  return line_attr_.at(key);
153  }
154 
157  core::Tensor &GetLineIndices() { return GetLineAttr("indices"); }
158 
161  core::Tensor &GetLineColors() { return GetLineAttr("colors"); }
162 
166  const core::Tensor &GetPointAttr(const std::string &key) const {
167  return point_attr_.at(key);
168  }
169 
174  void RemovePointAttr(const std::string &key) { point_attr_.Erase(key); }
175 
179  return GetPointAttr("positions");
180  }
181 
186  const core::Tensor &GetLineAttr(const std::string &key) const {
187  return line_attr_.at(key);
188  }
189 
194  void RemoveLineAttr(const std::string &key) { line_attr_.Erase(key); }
195 
198  const core::Tensor &GetLineIndices() const {
199  return GetLineAttr("indices");
200  }
201 
204  const core::Tensor &GetLineColors() const { return GetLineAttr("colors"); }
205 
211  void SetPointAttr(const std::string &key, const core::Tensor &value) {
213  point_attr_[key] = value;
214  }
215 
218  void SetPointPositions(const core::Tensor &value) {
220  SetPointAttr("positions", value);
221  }
222 
228  void SetLineAttr(const std::string &key, const core::Tensor &value) {
230  line_attr_[key] = value;
231  }
232 
234  void SetLineIndices(const core::Tensor &value) {
236  SetLineAttr("indices", value);
237  }
238 
241  void SetLineColors(const core::Tensor &value) {
243  SetLineAttr("colors", value);
244  }
245 
250  bool HasPointAttr(const std::string &key) const {
251  return point_attr_.Contains(key) && GetPointAttr(key).GetLength() > 0 &&
252  GetPointAttr(key).GetLength() == GetPointPositions().GetLength();
253  }
254 
257  bool HasPointPositions() const { return HasPointAttr("positions"); }
258 
263  bool HasLineAttr(const std::string &key) const {
264  return line_attr_.Contains(key) && GetLineAttr(key).GetLength() > 0 &&
265  GetLineAttr(key).GetLength() == GetLineIndices().GetLength();
266  }
267 
270  bool HasLineIndices() const { return HasLineAttr("indices"); }
271 
277  bool HasLineColors() const { return HasLineAttr("colors"); }
278 
280  LineSet &Clear() override {
281  point_attr_.clear();
282  line_attr_.clear();
283  return *this;
284  }
285 
287  bool IsEmpty() const override { return !HasPointPositions(); }
288 
290  core::Tensor GetMinBound() const { return GetPointPositions().Min({0}); }
291 
293  core::Tensor GetMaxBound() const { return GetPointPositions().Max({0}); }
294 
296  core::Tensor GetCenter() const { return GetPointPositions().Mean({0}); }
297 
318  LineSet &Transform(const core::Tensor &transformation);
319 
325  LineSet &Translate(const core::Tensor &translation, bool relative = true);
326 
331  LineSet &Scale(double scale, const core::Tensor &center);
332 
339  LineSet &Rotate(const core::Tensor &R, const core::Tensor &center);
340 
346 
348  core::Device GetDevice() const override { return device_; }
349 
358  const cloudViewer::geometry::LineSet &lineset_legacy,
359  core::Dtype float_dtype = core::Float32,
360  core::Dtype int_dtype = core::Int64,
361  const core::Device &device = core::Device("CPU:0"));
362 
365 
368 
371 
380  TriangleMesh ExtrudeRotation(double angle,
381  const core::Tensor &axis,
382  int resolution = 16,
383  double translation = 0.0,
384  bool capping = true) const;
385 
392  double scale = 1.0,
393  bool capping = true) const;
394 
404  static LineSet CreateCameraVisualization(int view_width_px,
405  int view_height_px,
406  const core::Tensor &intrinsic,
407  const core::Tensor &extrinsic,
408  double scale,
409  const core::Tensor &color = {});
410 
411 protected:
415 };
416 
417 } // namespace geometry
418 } // namespace t
419 } // namespace cloudViewer
math::float4 color
#define AssertTensorDevice(tensor,...)
Definition: TensorCheck.h:45
#define AssertTensorShape(tensor,...)
Definition: TensorCheck.h:61
bool copy
Definition: VtkUtils.cpp:74
int64_t GetLength() const
Definition: Tensor.h:1125
Tensor Max(const SizeVector &dims, bool keepdim=false) const
Definition: Tensor.cpp:1275
Tensor Min(const SizeVector &dims, bool keepdim=false) const
Definition: Tensor.cpp:1268
Tensor Mean(const SizeVector &dims, bool keepdim=false) const
Definition: Tensor.cpp:1247
LineSet define a sets of lines in 3D. A typical application is to display the point cloud corresponde...
Definition: LineSet.h:29
A bounding box that is aligned along the coordinate axes and defined by the min_bound and max_bound.
Mix-in class for geometry types that can be visualized.
The base geometry class.
Definition: Geometry.h:23
A LineSet contains points and lines joining them and optionally attributes on the points and lines.
Definition: LineSet.h:85
TensorMap & GetLineAttr()
Getter for line_attr_ TensorMap.
Definition: LineSet.h:145
core::Device GetDevice() const override
Returns the device attribute of this LineSet.
Definition: LineSet.h:348
const core::Tensor & GetLineAttr(const std::string &key) const
Definition: LineSet.h:186
const core::Tensor & GetPointPositions() const
Definition: LineSet.h:178
bool HasLineAttr(const std::string &key) const
Definition: LineSet.h:263
bool HasPointAttr(const std::string &key) const
Definition: LineSet.h:250
core::Tensor & GetLineIndices()
Definition: LineSet.h:157
TensorMap & GetPointAttr()
Getter for point_attr_ TensorMap.
Definition: LineSet.h:127
core::Tensor GetCenter() const
Returns the center for point coordinates.
Definition: LineSet.h:296
void RemoveLineAttr(const std::string &key)
Definition: LineSet.h:194
core::Tensor GetMaxBound() const
Returns the max bound for point coordinates.
Definition: LineSet.h:293
std::string ToString() const
Text description.
Definition: LineSet.cpp:56
const core::Tensor & GetPointAttr(const std::string &key) const
Definition: LineSet.h:166
core::Tensor & GetLineAttr(const std::string &key)
Definition: LineSet.h:151
core::Tensor & GetPointAttr(const std::string &key)
Definition: LineSet.h:133
LineSet & Translate(const core::Tensor &translation, bool relative=true)
Translates the points and lines of the LineSet.
Definition: LineSet.cpp:103
LineSet & PaintUniformColor(const core::Tensor &color)
Assigns uniform color to all lines of the LineSet.
Definition: LineSet.cpp:215
OrientedBoundingBox GetOrientedBoundingBox() const
Create an oriented bounding box from point attribute "positions".
Definition: LineSet.cpp:211
const core::Tensor & GetLineColors() const
Definition: LineSet.h:204
void RemovePointAttr(const std::string &key)
Definition: LineSet.h:174
const TensorMap & GetLineAttr() const
Getter for line_attr_ TensorMap. Used in Pybind.
Definition: LineSet.h:142
void SetPointPositions(const core::Tensor &value)
Definition: LineSet.h:218
LineSet Clone() const
Returns copy of the line set on the same device.
Definition: LineSet.h:118
LineSet To(const core::Device &device, bool copy=false) const
Definition: LineSet.cpp:42
TriangleMesh ExtrudeLinear(const core::Tensor &vector, double scale=1.0, bool capping=true) const
Definition: LineSet.cpp:204
TriangleMesh ExtrudeRotation(double angle, const core::Tensor &axis, int resolution=16, double translation=0.0, bool capping=true) const
Definition: LineSet.cpp:194
static LineSet CreateCameraVisualization(int view_width_px, int view_height_px, const core::Tensor &intrinsic, const core::Tensor &extrinsic, double scale, const core::Tensor &color={})
Definition: LineSet.cpp:231
LineSet(const core::Device &device=core::Device("CPU:0"))
Construct an empty LineSet on the provided device.
Definition: LineSet.cpp:26
bool IsEmpty() const override
Returns !HasPointPositions(), line indices are ignored.
Definition: LineSet.h:287
void SetLineAttr(const std::string &key, const core::Tensor &value)
Definition: LineSet.h:228
void SetLineColors(const core::Tensor &value)
Definition: LineSet.h:241
cloudViewer::geometry::LineSet ToLegacy() const
Convert to a legacy CloudViewer LineSet.
Definition: LineSet.cpp:170
core::Tensor & GetPointPositions()
Definition: LineSet.h:139
LineSet & Transform(const core::Tensor &transformation)
Transforms the points and lines of the LineSet.
Definition: LineSet.cpp:97
void SetPointAttr(const std::string &key, const core::Tensor &value)
Definition: LineSet.h:211
core::Tensor & GetLineColors()
Definition: LineSet.h:161
static geometry::LineSet FromLegacy(const cloudViewer::geometry::LineSet &lineset_legacy, core::Dtype float_dtype=core::Float32, core::Dtype int_dtype=core::Int64, const core::Device &device=core::Device("CPU:0"))
Definition: LineSet.cpp:133
const TensorMap & GetPointAttr() const
Getter for point_attr_ TensorMap. Used in Pybind.
Definition: LineSet.h:124
AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const
Create an axis-aligned bounding box from point attribute "positions".
Definition: LineSet.cpp:190
LineSet & Rotate(const core::Tensor &R, const core::Tensor &center)
Rotates the points and lines of the line set. Custom attributes (e.g.: point or line normals) are not...
Definition: LineSet.cpp:126
const core::Tensor & GetLineIndices() const
Definition: LineSet.h:198
core::Tensor GetMinBound() const
Returns the max bound for point coordinates.
Definition: LineSet.h:290
void SetLineIndices(const core::Tensor &value)
Set the value of the "indices" attribute in line_attr_.
Definition: LineSet.h:234
LineSet & Scale(double scale, const core::Tensor &center)
Scales the points and lines of the LineSet.
Definition: LineSet.cpp:116
LineSet & Clear() override
Clear all data in the line set.
Definition: LineSet.h:280
virtual ~LineSet() override
Definition: LineSet.h:108
A bounding box oriented along an arbitrary frame of reference.
std::size_t Erase(const std::string key)
Erase elements for the TensorMap by key value, if the key exists. If the key does not exists,...
Definition: TensorMap.h:92
bool Contains(const std::string &key) const
Definition: TensorMap.h:187
A triangle mesh contains vertices and triangles.
Definition: TriangleMesh.h:98
const Dtype Int64
Definition: Dtype.cpp:47
const Dtype Float32
Definition: Dtype.cpp:42
constexpr nullopt_t nullopt
Definition: Optional.h:136
Generic file read and write utility for python interface.