Skip to content

Commit fb89b0a

Browse files
district10TANG ZHIXIONG
andauthored
test handle dups (#10)
* test handle dups * bind more functions * update headers Co-authored-by: TANG ZHIXIONG <dvora4tzx@gmail.com>
1 parent ed9e9e6 commit fb89b0a

File tree

5 files changed

+46
-2
lines changed

5 files changed

+46
-2
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
2222
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
2323
endif()
2424

25-
include_directories(BEFORE ${PROJECT_SOURCE_DIR}/headers/include)
25+
include_directories(${PROJECT_SOURCE_DIR}/headers/include)
2626

2727
set(CMAKE_CXX_STANDARD 17)
2828
set(PYBIND11_CPP_STANDARD -std=c++17)

src/polyline_ruler.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,12 @@ struct PolylineRuler
284284
}
285285
return *ranges_;
286286
}
287+
double range(int seg_idx) const { return ranges()[seg_idx]; }
288+
double range(int seg_idx, double t) const
289+
{
290+
auto &ranges = this->ranges();
291+
return ranges[seg_idx] * (1.0 - t) + ranges[seg_idx + 1] * t;
292+
}
287293

288294
double length() const { return ranges()[N_ - 1]; }
289295

@@ -386,6 +392,15 @@ struct PolylineRuler
386392
is_wgs84_);
387393
}
388394

395+
Eigen::Vector3d at(double range) const { return extended_along(range); }
396+
Eigen::Vector3d at(int seg_idx) const { return polyline_.row(seg_idx); }
397+
Eigen::Vector3d at(int seg_idx, double t) const
398+
{
399+
return interpolate(polyline_.row(seg_idx), //
400+
polyline_.row(seg_idx + 1), //
401+
t, is_wgs84_);
402+
}
403+
389404
std::pair<Eigen::Vector3d, Eigen::Vector3d>
390405
arrow(double range, bool smooth_joint = true) const
391406
{

src/pybind11_polyline_ruler.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ CUBAO_INLINE void bind_polyline_ruler(py::module &m)
8787
"polyline"_a, py::kw_only(), "is_wgs84"_a = false)
8888
.def("ranges", py::overload_cast<>(&PolylineRuler::ranges, py::const_),
8989
rvp::reference_internal)
90+
.def("range", py::overload_cast<int>(&PolylineRuler::range, py::const_),
91+
"segment_index"_a)
92+
.def("range",
93+
py::overload_cast<int, double>(&PolylineRuler::range, py::const_),
94+
py::kw_only(), "segment_index"_a, "t"_a)
9095
//
9196
.def("length", &PolylineRuler::length)
9297
//
@@ -102,6 +107,13 @@ CUBAO_INLINE void bind_polyline_ruler(py::module &m)
102107
py::overload_cast<double, bool>(&PolylineRuler::dir, py::const_),
103108
"range"_a, py::kw_only(), "smooth_joint"_a = true)
104109
.def("extended_along", &PolylineRuler::extended_along, "range"_a)
110+
.def("at", py::overload_cast<double>(&PolylineRuler::at, py::const_),
111+
"range"_a)
112+
.def("at", py::overload_cast<int>(&PolylineRuler::at, py::const_),
113+
"segment_index"_a)
114+
.def("at",
115+
py::overload_cast<int, double>(&PolylineRuler::at, py::const_),
116+
"segment_index"_a, py::kw_only(), "t"_a)
105117
.def("arrow", &PolylineRuler::arrow, "range"_a, //
106118
py::kw_only(), "smooth_joint"_a = true)
107119
.def("arrows",

tests/test_basic.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,3 +303,20 @@ def test_polyline_ruler():
303303
assert len(ranges) == 12 and ranges[-1] == 110
304304
ranges, xyzs, dirs = ruler.arrows(10.0 - 1e-9)
305305
assert len(ranges) == 13 and ranges[-1] == 110
306+
307+
308+
def test_polyline_ruler_duplicates():
309+
ruler = PolylineRuler([[0, 0, 0], [10, 0, 0], [10, 0, 0], [100, 0, 0]])
310+
assert np.all(ruler.ranges() == [0, 10, 10, 100])
311+
assert np.all(ruler.dirs() == [[1, 0, 0], [1, 0, 0], [1, 0, 0]])
312+
313+
314+
def test_polyline_ruler_at():
315+
ruler = PolylineRuler([[0, 0, 0], [10, 0, 0], [10, 0, 0], [100, 0, 0]])
316+
assert np.all(ruler.ranges() == [0, 10, 10, 100])
317+
xyz = ruler.at(2.0)
318+
assert np.all(xyz == [2, 0, 0])
319+
xyz = ruler.at(2)
320+
assert np.all(xyz == [10, 0, 0])
321+
xyz = ruler.at(2, t=0.5)
322+
assert np.all(xyz == [55, 0, 0])

0 commit comments

Comments
 (0)