|
|
@ -17,10 +17,10 @@ namespace top { |
|
|
|
public: |
|
|
|
IrregularMesh(const ModelMesh &arbitrary_mesh) : Mesh() { |
|
|
|
// get num_pixels
|
|
|
|
const double percentage_of_min_len = 0.10;// TODO: fixme
|
|
|
|
const double percentage_of_min_len = 0.05;// TODO: fixme
|
|
|
|
#ifdef DEBUG |
|
|
|
min_point_box_=Eigen::Vector3d(1,1,1)-5.0; |
|
|
|
Eigen::Vector3d box_max_point=Eigen::Vector3d(1,1,1)+5.0; |
|
|
|
min_point_box_=Eigen::Vector3d(1,1,1).array()-5.0; |
|
|
|
Eigen::Vector3d box_max_point=Eigen::Vector3d(1,1,1).array()+5.0; |
|
|
|
#else |
|
|
|
min_point_box_ = arbitrary_mesh.points.colwise().minCoeff(); |
|
|
|
Eigen::Vector3d box_max_point = arbitrary_mesh.points.colwise().maxCoeff(); |
|
|
@ -37,10 +37,10 @@ namespace top { |
|
|
|
num_node_ = (lx_ + 1) * (ly_ + 1) * (lz_ + 1); |
|
|
|
num_ele_ = lx_ * ly_ * lz_; |
|
|
|
|
|
|
|
ten_ele_coord2ele_id = Tensor3i(lx_, ly_, lz_); |
|
|
|
ten_node_coord2node_id.setConstant(-1); |
|
|
|
ten_node_coord2node_id = Tensor3i(lx_ + 1, ly_ + 1, lz_ + 1); |
|
|
|
ten_node_coord2node_id.setConstant(-1); |
|
|
|
ten_ele_coord2ele_id_ = Tensor3i(lx_, ly_, lz_); |
|
|
|
ten_ele_coord2ele_id_.setConstant(-1); |
|
|
|
ten_node_coord2node_id_ = Tensor3i(lx_ + 1, ly_ + 1, lz_ + 1); |
|
|
|
ten_node_coord2node_id_.setConstant(-1); |
|
|
|
|
|
|
|
auto EvaluateSDF = [](const Eigen::Vector3d point) { |
|
|
|
Eigen::Vector3d center(1, 1, 1); |
|
|
@ -73,10 +73,10 @@ namespace top { |
|
|
|
for (int j = 0; j < ly_; ++j) { |
|
|
|
for (int i = 0; i < lx_; ++i) { |
|
|
|
if (Is_in_model({i, j, k})) { |
|
|
|
ten_ele_coord2ele_id(i, j, k) = cnt_pixel++; |
|
|
|
ten_ele_coord2ele_id_(i, j, k) = cnt_pixel++; |
|
|
|
for (int di = 0; di < delta_coord.rows(); ++di) { |
|
|
|
Eigen::Vector3i cur_delta_coord = delta_coord.row(di); |
|
|
|
ten_node_coord2node_id(i + cur_delta_coord(0), j + cur_delta_coord(1), |
|
|
|
ten_node_coord2node_id_(i + cur_delta_coord(0), j + cur_delta_coord(1), |
|
|
|
k + cur_delta_coord(2)) = 1; |
|
|
|
} |
|
|
|
} |
|
|
@ -90,8 +90,8 @@ namespace top { |
|
|
|
for (int k = 0; k < lz_ + 1; ++k) { |
|
|
|
for (int j = 0; j < ly_ + 1; ++j) { |
|
|
|
for (int i = 0; i < lx_ + 1; ++i) { |
|
|
|
if (ten_node_coord2node_id(i, j, k) == 1) { |
|
|
|
ten_node_coord2node_id(i, j, k) = cnt_node_pixel++; |
|
|
|
if (ten_node_coord2node_id_(i, j, k) == 1) { |
|
|
|
ten_node_coord2node_id_(i, j, k) = cnt_node_pixel++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -103,13 +103,13 @@ namespace top { |
|
|
|
for (int k = 0; k < lz_; ++k) { |
|
|
|
for (int j = 0; j < ly_; ++j) { |
|
|
|
for (int i = 0; i < lx_; ++i) { |
|
|
|
int cur_ele_id = ten_ele_coord2ele_id(i, j, k); |
|
|
|
int cur_ele_id = ten_ele_coord2ele_id_(i, j, k); |
|
|
|
if (cur_ele_id == -1) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
Eigen::MatrixXi world_node_coords = delta_coord.rowwise() + Eigen::RowVector3i(i, j, k); |
|
|
|
assert(world_node_coords.rows() == 8 && world_node_coords.cols() == 3); |
|
|
|
Eigen::Vector<int, 8> node_ids = ten_node_coord2node_id(world_node_coords); |
|
|
|
Eigen::Vector<int, 8> node_ids = ten_node_coord2node_id_(world_node_coords); |
|
|
|
for (int nodi = 0; nodi < 8; ++nodi) { |
|
|
|
mat_ele_id2dofs_(cur_ele_id, {3 * nodi, 3 * nodi + 1, 3 * nodi + 2}) = Eigen::Vector3i( |
|
|
|
3 * node_ids(nodi), 3 * node_ids(nodi) + 1, 3 * node_ids(nodi) + 2); |
|
|
@ -117,7 +117,17 @@ namespace top { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// fill valid_ele_idx_
|
|
|
|
valid_ele_idx_.resize(num_pixel_); |
|
|
|
Tensor3i ten_tmp_col=ten_ele_coord2ele_id_.reshape(Eigen::array<int,3>{num_ele_,1,1}); |
|
|
|
cnt_pixel=0; |
|
|
|
for(int i=0;i<ten_tmp_col.size();++i){ |
|
|
|
if(ten_tmp_col(i,0,0)!=-1){ |
|
|
|
valid_ele_idx_(cnt_pixel)=i; |
|
|
|
++cnt_pixel; |
|
|
|
} |
|
|
|
} |
|
|
|
assert(cnt_pixel==num_pixel_); |
|
|
|
} |
|
|
|
|
|
|
|
int GetNumDofs() const override { |
|
|
|