幾何計算 ライブラリ・リファレンス


***********************************************************************
*      Computational  Geometry  for  Design  and  Manufacture         *
*      All  calculations  are  done  in  double  precision.           *
*                                                                     *
*           Ver 1.10a    Copyright(C) 1990, Kenji Shibata             *
*                                                                     *
***********************************************************************

関数名  lnprm
機能    直線の方程式の計算
形式    int lnprm( double *pt1, double *pt2,  
                    double a, double b, double c )
解説    指定された 2点  (pt1[1],  pt1[2])  と  (pt2[1],  pt2[2])  を通る
        直線の方程式(ax  +  by  +  c  =  0)の係数(a,  b,  c)を求めます。
戻り値  lnprmは、成功すると0、失敗すると-1を返します。
移植性  UNIXシステムで使用でき、ANSI Cと互換性があります。
例      #include  
        #include  
/*    TO SET UP AN EQUATION OF LINE AND CALCULATE THE COEFFICIENTS
              (  ax  +  by  +  c  =  0  )
*/
        int  main()
        {
        double    pt1[2],  pt2[2],  a,  b,  c;

            pt1[0] =  49.625;
            pt1[1] =  57.750;
            pt2[0] =  77.625;
            pt2[1] =  82.250;

        if(lnprm(pt1,  pt2,  &a,  &b,  &c)){  /*  2点は一致する。 */
            printf("Error  ...  cannot  define  a  line\n");
            exit(1);
        }
        
        printf(" a  =  %10.6f,  b  =  %10.6f,  c  =  %10.6f\n", a, b, c);
        return  0;
        }


関数名  lnln
機能    二直線の交点の計算
形式    int lnln( double (*pxy1)[2], double (*pxy2)[2], int *xy )
解説    直線  (pxy1[0][0], pxy1[0][1] - pxy1[1][0], pxy1[1][1])  と  直線
        (pxy1[0][0], pxy1[0][1] - pxy1[1][0], pxy1[1][1])  の交点  (xy[0],
        xy[1])  を計算します。
戻り値  lnlnは、成功すると0、交点が存在しないと-1を返します。
移植性  UNIXシステムで使用でき、ANSI Cと互換性があります。
例      /*
            INTERSECTING  POINT  OF  LINES
        */
        #include  
        #include  
        int  main()
        {
        double    pxy1[2][2],  pxy2[2][2],  xy[2];
        
            pxy1[0][0] =  49.625;
            pxy1[0][1] =  57.750;
            pxy1[1][0] =  77.625;
            pxy1[1][1] =  82.250;
            pxy2[0][0] =  65.875;
            pxy2[0][1] =  81.750;
            pxy2[1][0] = 110.125;
            pxy2[1][1] =  61.500;

        if(lnln(  pxy1,  pxy2,  xy  )){
            printf("Error  ....  交点は、存在しない。\n");
            exit(1);
        }
        
        printf("  x  =  %10.6f,  y  =  %10.6f\n",  xy[0],  xy[1]);
        return  0;
        }


関数名  lncl
機能    円と直線の交点の計算
形式    int lncl(  double  *pt1,  double  *pt2,  double  *xyr,
                                         double  *pnear,  double  *xy)
解説    中心座標と半径  (xyr[0],  xyr[1],  xyr[2])  で定義される円と、指
        定された 2点  (pt1[1],  pt1[2])  と  (pt2[1],  pt2[2])  を通る直
        線との交点  (xy[0],  xy[1]) を計算します。交点が 2つ存在するとき
        は指定した点  (pnear[0],  pnear[1]) に近い方の交点が選択されます。
