MCPcopy Create free account
hub / github.com/BIMCoderLiang/LNLib / GetBoundingBox

Method GetBoundingBox

src/LNLib/Geometry/Surface/NurbsSurface.cpp:323–379  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

321}
322
323LNLib::LN_BoundingBox3d LNLib::NurbsSurface::GetBoundingBox(const LN_NurbsSurface& surface)
324{
325 std::vector<std::vector<LNLib::XYZW>> controlPoints = surface.ControlPoints;
326
327 LN_BoundingBox3d box0;
328 if (controlPoints.empty() || controlPoints[0].empty()) {
329 box0.MinPoint = box0.MaxPoint = LNLib::XYZ();
330 return box0;
331 }
332
333 box0.MinPoint = controlPoints[0][0].ToXYZ(true);
334 box0.MaxPoint = controlPoints[0][0].ToXYZ(true);
335
336 for (const auto& row : controlPoints) {
337 for (const LNLib::XYZW& ptw : row) {
338
339 XYZ pt = ptw.ToXYZ(true);
340
341 box0.MinPoint.X() = std::min(box0.MinPoint.X(), pt.X());
342 box0.MinPoint.Y() = std::min(box0.MinPoint.Y(), pt.Y());
343 box0.MinPoint.Z() = std::min(box0.MinPoint.Z(), pt.Z());
344
345 box0.MaxPoint.X() = std::max(box0.MaxPoint.X(), pt.X());
346 box0.MaxPoint.Y() = std::max(box0.MaxPoint.Y(), pt.Y());
347 box0.MaxPoint.Z() = std::max(box0.MaxPoint.Z(), pt.Z());
348 }
349 }
350
351 LN_BoundingBox3d box1;
352 for (int i = 0; i < surface.KnotVectorU.size() - 1; i++)
353 {
354 for (int j = 0; j < surface.KnotVectorV.size() - 1; j++)
355 {
356 double u = surface.KnotVectorU[i];
357 double v = surface.KnotVectorV[i];
358
359 XYZ pt = GetPointOnSurface(surface, UV(u,v));
360 box1.MinPoint.X() = std::min(box1.MinPoint.X(), pt.X());
361 box1.MinPoint.Y() = std::min(box1.MinPoint.Y(), pt.Y());
362 box1.MinPoint.Z() = std::min(box1.MinPoint.Z(), pt.Z());
363
364 box1.MaxPoint.X() = std::max(box1.MaxPoint.X(), pt.X());
365 box1.MaxPoint.Y() = std::max(box1.MaxPoint.Y(), pt.Y());
366 box1.MaxPoint.Z() = std::max(box1.MaxPoint.Z(), pt.Z());
367 }
368 }
369
370 LN_BoundingBox3d result;
371 result.MinPoint.X() = std::max(box0.MinPoint.X(), box1.MinPoint.X());
372 result.MinPoint.Y() = std::max(box0.MinPoint.Y(), box1.MinPoint.Y());
373 result.MinPoint.Z() = std::max(box0.MinPoint.Z(), box1.MinPoint.Z());
374
375 result.MaxPoint.X() = std::min(box0.MaxPoint.X(), box1.MaxPoint.X());
376 result.MaxPoint.Y() = std::min(box0.MaxPoint.Y(), box1.MaxPoint.Y());
377 result.MaxPoint.Z() = std::min(box0.MaxPoint.Z(), box1.MaxPoint.Z());
378 return result;
379}
380

Callers

nothing calls this directly

Calls 7

GetPointOnSurfaceFunction · 0.85
XMethod · 0.80
YMethod · 0.80
ZMethod · 0.80
XYZClass · 0.50
UVClass · 0.50
ToXYZMethod · 0.45

Tested by

no test coverage detected