[cairo] Shouldn't Cairo use/offer degrees rather than radians?

Bill Spitzak spitzak at gmail.com
Fri Jun 30 22:59:02 UTC 2017


On Fri, Jun 30, 2017 at 1:44 PM, David Kastrup <dak at gnu.org> wrote:

> I am not calling any atan2d.

Your code copied and pasted from the previous email. If this is not
your code please explain where the code you want to use is:

Real
Offset::angle_degrees () const
{
  Real x = coordinate_a_ [X_AXIS];
  Real y = coordinate_a_ [Y_AXIS];

  // We keep in the vicinity of multiples of 45 degrees here: this is
  // where straightforward angles for straightforward angular
  // relations are most expected.  The factors of 2 employed in the
  // comparison are not really perfect for that: sqrt(2)+1 would be
  // the factor giving exact windows of 45 degrees rather than what we
  // have here.  It's just that 2 is likely to generate nicer code
  // than 2.4 and the exact handover does not really matter.
  //
  // Comparisons here are chosen appropriately to let infinities end
  // up in their "exact" branch.  As opposed to the normal atan2
  // function behavior, this makes "competing" infinities result in
  // NAN angles.
  if (y < 0.0)
    {
      if (2*x < -y)
        if (-x > -2*y)          // x < 0, y < 0, |x| > |2y|
          return -180 + atan2d (-y, -x);
        else if (-2*x >= -y)    // x < 0, y < 0, |y| < |2x| <= |4y|
          return -135 + atan2d (x - y, -y - x);
        else                    // y < 0, |y| >= |2x|
          return -90 + atan2d (x, -y);
      else if (x <= -2*y)       // x > 0, y < 0, |y| <= |2x| < |4y|
        return -45 + atan2d (x + y, x - y);
      // Drop through for y < 0, x > |2y|
    }
  else if (y > 0.0)
    {
      if (2*x < y)
        if (-x > 2*y)           // x < 0, y >= 0, |x| > |2y|
          return 180 - atan2d (y, -x);
        else if (-2*x >= y)     // x < 0, y >= 0, |y| < |2x| <= |4y|
          return 135 - atan2d (x + y, y - x);
        else                    // y >= 0, |y| >= |2x|
          return 90 - atan2d (x, y);
      else if (x <= 2*y)        // x >= 0, y >= 0, |y| < |2x| < |4y|
        return 45 - atan2d (x - y, x + y);
      // Drop through for y > 0, x > |2y|
    }
  else
    // we return 0 for (0,0).  NAN would be an option but is a
    // nuisance for getting back to rectangular coordinates.  Strictly
    // speaking, this argument would be just as valid for (+inf.0,
    // +inf.0), but then infinities are already an indication of a
    // problem in LilyPond.
    return (x < 0.0) ? 180 : 0;
  return atan2d (y, x);
}


More information about the cairo mailing list