Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
finished src/random_points_on_mesh.cpp
  • Loading branch information
Ziheng-Liang committed Feb 5, 2018
commit 1bfdbe0bc5c829247df90cb0c71e9cadeca1cc3e
5 changes: 5 additions & 0 deletions include/random_points_on_mesh.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#ifndef RANDOM_POINTS_ON_MESH_H
#define RANDOM_POINTS_ON_MESH_H
#include <Eigen/Core>
#include <iostream>
#include <igl/doublearea.h>
#include <igl/cumsum.h>
#include <stdlib.h>

// RANDOM_POINTS_ON_MESH Randomly sample a mesh (V,F) n times.
//
// Inputs:
Expand Down
36 changes: 35 additions & 1 deletion src/random_points_on_mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,40 @@ void random_points_on_mesh(
{
// REPLACE WITH YOUR CODE:
X.resize(n,3);
for(int i = 0;i<X.rows();i++) X.row(i) = V.row(i%V.rows());
Eigen::MatrixXd area;
Eigen::MatrixXd cumsumA;
igl::doublearea(V, F, area);
igl::cumsum(area, 1, cumsumA);

double ttl = cumsumA(cumsumA.rows() - 1, 0);
for(int i=0;i<n;i++) {
double randx = ((double)rand()/(double)RAND_MAX) * ttl;
int idx = cumsumA.rows() / 2;
int gap = cumsumA.rows() / 4;
//go over boundary?
while(idx != 0 && idx != cumsumA.rows() - 1 &&
cumsumA(idx - 1) < randx &&
cumsumA(idx) > randx) {
if (randx > cumsumA(idx - 1)) {
idx += gap;
}
else {
idx -= gap;
}
gap /= 2;
}

double alpha = ((double)rand()/(double)RAND_MAX);
double beta = ((double)rand()/(double)RAND_MAX);

if (alpha + beta > 1) {
alpha = 1 - alpha;
beta = 1 - beta;
}

X.row(i) = V.row(F(idx, 0)) +
alpha * V.row(F(idx, 1)) +
beta * V.row(F(idx, 2));
}
}