25#include <simgear/structure/SGSharedPtr.hxx>
26#include <simgear/math/SGVec3.hxx>
30 const SGVec3d& n3,
const SGVec3d& n4)
32 p1 = 0.75*n2 + 0.25*n1;
33 p2 = 0.75*n3 + 0.25*n4;
34 normal = normalize(cross(n3 - n1, n2 - n4));
35 collocationPt = 0.375*(n1 + n4) + 0.125*(n2 + n3);
38SGVec3d AeroElement::vortexInducedVel(
const SGVec3d&
p,
const SGVec3d& n1,
39 const SGVec3d& n2)
const
41 SGVec3d r0 = n2-n1, r1 =
p-n1, r2 =
p-n2;
42 SGVec3d v = cross(r1, r2);
43 double vSqrNorm = dot(v, v);
44 double r1SqrNorm = dot(r1, r1);
45 double r2SqrNorm = dot(r2, r2);
47 if ((vSqrNorm < 1E-6) || (r1SqrNorm < 1E-6) || (r2SqrNorm < 1E-6))
48 return SGVec3d::zeros();
50 r1 /= sqrt(r1SqrNorm);
51 r2 /= sqrt(r2SqrNorm);
52 v *= dot(r0, r1-r2) / (4.0*
M_PI*vSqrNorm);
57SGVec3d AeroElement::semiInfVortexInducedVel(
const SGVec3d& point,
59 const SGVec3d& vDir)
const
61 SGVec3d r = point-vEnd;
62 double rSqrNorm = dot(r, r);
63 double denom = rSqrNorm - dot(r, vDir)*sqrt(rSqrNorm);
65 if (fabs(denom) < 1E-6)
66 return SGVec3d::zeros();
68 SGVec3d v = cross(r, vDir);
76 const SGVec3d w(-1.,0.,0.);
77 SGVec3d v = semiInfVortexInducedVel(
p, p1, w);
78 v -= semiInfVortexInducedVel(
p, p2, w);
79 v += vortexInducedVel(
p, p1, p2);
AeroElement(const SGVec3d &n1, const SGVec3d &n2, const SGVec3d &n3, const SGVec3d &n4)
SGVec3d getInducedVelocity(const SGVec3d &p) const