Point cloud addition master
authorTrevor Irons <tirons@egi.utah.edu>
Mon, 27 Jun 2016 22:41:42 +0000 (16:41 -0600)
committerTrevor Irons <tirons@egi.utah.edu>
Mon, 27 Jun 2016 22:41:42 +0000 (16:41 -0600)
examples/DEMGrain.cpp
include/DEMGrain.h
include/DEMParticle.h
src/DEMGrain.cpp
src/DEMParticle.cpp

index c96463f..bf1845c 100644 (file)
@@ -24,16 +24,17 @@ using namespace Lemma;
 int main()
 {
     auto Grain = DEMGrain::NewSP();
-    Grain->SetCentreMass( (Vector3r() << 2.254,3.14,4.).finished() );
+        Grain->SetCentreMass( (Vector3r() << 2.254,3.14,4.).finished() );
+        Grain->RandomPointCloud(5, 0.0023);
     std::cout << *Grain << std::endl;
-    YAML::Node ng = Grain->Serialize();
 
-    auto Grain3 = DEMGrain::NewSP();
-    std::cout << Grain3->GetName() << std::endl;
-    std::cout << ((DEMParticle*)(Grain3.get()))->GetName() << std::endl;
-
-    auto Grain4 = DEMParticle::NewSP();
-    std::cout << Grain4->GetName() << std::endl;
+//    YAML::Node ng = Grain->Serialize();
+//     auto Grain3 = DEMGrain::NewSP();
+//     std::cout << Grain3->GetName() << std::endl;
+//     std::cout << ((DEMParticle*)(Grain3.get()))->GetName() << std::endl;
+//
+//     auto Grain4 = DEMParticle::NewSP();
+//     std::cout << Grain4->GetName() << std::endl;
 
     //Vector3r pos; pos << 2,3,4;
 
index 5ca30ef..0669567 100644 (file)
@@ -23,6 +23,9 @@
 #pragma once
 #include "DEMParticle.h"
 
+#include <random>
+#include <time.h>
+
 namespace Lemma {
 
     /**
@@ -60,6 +63,14 @@ namespace Lemma {
 
         // ====================  OPERATIONS    =======================
 
+        /**
+         *  Constructs the DEMGrain with random angular points. The points
+         *  are called from normal distribution
+         *  @param[input] npoints the number points to build a grain out of
+         *  @param[input] sigma is the variance of the random distribution
+         */
+        void RandomPointCloud ( const int& npoints, const Real& sigma );
+
         // ====================  ACCESS        =======================
 
         // ====================  INQUIRY       =======================
@@ -70,6 +81,11 @@ namespace Lemma {
 
         protected:
 
+        /**
+         *  Performs a convex hull on the point cloud, uses a brute force approach
+         */
+        void ConvexHull();
+
         // ====================  LIFECYCLE     =======================
 
         /**
@@ -93,6 +109,12 @@ namespace Lemma {
 
         static constexpr auto CName = "DEMGrain";
 
+        /** The points defining the angular grain */
+        Vector3Xr    Points;
+
+        /** The connections between the points */
+        MatrixXi    Connections;
+
     }; // -----  end of class  DEMGrain  -----
 }  // -----  end of namespace Lemma ----
 
index 1e89c31..810f10e 100644 (file)
@@ -62,8 +62,13 @@ namespace Lemma {
 
         void SetCentreMass( const Vector3r& pos );
 
+        /** Accessor to centre of Mass */
         Vector3r GetCentreMass(  );
 
+        /** Convience accessor to  a single corrdinate of the centre of mass
+         */
+        Real  GetCentreMass( const int& icord );
+
         // ====================  INQUIRY       =======================
         /** Returns the name of the underlying class, similiar to Python's type */
         virtual inline std::string GetName() const {
index a8a5138..75fe2b0 100644 (file)
@@ -46,6 +46,7 @@ namespace Lemma {
     // Description:  DeSerializing constructor (protected)
     //--------------------------------------------------------------------------------------
     DEMGrain::DEMGrain (const YAML::Node& node) : DEMParticle(node) {
+        Points = node["Points"].as<Vector3Xr>( );
 
     }  // -----  end of method DEMGrain::DEMGrain  (constructor)  -----
 
@@ -76,6 +77,7 @@ namespace Lemma {
         YAML::Node node = DEMParticle::Serialize();
         node.SetTag( GetName() );
         // FILL IN CLASS SPECIFICS HERE
+        node["Points"] = Points;
         return node;
     }          // -----  end of method DEMGrain::Serialize  -----
 
@@ -91,6 +93,46 @@ namespace Lemma {
         return Object ;
     }          // -----  end of method DEMGrain::DeSerialize  -----
 
+
+    //--------------------------------------------------------------------------------------
+    //       Class:  DEMGrain
+    //      Method:  RandomPointBuild
+    //--------------------------------------------------------------------------------------
+    void DEMGrain::RandomPointCloud ( const int& npoints, const Real& sigma ) {
+
+        Points.resize( Eigen::NoChange, npoints );
+        std::mt19937 eng(time(NULL));
+        std::normal_distribution<Real> normalx(GetCentreMass(0), sigma);
+        std::normal_distribution<Real> normaly(GetCentreMass(1), sigma);
+        std::normal_distribution<Real> normalz(GetCentreMass(2), sigma);
+        std::cout.precision(12);
+        for(int i=0; i < npoints; ++i) {
+            Points(0, i) = normalx(eng);
+            Points(1, i) = normaly(eng);
+            Points(2, i) = normalz(eng);
+        }
+        ConvexHull();
+        return ;
+    }          // -----  end of method DEMGrain::RandomPoints  -----
+
+
+
+    //--------------------------------------------------------------------------------------
+    //       Class:  DEMGrain
+    //      Method:  ConvexHull
+    //--------------------------------------------------------------------------------------
+    void DEMGrain::ConvexHull (  ) {
+
+        //for ( auto point : Points.rowwise() ) {
+        // Brute force algorithm (O(n^3))
+        for (int icol=0; icol<Points.cols(); ++icol) {
+            std::cout << Points.col(icol) << std::endl;
+        }
+
+
+        return ;
+    }          // -----  end of method DEMGrain::ConvexHull  -----
+
 } // ----  end of namespace Lemma  ----
 
 /* vim: set tabstop=4 expandtab: */
index 022ab28..61f0208 100644 (file)
@@ -99,6 +99,16 @@ Vector3r DEMParticle::GetCentreMass (  ) {
     return centreMass;
 }              // -----  end of method DEMParticle::get_CentreMass  -----
 
+//--------------------------------------------------------------------------------------
+//       Class:  DEMParticle
+//      Method:  GetCentreMass
+//--------------------------------------------------------------------------------------
+Real DEMParticle::GetCentreMass ( const int& icoord ) {
+    return centreMass(icoord);
+}              // -----  end of method DEMParticle::get_CentreMass  -----
+
+
+
 //--------------------------------------------------------------------------------------
 //       Class:  DEMParticle
 //      Method:  SetCentreMass