@@ -30,19 +30,36 @@ namespace {
3030 if (extent.contains (city_obj))
3131 return false ;
3232 }
33-
3433 return true ;
3534 }
3635
36+ // / extentsの幅と奥行きの長さを multiplier 倍にします。
37+ std::vector<geometry::Extent> extendExtents (const std::vector<geometry::Extent>& src_extents, float multiplier) {
38+ auto result = std::vector<geometry::Extent>();
39+
40+ for (const auto & src_extent : src_extents) {
41+ const auto center = src_extent.centerPoint ();
42+ const auto prev_min = src_extent.min ;
43+ const auto prev_max = src_extent.max ;
44+ auto next_min = center + (prev_min - center) * multiplier;
45+ auto next_max = center + (prev_max - center) * multiplier;
46+ result.emplace_back (next_min, next_max);
47+ }
48+ return result;
49+ }
50+
3751 void extractInner (
3852 Model& out_model, const CityModel& city_model,
3953 const MeshExtractOptions& options,
40- const std::vector<geometry::Extent>& extents ) {
54+ const std::vector<geometry::Extent>& extents_before_adjust ) {
4155
4256 if (options.max_lod < options.min_lod ) throw std::logic_error (" Invalid LOD range." );
4357
4458 const auto geo_reference = geometry::GeoReference (options.coordinate_zone_id , options.reference_point , options.unit_scale , options.mesh_axes );
4559
60+ // 範囲の境界上にある地物を取り逃さないように、範囲を少し広げます。
61+ auto extents = extendExtents (extents_before_adjust, 1 .2f );
62+
4663 // rootNode として LODノード を作ります。
4764 for (unsigned lod = options.min_lod ; lod <= options.max_lod ; lod++) {
4865 auto lod_node = Node (" LOD" + std::to_string (lod));
@@ -188,7 +205,6 @@ namespace plateau::polygonMesh {
188205 const MeshExtractOptions& options,
189206 const std::vector<plateau::geometry::Extent>& extents) {
190207
191-
192208 extractInner (out_model, city_model, options, extents);
193209 }
194210
0 commit comments