[ create a new paste ] login | about

Link: http://codepad.org/8utMzpyL    [ raw code | fork ]

C, pasted on Dec 28:
#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;
}


Create a new paste based on this one


Comments: