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