home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / os2arrow.zip / arrow.c next >
Text File  |  1996-03-05  |  4KB  |  112 lines

  1. /* arrow.c -- implementation of arrowhead library functions */
  2.  
  3. #define INCL_GPIPRIMATIVES
  4. #include <os2.h>
  5.  
  6. #include <math.h>
  7.  
  8. #include "arrow.h"
  9.  
  10. static double pi = 3.14159265358;      /* what it is */
  11.  
  12. static POINTL findArrowLinePoint(LONG length, double dAngle, POINTL point)
  13. {
  14.    double dYprime, dXprime;            /* arrowhead points in cartesian coords */
  15.    POINTL rpoint;                      /* point of end of line                 */
  16.  
  17.    if (0 <= dAngle && dAngle <= pi / 2.0)
  18.       {
  19.       dYprime = point.y - length * sin(dAngle);
  20.       dXprime = point.x + length * cos(dAngle);
  21.       }
  22.    else if (pi / 2.0 < dAngle && dAngle <= pi)
  23.       {
  24.       dYprime = point.y - length * sin(pi - dAngle);
  25.       dXprime = point.x - length * cos(pi - dAngle);
  26.       }
  27.    else if (pi < dAngle && dAngle <= 3.0 / 2.0 * pi)
  28.       {
  29.       dYprime = point.y + length * sin(dAngle - pi);
  30.       dXprime = point.x - length * cos(dAngle - pi);
  31.       }
  32.    else
  33.       {
  34.       dYprime = point.y + length * sin(2.0 * pi - dAngle);
  35.       dXprime = point.x + length * cos(2.0 * pi - dAngle);
  36.       }
  37.  
  38.    rpoint.x = dXprime;
  39.    rpoint.y = dYprime;
  40.    return rpoint;
  41.  
  42. }  /* findArrowLinePoint */
  43.  
  44. /* ArrowHead
  45.    draw an arrow head from the start to the end point in the given PS */
  46. void ArrowHead(HPS hps, POINTL ptStart, POINTL ptEnd, LONG lLength, double dAngle, BOOL bFill)
  47. {
  48.    /* now draw an arrowhead at the end */
  49.    double dTheta;                      /* angle of line with x axis        */
  50.    POINTL arrow1, arrow2;              /* points of end of arrowhead lines */
  51.    double omega1, omega2;              /* angle of arrowhead lines         */
  52.    double dAngleRad = dAngle / 180.0 * pi;   /* desired angle in radians   */
  53.  
  54.    /* calculate the angle of the line */
  55.    if (ptStart.x < ptEnd.x && ptStart.y < ptEnd.y)
  56.       {
  57.       double deltaY = ptEnd.y - ptStart.y;
  58.       double deltaX = ptEnd.x - ptStart.x;
  59.       dTheta = pi - atan(deltaY / deltaX);
  60.       }
  61.    else if  (ptStart.x > ptEnd.x && ptStart.y < ptEnd.y)
  62.       {
  63.       double deltaY = ptEnd.y - ptStart.y;
  64.       double deltaX = ptStart.x - ptEnd.x;
  65.       dTheta = atan(deltaY / deltaX);
  66.       }
  67.    else if  (ptStart.x > ptEnd.x && ptStart.y > ptEnd.y)
  68.       {
  69.       double deltaY = ptStart.y - ptEnd.y;
  70.       double deltaX = ptStart.x - ptEnd.x;
  71.       dTheta = 2.0 * pi - atan(deltaY / deltaX);
  72.       }
  73.    else if  (ptStart.x < ptEnd.x && ptStart.y > ptEnd.y)
  74.       {
  75.       double deltaY = ptStart.y - ptEnd.y;
  76.       double deltaX = ptEnd.x - ptStart.x;
  77.       dTheta = pi + atan(deltaY / deltaX);
  78.       }
  79.    else if (ptStart.x > ptEnd.x && ptStart.y == ptEnd.y)
  80.       dTheta = 0;
  81.    else if (ptStart.x < ptEnd.x && ptStart.y == ptEnd.y)
  82.       dTheta = pi;
  83.    else if (ptStart.y < ptEnd.y && ptStart.x == ptEnd.x)
  84.       dTheta = pi / 2.0;
  85.    else if (ptStart.y > ptEnd.y && ptStart.x == ptEnd.x)
  86.       dTheta = 3.0 * pi / 2.0;
  87.  
  88.    /* now calculate the two arrowhead angles */
  89.    omega1 = dTheta - dAngleRad;
  90.    omega2 = dTheta + dAngleRad;
  91.  
  92.    /* make sure values are between 0 and 2 pi */
  93.    if (omega1 < 0)
  94.       omega1 = omega1 + 2.0 * pi;
  95.    if (omega2 > 2.0 * pi)
  96.       omega2 = omega2 - 2.0 * pi;
  97.  
  98.    arrow1 = findArrowLinePoint(lLength, omega1, ptEnd);
  99.    arrow2 = findArrowLinePoint(lLength, omega2, ptEnd);
  100.  
  101.    if (bFill)
  102.       GpiBeginArea(hps, 0UL);
  103.  
  104.    GpiMove(hps, &arrow1);
  105.    GpiLine(hps, &ptEnd);
  106.    GpiLine(hps, &arrow2);
  107.  
  108.    if (bFill)
  109.       GpiEndArea(hps);
  110.  
  111. }  /* ArrowHead */
  112.