#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
typedef struct{
double x; /** x座標 **/
double y; /** y座標 **/
} orth_coord_t;
typedef struct {
double r; /** 動径 **/
double theta; /** 偏角 **/
} pole_coord_t;
double drand(void);
pole_coord_t conv_polar(orth_coord_t *o);
orth_coord_t conv_ortho(pole_coord_t *p);
int main(void)
{
int i;
orth_coord_t o;
pole_coord_t p;
srand((unsigned)time(NULL));
for (i = 0; i < 10; i++) {
o.x = drand() * ((rand() > (int)RAND_MAX / 2) ? 1.0 : -1.0);
o.y = drand() * ((rand() > (int)RAND_MAX / 2) ? 1.0 : -1.0);
printf("x = %f, y = %f\n", o.x, o.y);
p = conv_polar(&o);
printf("r = %f, θ = %f\n", p.r, p.theta);
o = conv_ortho(&p);
printf("x = %f, y = %f\n\n", o.x, o.y);
}
return 0;
}
/* 0より大きい1未満の乱数 */
double drand(void)
{
return (double)rand() + 1.0 / ((double)RAND_MAX + 2.0);
}
pole_coord_t conv_polar(orth_coord_t *o)
{
pole_coord_t p;
p.r = sqrt(o->x * o->x + o->y * o->y);
p.theta = atan(o->y / o->x);
/* 第2象限と第3象限にある場合 */
if (p.theta > M_PI / 2.0 && p.theta < M_PI * 1.5)
p.theta = -p.theta;
return p;
}
orth_coord_t conv_ortho(pole_coord_t *p)
{
orth_coord_t o;
o.x = p->r * cos(p->theta);
o.y = p->r * sin(p->theta);
return o;
}