戻り値  lnclは、成功すると交点の数、交点が存在しないと-1を返します。
移植性  UNIXシステムで使用でき、ANSI Cと互換性があります。
例      /*
            INTERSECTING  POINTS  OF  LINE  AND CIRCLE
        */
        #include  
        #include  
                                
        int  main()
        {
        double    pt1[2],  pt2[2],  xyr[3],  xy[2],  pnear[2];

            pt1[0] = 175.5;
            pt1[1] =  79.0;
            pt2[0] = 198.75;
            pt2[1] =  53.75;
            
            xyr[0] = 218.551;
            xyr[1] =  51.6982;
            xyr[2] =  25.4482;

            pnear[0] = 190.0;
            pnear[1] =  58.0;

        if(lncl(  pt1,  pt2,  xyr,  pnear,  xy)  <  0){
            printf("Error  ....  交点は、存在しない。\n");
            exit(1);
        }  /*  end  if  */
        
        printf("  x  =  %10.6f,  y  =  %10.6f\n",  xy[0],  xy[1]);
        return  0;
        }


関数名  clcl
機能    二つの円の交点の計算
形式    int clcl( double *xyr1, double *xyr2, double *pnear, double *xy )
解説    中心座標と半径で定義される 2つの円 (xyr1[0], xyr1[1], xyr1[2])と
        (xyr2[0], xyr2[1], xyr2[2]) の交点 (xy[0], xy[1]) を計算します。
        交点が 2つ存在するときは指定した点 (pnear[0], pnear[1])に近い方の
        交点が選択されます。
戻り値  clclは、成功すると交点の数、交点が存在しないと-1を返します。
移植性  UNIXシステムで使用でき、ANSI Cと互換性があります。
        /*
            INTERSECTING  POINTS  OF  TWO CIRCLES
        */
        #include  
        #include  

        int  main()
        {
        double    xyr1[3],  xyr2[3],  xy[2],  pnear[2];

            xyr1[0] = 120.75;
            xyr1[1] =   9.0;
            xyr1[2] =  10.0;

            xyr2[0] = 143.25;
            xyr2[1] =  15.0;
            xyr2[2] =  20.0;

            pnear[0] = 120.0;
            pnear[1] =  18.0;

        if(  clcl(  xyr1,  xyr2,  pnear,  xy)  <  0){
            printf("Error  ....  交点は、存在しない。\n");
            exit(1);
        }  /*  end  if  */
        
        printf("\n     2つの円の交点\n");
        printf("    x1  =  %10.6f,    y1  =  %10.6f\n",  xy[0],  xy[1]);
        return  0;
        }


関数名  lnoff
機能    直線(線分)のオフセット
形式    int  lnoff(  double  *pt1,  double  *pt2,  double  off,  
                              int  dir,  double  *xy1,  double  *XY2  )
解説    指定された 2点  (pt1[0],  pt1[1])  と  (pt2[0],  pt2[1])  を結ぶ線分
        を、相対距離  (off)  だけ  (dir)  で示される方向にオフセットします。
        (dir)  には、オフセットの方向が直線のベクトルにそって左側の時には
        (+1)、右側のときには  (-1)  をセットします。
戻り値  lnoffは、成功すると0、失敗すると-1を返します。
移植性  UNIXシステムで使用でき、ANSI Cと互換性があります。
例      /*
           CREATING  A  SEGMENT  PARALLE  TO  A  REFERENCE  SEGMENT
        */
        #include  
        #include  
        int  main()
        {
        double    pt1[2],  pt2[2],  off,  xy1[2],  xy2[2];

            pt1[0] = 33.125;
            pt1[1] = -1.25;
            pt2[0] = 87.375;
            pt2[1] = 31.75;
            off = 10.0;

        if(lnoff(  pt1,  pt2,  off,  1,  xy1,  xy2  )){
            printf("Error  ....  直線が定義できない。\n");
            exit(1);
        }  /*  end  if  */

        printf("\n    LINE  OFFSET\n");
        printf("  x1  =  %10.6f,  y1  =  %10.6f\n",  xy1[0],  xy1[1]);
        printf("  x2  =  %10.6f,  y2  =  %10.6f\n",  xy2[0],  xy2[1]);

        if(lnoff(  pt1,  pt2,  off,  -1,  xy1,  xy2  )){
            printf("Error  ....  直線が定義できない。\n");
            exit(1);
        }  /*  end  if  */
        
        printf("  x3  =  %10.6f,  y3  =  %10.6f\n",  xy1[0],  xy1[1]);
        printf("  x4  =  %10.6f,  y4  =  %10.6f\n",  xy2[0],  xy2[1]);
        return  0;
        }


