Skip to content
Snippets Groups Projects
Commit 9153648f authored by Studer Gabriel's avatar Studer Gabriel
Browse files

avoid atan2(0.0, 0.0) in Dihedral::SetAngleICS

parent 9a0654f7
No related branches found
No related tags found
No related merge requests found
...@@ -125,26 +125,29 @@ void Dihedral::SetAngleICS(Real angle, bool update_other) { ...@@ -125,26 +125,29 @@ void Dihedral::SetAngleICS(Real angle, bool update_other) {
// not all connectors are living in the same coordinate system. We first // not all connectors are living in the same coordinate system. We first
// have to bring all of them into the local coordinate system of a3. // have to bring all of them into the local coordinate system of a3.
if (a2->GetPrimaryConnector() && a2->GetPrimaryConnector()->GetFirst()==a1) { if (a2->GetPrimaryConnector() && a2->GetPrimaryConnector()->GetFirst()==a1) {
v1=geom::Vec3(0, 0,-1)*conn2->GetLocalRot(); // equivalent to geom::Transpose(conn2->GetLocalRot()) * geom::Vec3(0,0,-1)
v2=geom::Vec3(0, 0, 1); v1=geom::Vec3(0, 0,-1)*conn2->GetLocalRot();
ConnectorImplP c=GetConnector(a4, a3); ConnectorImplP c=GetConnector(a4, a3);
v3=c->GetDir(); v2=c->GetDir();
Real phi1=atan2(v1[1], v1[0]); Real phi1 = 0.0;
geom::Vec3 n3=vec_for_angle(v3, angle+phi1); if(std::abs(v1[1]) + std::abs(v1[0]) > Real(1e-6)) phi1=atan2(v1[1], v1[0]);
c->SetDir(n3); geom::Vec3 n2=vec_for_angle(v2, angle+phi1);
// check if we have to update the other connectors c->SetDir(n2);
const ConnectorImplList& sc=a3->GetSecondaryConnectors(); // check if we have to update the other connectors
if (update_other && sc.size()>1) { const ConnectorImplList& sc=a3->GetSecondaryConnectors();
Real phi2=(angle-phi1)-atan2(v3[1], v3[0]); if (update_other && sc.size()>1) {
for (ConnectorImplList::const_iterator i=sc.begin(); i!=sc.end(); ++i) { Real phi2=(angle-phi1);
if (*i==c) if(std::abs(v2[1]) + std::abs(v2[0]) > Real(1e-6)) phi2-=atan2(v2[1], v2[0]);
continue; for (ConnectorImplList::const_iterator i=sc.begin(); i!=sc.end(); ++i) {
geom::Vec3 v=(*i)->GetDir(); if (*i==c)
Real phi4=phi2+atan2(v[1], v[0]); continue;
geom::Vec3 n=vec_for_angle(v, phi4); v3=(*i)->GetDir();
(*i)->SetDir(n); Real phi3=phi2;
} if(std::abs(v3[1]) + std::abs(v3[0]) > Real(1e-6)) phi3+=atan2(v3[1], v3[0]);
geom::Vec3 n=vec_for_angle(v3, phi3);
(*i)->SetDir(n);
} }
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment