|
[ 簡単な説明 ] グラフィックス・ユーティリティというほど大袈裟なものではありませんが、2次元及び3次元の直交座標系の平行移動、回転移動および座標系相互変換ルーチンを揃えました。 また、角度の単位として[deg] を使用しているので、[rad] 系との変換ルーチンも準備しました。 なお、座標系は右手系です。(X,Y,Z軸の関係がそれぞれ右手の親指、人差し指、中指の関係になります。) |
| 関数名 | 関数の機能 | 呼び出し例 | ||
| dtor( ) | 角度変換 | 度→ラジアン | dtor(deg, &rad); | |
| rtod( ) | ラジアン→度 | trod(rad, °); | ||
| dtop2( ) | 2次元 | 座標変換 | デカルト座標→極座標 | dtop2(x, y, &r, &t); |
| ptod2( ) | 極座標→デカルト座標 | ptod2(r, t, &x, &y); | ||
| dmov2( ) | 平行移動 | デカルト座標 | dmov2(xo, yo, dx, dy, &x, &y); | |
| pmov2( ) | 極座標 | pmov2(ro, to, dx, dy, &r, &t); | ||
| drot2( ) | 回転移動 | デカルト座標 | drot2(xo, yo, dt, &x, &y); | |
| prot2( ) | 極座標 | prot2(ro, to, dt, &r, &t); | ||
| dtoc3( ) | 3次元 | 座標変換 | デカルト座標→円柱座標 | droc3(x, y, z, &r, &t, &z); |
| ctod3( ) | 円柱座標→デカルト座標 | ctod3(r, t, z, &x, &y, &z); | ||
| dtop3( ) | デカルト座標→極座標 | dtop3(x, y, z, &r, &t, &p); | ||
| ptod3( ) | 極座標→デカルト座標 | ptod3(r, t, p, &x, &y, &z); | ||
| ptoc3( ) | 極座標→円柱座標 | proc3(r, t, p, &cr, &ct, &cz); | ||
| ctop3( ) | 円柱座標→極座標 | ctop3(cr, ct, cz, &r, &t, &p); | ||
| dpmov3( ) | 平行移動 | デカルト座標 | dpmov3(xo, yo, zo, dx, dy, dz, &x, &y, &z); | |
| cpmov3( ) | 円柱座標 | cpmov3(ro, to, zo, dx, dy, dz, &r, &t, &z); | ||
| ppmov3( ) | 極座標 | ppmov3(ro, to, po, dx, dy, dz, &r, &t, &p) | ||
| drot3( ) | 回転移動 | デカルト座標 | drot3(xo, yo, zo, phai, thet, psai, &x, &y, &z); | |
| crot3( ) | 円柱座標 | crot3(ro, to, zo, phai, thet, psai, &r, &t, &z); | ||
| prot3( ) | 極座標 | prot3(ro, to, po, phai, thet, psai, &r, &t, &p); | ||
/* axis.c */
#include "sslib.h"
/* Degree to Radian Transformation */
int dtor(double deg, double *rad)
{
static double dtrsr = 1.7463292519943296e-2;
*rad = deg * dtrsr;
return 0;
}
/* Radian to Degree Transformation */
int rtod(double rad, double *deg)
{
static double rtrsd = 57.29577951308232;
*deg = rad * rtrsd;
return 0;
}
/* Cartesian to Polar Transformation */
int dtop2(double xo, double yo, double *r, double *t)
{
static double rtod = 57.29577951308232;
*r = sqrt(xo * xo + yo * yo);
if(xo != 0.0) *t = atan2(yo, xo) * rtod;
else
{
if(yo < 0.0) *t = - 90.0;
else if(yo > 0.0) *t = 90.0;
else *t = 0.0;
}
return 0;
}
/* Polar to Cartesian Transformation */
int ptod2(double r, double t, double *x, double *y)
{
double tr;
static double dtor = 1.7453292519943296e-2;
tr = t * dtor;
*x = r * cos(tr);
*y = r * sin(tr);
return 0;
}
/* Parallel move (Cartesian coordinate) */
int dmov2(double xo, double yo, double xm, double ym, double *x, double *y)
{
*x = xo + xm;
*y = yo + ym;
return 0;
}
/* Parallel move (Polar coordinate) */
int pmov2(double ro, double to, double xm, double ym, double *r, double *t)
{
double dx, dy, ddx, ddy;
ptod2(ro, to, &dx, &dy);
dmov2(dx, dy, xm, ym, &ddx, &ddy);
dtop2(ddx, ddy, r, t);
return 0;
}
/* Rotation (Cartesian coordinate) */
int drot2(double xo, double yo, double t, double *x, double *y)
{
double r, thet, to;
static double dtor = 1.7453292519943296e-2;
dtop2(xo, yo, &r, &thet);
to = (t + thet) * dtor;
*x = r * cos(to);
*y = r * sin(to);
return 0;
}
/* Rotation (Polar coordinate) */
int prot2(double ro, double to, double trot, double *r, double *t)
{
*t = to + trot;
*r = ro;
return 0;
}
/* Cartesian to Cylindorical ( 3-dimansion ) */
int dtoc3(double dx, double dy, double dz, double *cr, double *ct, double *cz)
{
dtop2(dx, dy, cr, ct);
*cz = dz;
return 0;
}
/* Cylindorical to Cartesian ( 3-dimansion ) */
int ctod3(double cr, double ct, double cz, double *dx, double *dy, double *dz)
{
ptod2(cr, ct, dx, dy);
*dz = cz;
return 0;
}
/* Cartesian to Polar ( 3-dimension ) */
int dtop3(double dx, double dy, double dz, double *pr, double *pe, double *pp)
{
double w;
static double rtod = 57.295779513082321;
*pr = sqrt(dx * dx + dy * dy + dz * dz);
if(dx != 0.0) *pe = atan2(dy, dx) * rtod;
else
{
if(dy < 0.0) *pe = -90.0;
else if(dy > 0.0) *pe = 90.0;
else *pe = 0.0;
}
w = dx * dx + dy * dy;
if(dz != 0.0) *pp = atan2(sqrt(w), dz) * rtod;
else
{
if(w < 0.0) *pp = -90.0;
else if(w > 0.0) *pp = 90.0;
else *pp = 0.0;
}
return 0;
}
/* Polar to Cartesian ( 3-dimension ) */
int ptod3(double pr, double pe, double pp, double *dx, double *dy, double *dz)
{
double rpe, rpp;
static double dtor = 1.74532925199432958e-2;
rpe = dtor * pe;
rpp = dtor * pp;
*dx = pr * sin(rpp) * cos(rpe);
*dy = pr * sin(rpp) * sin(rpe);
*dz = pr * cos(rpp);
return 0;
}
/* Exchange Coordinate ( 3-dimension ) */
int ptoc3(double pr, double pe, double pp, double *cr, double *ct, double *cz)
{
double rcp;
static double dtor = 1.74532925199432958e-2;
rcp = dtor * pp;
*cr = pr * sin(rcp);
*ct = pe;
*cz = pr * cos(rcp);
return 0;
}
/* Exchange Coordinate ( 3-dimension ) */
int ctop3(double cr, double ct, double cz, double *pr, double *pe, double *pp)
{
static double rtod = 57.29577951308232088;
*pr = sqrt(cr * cr + cz * cz);
*pe = ct;
if(cz != 0) *pp = atan2(cr, cz) * rtod;
else
{
if(cr < 0.0) *pp = -90.0;
else if(cr > 0.0) *pp = 90.0;
else *pp = 0.0;
}
return 0;
}
/* Cartesian coordinate */
int dpmov3(double xo, double yo, double zo, double dx, double dy, double dz,
double *x, double *y, double *z)
{
*x = xo + dx;
*y = yo + dy;
*z = zo + dz;
return 0;
}
/* Cylindorical coordinate */
int cpmov3(double cro, double cto, double czo, double dx, double dy, double dz,
double *cr, double *ct, double *cz)
{
double dxo, dyo, dzo, x, y, z;
ctod3(cro, cto, czo, &dxo, &dyo, &dzo);
dpmov3(dxo, dyo, dzo, dx, dy, dz, &x, &y, &z);
dtoc3(x, y, z, cr, ct, cz);
return 0;
}
/* Polar coordinate */
int ppmov3(double pro, double peo, double ppo, double dx, double dy, double dz,
double *pr, double *pe, double *pp)
{
double dxo, dyo, dzo, x, y, z;
ptod3(pro, peo, ppo, &dxo, &dyo, &dzo);
dpmov3(dxo, dyo, dzo, dx, dy, dz, &x, &y, &z);
dtop3(x, y, z, pr, pe, pp);
return 0;
}
/* Rotate Move in 3-Dimensional Coordinate ( Cartesian Coordinate ) */
int drot3(double dxo, double dyo, double dzo, double phai, double thet,
double psai, double *dx, double *dy, double *dz)
{
double rph, rth, rps, cph, sph, cth, sth, cps, sps;
static double dtor = 1.74532925199432958e-2;
rph = dtor * phai;
rth = dtor * thet;
rps = dtor * psai;
cph = cos(rph);
sph = sin(rph);
cth = cos(rth);
sth = sin(rth);
cps = cos(rps);
sps = sin(rps);
*dx = (cph * cps - sph * cth * sps) * dxo
+ (sph * cps + cph * cth * sps) * dyo
+ sth * sps * dzo;
*dy = (-cph * sps - sph * cth * cps) * dxo
+ (-sph * sps + cph * cth * cps) * dyo
+ sth * cps * dzo;
*dz = sth * sph * dxo - sth * cph * dyo + cth * dzo;
return 0;
}
/* Rotate Move in 3-Dimensional Coordinate ( Cylindorical Coordinate ) */
int crot3(double cro, double cto, double czo, double phai, double thet,
double psai, double *cr, double *ct, double *cz)
{
double dx, dy, dz, rdx, rdy, rdz;
ctod3(cro, cto, czo, &dx, &dy, &dz);
drot3(dx, dy, dz, phai, thet, psai, &rdx, &rdy, &rdz);
dtoc3(rdx, rdy, rdz, cr, ct, cz);
return 0;
}
/* Rotate Move in 3-Dimensional Coordinate ( Polar Coordinate ) */
int prot3(double pro, double peo, double ppo, double phai, double thet,
double psai, double *pr, double *pe, double *pp)
{
double dx, dy, dz, rdx, rdy, rdz;
ptod3(pro, peo, ppo, &dx, &dy, &dz);
drot3(dx, dy, dz, phai, thet, psai, &rdx, &rdy, &rdz);
dtop3(rdx, rdy, rdz, pr, pe, pp);
return 0;
}
|