関数名  arcoff
機能    円弧のオフセット
形式    int arcoff(  double  *pt1,  double  *pt2,  double  *xyr,  double  off,
                                 int  dir,  double  *ofxy1,  double  *ofxy2  )
解説    与えられた距離  (off)  だけオフセットした円弧の、あらたな始点
        (ofxy1[0],  ofxy1[1])と終点  (ofxy2[0],  ofxy2[1])  とを計算します。
        円弧の中心は、(xyr[0],  xyr[1])、半径は、(xyr[2])として与えられます。
        始点  (pt1[0],  pt1[1])  と終点  (pt2[0],  pt2[1])  は、反時計 回りに
        セットします。円弧を外側にオフセットする場合は、(dir) に (+1)、内側に
        オフセットする場合は、(-1)  を与えます。
戻り値  arcoffは、成功すると0、失敗すると-1を返します。
移植性  UNIXシステムで使用でき、ANSI Cと互換性があります。
例      /*
           CREATING  A CONCENTRIC  ARC
        */
        #include  
        #include  

        int  main()
        {
        double    xyr[3],  pt1[2],  pt2[2],  off,  ofxy1[2],  ofxy2[2];
        int    dir;

            pt1[0] = 157.25;
            pt1[1] =  75.25;
            pt2[0] = 128.5;
            pt2[1] =  52.0;
            xyr[0] = 146.253;
            xyr[1] =  59.4478;
            xyr[2] =  14.2521;
            off = 10;
            dir = 1;      /*  外側にオフセット  */

        if(arcoff(  pt1,  pt2,  xyr,  off,  dir,  ofxy1,  ofxy2  )){
            printf("Error  ...  円弧は定義できない。\n");
            exit(1);
        }    /*  end  if  */

        printf("\n    円弧のオフセット\n");
        printf("  x1  =  %10.6f,  y1  =  %10.6f\n", ofxy1[0],  ofxy1[1]);
        printf("  x2  =  %10.6f,  y2  =  %10.6f\n", ofxy2[0],  ofxy2[1]);

        dir = -1;      /*  内側にオフセット  */

        if(arcoff(  pt1,  pt2,  xyr,  off,  dir,  ofxy1,  ofxy2  )){
            printf("Error  ...  円弧は定義できない。\n");
            exit(1);
        }    /*  end  if  */

        printf("  x1  =  %10.6f,  y1  =  %10.6f\n", ofxy1[0],  ofxy1[1]);
        printf("  x2  =  %10.6f,  y2  =  %10.6f\n", ofxy2[0],  ofxy2[1]);

        return  0;
        }


関数名  defcir
機能    三角形の外接円の中心と半径の計算
形式    int  defcir(  double  (*xy)[2],  double  *xyr)
解説    (xy[0][0],  xy[0][1])、(xy[1][0],  xy[1][1])、(xy[2][0],  xy[2][1])
        の3点を頂点に持つ三角形の外接円の中心  (xyr[0], xyr[1])と、半径
        (xyr[2]) を計算します。
戻り値  defcirは、成功すると0、失敗すると-1を返します。
移植性  UNIXシステムで使用でき、ANSI Cと互換性があります。
例      /*
           CREATING  A CIRCLE  PASSING  THROUGH  THREE  POINTS
        */
        #include  
        #include  
                                
        int  main()
        {
        double    xy[3][2],  xyr[3];

            xy[0][0] = 224.25;       /*  x1  */
            xy[0][1] =  76.5;        /*  y1  */

            xy[1][0] = 194.11;       /*  x2  */
            xy[1][1] =  58.7887;     /*  y2  */

            xy[2][0] = 194.0;        /*  x3  */
            xy[2][1] =  45.0;        /*  y3  */
            
        if(defcir(  xy,  xyr)){
            printf("Error  ...  円は定義できない。\n");
            exit(1);
        }    /*  end  if  */
        
        printf("\n    円の3点定義\n");
        printf("x = %10.6f, y = %10.6f, r = %10.6f\n", xyr[0], xyr[1], xyr[2]);

        return  0;
        }