mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 14:23:53 +00:00
Fixes mapping of horizontal curve with IfcCircle
This commit is contained in:
committed by
Thomas Krijnen
parent
e794911926
commit
3eb85cc36a
@@ -220,21 +220,19 @@ public:
|
|||||||
{
|
{
|
||||||
auto R = c->Radius();
|
auto R = c->Radius();
|
||||||
|
|
||||||
auto sign_x = 1.0;
|
auto sign_l = sign(length_);
|
||||||
auto sign_y = sign(length_);
|
auto start = start_;
|
||||||
|
|
||||||
//const auto& transformation_matrix = taxonomy::cast<taxonomy::matrix4>(mapping_->map(c->Position()))->ccomponents();
|
//const auto& transformation_matrix = taxonomy::cast<taxonomy::matrix4>(mapping_->map(c->Position()))->ccomponents();
|
||||||
auto transformation_matrix = taxonomy::cast<taxonomy::matrix4>(mapping_->map(c->Position()))->ccomponents();
|
auto transformation_matrix = taxonomy::cast<taxonomy::matrix4>(mapping_->map(c->Position()))->ccomponents();
|
||||||
|
|
||||||
eval_ = [R, transformation_matrix, sign_x, sign_y](double u)
|
eval_ = [R, transformation_matrix, start, sign_l](double u)
|
||||||
{
|
{
|
||||||
auto angle = u / R; // angle subtended by arc length u
|
auto angle = start + sign_l * u / R;
|
||||||
|
|
||||||
// compute point on circle centered at (0,0) with x-axis horizontal and y-axis vertical
|
auto x = R * cos(angle);
|
||||||
auto x = sign_x * R * cos(angle);
|
auto y = R * sin(angle);
|
||||||
auto y = sign_y * R * sin(angle);
|
|
||||||
|
|
||||||
// transform point into circle's coodinate system
|
|
||||||
auto result = transformation_matrix * Eigen::Vector4d(x, y, 0.0, 1.0);
|
auto result = transformation_matrix * Eigen::Vector4d(x, y, 0.0, 1.0);
|
||||||
Eigen::VectorXd vec(4);
|
Eigen::VectorXd vec(4);
|
||||||
vec << result(0), result(1), 0.0, 1.0;
|
vec << result(0), result(1), 0.0, 1.0;
|
||||||
@@ -342,7 +340,7 @@ public:
|
|||||||
eval_ = [py, dy](double u) {
|
eval_ = [py, dy](double u) {
|
||||||
auto z = py + u * dy;
|
auto z = py + u * dy;
|
||||||
Eigen::VectorXd vec(4);
|
Eigen::VectorXd vec(4);
|
||||||
vec << 0.0, 0.0, z, 1.0;
|
vec << 0.0, z, 0.0, 1.0;
|
||||||
return vec;
|
return vec;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -361,8 +359,10 @@ public:
|
|||||||
std::array<const std::vector<double>*, 3> coefficients{&coeffX, &coeffY, &coeffZ}; // don't copy
|
std::array<const std::vector<double>*, 3> coefficients{&coeffX, &coeffY, &coeffZ}; // don't copy
|
||||||
std::array<double, 3> values{0.0, 0.0, 0.0}; // @todo, use Eigen::VectorXd - I'm sure there is a way to do this with Eigen, but this is what I know
|
std::array<double, 3> values{0.0, 0.0, 0.0}; // @todo, use Eigen::VectorXd - I'm sure there is a way to do this with Eigen, but this is what I know
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
for (auto iter = coefficients[i]->cbegin(); iter != coefficients[i]->cend(); iter++) {
|
auto begin = coefficients[i]->cbegin();
|
||||||
auto exp = std::distance(coefficients[i]->cbegin(), iter);
|
auto end = coefficients[i]->cend();
|
||||||
|
for (auto iter = begin; iter != end; iter++) {
|
||||||
|
auto exp = std::distance(begin, iter);
|
||||||
values[i] += (*iter) * pow(u, exp);
|
values[i] += (*iter) * pow(u, exp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user