幾何計算 ライブラリ・リファレンス
***********************************************************************
* 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;
}