From 48f717c51742126055f5d1df2a5c6ef8dd0cd9c2 Mon Sep 17 00:00:00 2001
From: Aaron Grabowy <aaron.grabowy@rwth-aachen.de>
Date: Mon, 18 Jan 2021 13:28:40 +0100
Subject: [PATCH] Added visualization for project

---
 samples/04-object-properties/main.cc | 35 ++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/samples/04-object-properties/main.cc b/samples/04-object-properties/main.cc
index 810c107..e277c37 100644
--- a/samples/04-object-properties/main.cc
+++ b/samples/04-object-properties/main.cc
@@ -7,8 +7,15 @@ template <class Obj>
 void test_obj(Obj const& obj)
 {
     tg::rng rng;
-    const int domainD = tg::object_traits<Obj>::domain_dimension;
-    const int objectD = tg::object_traits<Obj>::object_dimension;
+    auto const domainD = tg::object_traits<Obj>::domain_dimension;
+    auto const objectD = tg::object_traits<Obj>::object_dimension;
+    auto const solidD = [&objectD] {
+        if constexpr (tg::object_traits<Obj>::is_boundary)
+            return objectD + 1;
+        return objectD;
+    }();
+    using TraitsT = typename tg::object_traits<Obj>::tag_t;
+
     if constexpr (tg::object_traits<Obj>::is_finite)
     {
         float size;
@@ -26,6 +33,7 @@ void test_obj(Obj const& obj)
             uniformPts.emplace_back(uniform(rng, obj));
 
         auto const aabb = aabb_of(obj);
+        auto const aabbBigger = tg::aabb(aabb.min - 0.25f, aabb.max + 0.25f);
         tg::aabb3 aabb3;
         if constexpr (domainD == 3)
             aabb3 = aabb;
@@ -53,11 +61,10 @@ void test_obj(Obj const& obj)
             gv::view(gv::lines(aabb3));
 
             // normal_of
-            if constexpr (domainD == 3 && ((objectD == 2 && !tg::object_traits<Obj>::is_boundary) || (objectD == 1 && tg::object_traits<Obj>::is_boundary)))
+            if constexpr (domainD == 3 && solidD == 2)
                 gv::view(tg::segment3(centroid, centroid + normal_of(obj)), tg::color4::green);
         }
         {
-            auto const aabbBigger = tg::aabb(aabb.min - 0.25f, aabb.max + 0.25f);
             auto pointsInside = std::vector<tg::pos3>();
             auto pointsOutside = std::vector<tg::pos3>();
             auto const numPts = tg::pow(20.f, domainD);
@@ -73,9 +80,27 @@ void test_obj(Obj const& obj)
 
             // contains
             auto v = gv::view();
-            view(pointsInside, gv::maybe_empty, tg::color4::green);
+            view(pointsInside, gv::maybe_empty, tg::color4::green, "contains (+-" + tg::to_string(tolerance) + ")");
             gv::view(gv::points(pointsOutside).point_size_px(5.f));
         }
+        if constexpr (!std::is_same_v<Obj, tg::ellipse<solidD, float, domainD, TraitsT>>) {
+            auto points = std::vector<tg::pos3>();
+            auto lines = std::vector<tg::segment3>();
+            auto const numPts = tg::pow(20.f, domainD);
+            for (auto i = 0; i < numPts; ++i)
+            {
+                auto const p = uniform(rng, aabbBigger);
+                auto const pProj = tg::pos3(project(p, obj));
+                points.emplace_back(pProj);
+                if (!contains(obj, p))
+                    lines.emplace_back(tg::pos3(p), pProj);
+            }
+
+            // project
+            auto v = gv::view();
+            gv::view(points, "project");
+            gv::view(lines);
+        }
     }
 }
 
-- 
GitLab