// Return the longitude of v in [0,360).
real longitude(triple v, bool warn=true)
{
if(!warn && v.getx() == 0.0 && v.gety() == 0.0) return 0.0;
return principalBranch(degrees(v.azimuth()));
}
triple unit(triple v)
{
return unit(v);
}
real dot(triple u, triple v)
{
return dot(u,v);
}
triple cross(triple u, triple v)
{
return cross(u,v);
}
triple dir(explicit triple z)
{
return unit(z);
}
triple expi(real polar, real azimuth)
{
return expi(polar,azimuth);
}
triple dir(real colatitude, real longitude)
{
return expi(radians(colatitude),radians(longitude));
}
triple realmult(triple u, triple v)
{
return triple (u.getx()*v.getx(),u.gety()*v.gety(),u.getz()*v.getz());
}
// Return the component of vector v perpendicular to a unit vector u.
triple perp(triple v, triple u)
{
return perp(v,u);
}
triple bezier(triple a, triple b, triple c, triple d, real t)
{
real onemt=1-t;
real onemt2=onemt*onemt;
return onemt2*onemt*a+t*(3.0*(onemt2*b+t*onemt*c)+t*t*d);
}
triple bezierP(triple a, triple b, triple c, triple d, real t)
{
return 3.0*(t*t*(d-a+3.0*(b-c))+t*(2.0*(a+c)-4.0*b)+b-a);
}
triple bezierPP(triple a, triple b, triple c, triple d, real t)
{
return 6.0*(t*(d-a+3.0*(b-c))+a+c)-12.0*b;
}