You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.5 KiB
135 lines
4.5 KiB
#pragma once
|
|
#include "assert.hpp"
|
|
#include "DomainDiscretization_fwd.hpp"
|
|
|
|
namespace meshless {
|
|
template<typename vec>
|
|
const vec& DomainDiscretization<vec>::normal(int i) const {
|
|
assert_msg(0 <= i && i <= size(), "Index %d out of range [0, %d)", i, size());
|
|
assert_msg(types_[i] < 0, "Node %d must be a boundary node, got type %d.", i, types_[i]);
|
|
assert_msg(boundaryMap_[i] != -1, "Node %d does not have a normal. Maybe you manually set"
|
|
" supports and positions instead of using addInternalNode* methods?",
|
|
i);
|
|
return normals_[boundaryMap_[i]];
|
|
|
|
}
|
|
template<typename vec>
|
|
vec& DomainDiscretization<vec>::normal(int i) {
|
|
assert_msg(0 <= i && i <= size(), "Index %d out of range [0, %d)", i, size());
|
|
assert_msg(types_[i] < 0, "Node %d must be a boundary node, got type %d.", i, types_[i]);
|
|
assert_msg(boundaryMap_[i] != -1, "Node %d does not have a normal. Maybe you manually set"
|
|
" supports and positions instead of using addInternalNode* methods?",
|
|
i);
|
|
return normals_[boundaryMap_[i]];
|
|
|
|
}
|
|
|
|
template<typename vec>
|
|
int DomainDiscretization<vec>::addInternalNode(const vec& point, int type) {
|
|
|
|
assert_msg(type > 0, "This function is for adding internal points, but got type %d, which is "
|
|
"not positive. Use addBoundaryNode to add boundary nodes.",
|
|
type);
|
|
return addNode(point, type);
|
|
}
|
|
|
|
template<typename vec>
|
|
int DomainDiscretization<vec>::addInternalNodeWithT(const vec& point, double t, int type) {
|
|
|
|
assert_msg(type > 0, "This function is for adding internal points, but got type %d, which is "
|
|
"not positive. Use addBoundaryNode to add boundary nodes.",
|
|
type);
|
|
return addNodeWithT(point, t, type);
|
|
}
|
|
|
|
/**
|
|
* Adds a boundary node with given type and normal to the domain.
|
|
* @param point Coordinates of the node to add.
|
|
* @param type Type of the point, must be negative.
|
|
* @param normal Outside unit normal to the boundary at point `point`.
|
|
* @return The index of the new node.
|
|
* @sa addInternalNode
|
|
*/
|
|
template<typename vec>
|
|
int DomainDiscretization<vec>::addBoundaryNode(const vec& point, int type, const vec& normal) {
|
|
assert_msg(type < 0, "Type of boundary points must be negative, got %d.", type);
|
|
int idx = addNode(point, type);
|
|
boundaryMap_[idx] = normals_.size();
|
|
normals_.push_back(normal);
|
|
return idx;
|
|
|
|
}
|
|
|
|
template<typename vec>
|
|
int DomainDiscretization<vec>::addBoundaryNodeWithT(const vec& point, double t, int type, const vec& normal) {
|
|
assert_msg(type < 0, "Type of boundary points must be negative, got %d.", type);
|
|
int idx = addNodeWithT(point, t, type);
|
|
boundaryMap_[idx] = normals_.size();
|
|
normals_.push_back(normal);
|
|
return idx;
|
|
|
|
}
|
|
|
|
template<typename vec>
|
|
int DomainDiscretization<vec>::addNode(const vec& point, int type) {
|
|
positions_.push_back(point);
|
|
types_.push_back(type);
|
|
support_.emplace_back();
|
|
boundaryMap_.push_back(-1);
|
|
return positions_.size() - 1;
|
|
}
|
|
|
|
template<typename vec>
|
|
int DomainDiscretization<vec>::addNodeWithT(const vec& point, double t, int type) {
|
|
positions_.push_back(point);
|
|
inCurve_.push_back(t);
|
|
types_.push_back(type);
|
|
support_.emplace_back();
|
|
boundaryMap_.push_back(-1);
|
|
return positions_.size() - 1;
|
|
}
|
|
|
|
template<class vec>
|
|
template<typename search_struc>
|
|
void DomainDiscretization<vec>::makeDiscreteContainsStructure(search_struc& search) const {
|
|
int size = boundary().size();
|
|
std::vector<vec> boundary_points(size);
|
|
for(int i = 0; i < boundaryMap_.size(); i++) {
|
|
if(boundaryMap_[i] == -1)
|
|
continue;
|
|
boundary_points[boundaryMap_[i]] = positions_[i];
|
|
}
|
|
search.reset(boundary_points);
|
|
}
|
|
|
|
//bool DomainDiscretization::contains(const vec& point)const;
|
|
template<typename vec>
|
|
template<typename search_struc>
|
|
bool DomainDiscretization<vec>::discreteContains(const Eigen::Vector3d& point, search_struc& search, int num)const {
|
|
assert_msg((search.size() != 0), "Search structure should not be empty.");
|
|
auto closet = search.query(point, num);
|
|
auto closet_indexs = closet.first;
|
|
for(int i = 0; i < closet_indexs.size(); i++) {
|
|
auto idx = closet_indexs[i];
|
|
auto n = normals_[idx];
|
|
auto closet_point = search.get(idx);
|
|
if(n.dot(point - closet_point) >= 0) {
|
|
return false;
|
|
}
|
|
}
|
|
// for (auto idx : closet_indexs)
|
|
// {
|
|
// auto n = normals_[idx];
|
|
// auto closet_point = search.get(idx);
|
|
// if (n.dot(point - closet_point) >= 0)
|
|
// {
|
|
// return false;
|
|
// }
|
|
// }
|
|
return true;
|
|
// int closest_index = search.query(point, 1).first[0];
|
|
// auto closest_point = search.get(closest_index);
|
|
// auto n = normals_[closest_index];
|
|
// return n.dot(point - closest_point) < 0;
|
|
}
|
|
};
|