Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TRP105F_Spline by
CubicSpline.c
- Committer:
- aktk
- Date:
- 2016-05-26
- Revision:
- 8:e7d451bb4fd4
- Parent:
- 7:e032ddec6ed5
File content as of revision 8:e7d451bb4fd4:
#define DEBUG
#include "CubicSpline.h"
// To get voltage of TRP105F
AnalogIn g_Sensor_Voltage(p16);
// To get sample distance via seral com
Serial g_Serial_Signal(USBTX, USBRX);
LocalFileSystem local("local"); // マウントポイントを定義(ディレクトリパスになる)
// for debug
#ifdef DEBUG
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
#endif
CubicSpline2d::CubicSpline2d()
:_Data_Input_Type(SYSTEM)
{
_Sample_Num = 5;
_Sample_Set = (Vxyt *)malloc(_Sample_Num * sizeof(Vxyt));
_Last_Point = (Vxyt) {
0,0,0
};
for(int i = 0; i < _4; i++) {
_C_x[i]= (double*)malloc((_Sample_Num - 1)* sizeof(double));;
_C_y[i]= (double*)malloc((_Sample_Num - 1)* sizeof(double));;
}
//calibrateSensor();
}
CubicSpline2d::CubicSpline2d(
unsigned int arg_num
)
:_Data_Input_Type(SYSTEM)
{
_Sample_Num = arg_num;
_Sample_Set = (Vxyt *)malloc(_Sample_Num * sizeof(Vxyt));
_Last_Point = (Vxyt) {
0,0,0
};
for(int i = 0; i < 4; i++) {
_C_x[i]= (double*)malloc((_Sample_Num - 1)* sizeof(double));;
_C_y[i]= (double*)malloc((_Sample_Num - 1)* sizeof(double));;
}
//calibrateSensor();
}
CubicSpline2d::CubicSpline2d(
unsigned int arg_num,
UseType arg_useType
)
:_useType(arg_useType)
{
_Sample_Num = arg_num;
_Sample_Set = (Vxyt *)malloc(_Sample_Num * sizeof(Vxyt));
_Last_Point = (Vxyt) {
0,0,0
};
for(int i = 0; i < 4; i++) {
_C_x[i]= (double*)malloc((_Sample_Num - 1)* sizeof(double));;
_C_y[i]= (double*)malloc((_Sample_Num - 1)* sizeof(double));;
}
//calibrateSensor();
}
CubicSpline2d::~CubicSpline2d()
{
free(_Sample_Set);
//free(_u_param);
for(int i = 0; i < 4; i++) {
free(_C_x[i]);
free(_C_y[i]);
}
}
void CubicSpline2d::_sampleData()
{
int tmp;
char sig;
Vxyt tmp_set;
// For evry set,
// 1, get dst data via serai com,
// 2, get vol data,
// and then do same for next index set.
for(int i = 0; i < _Sample_Num; i++) {
if(_useType == AsDebug) {
//
// Recieve a Distance datus and store it into member
//
g_Serial_Signal.printf("X:");
_Sample_Set[i].x = 0;
do {
sig = g_Serial_Signal.getc();
if('0' <= sig && sig <= '9') {
_Sample_Set[i].x = 10 * _Sample_Set[i].x + sig - 48;
g_Serial_Signal.putc(char(sig));
} else if(sig == 0x08) {
_Sample_Set[i].x = 0;
g_Serial_Signal.printf("[canseled!]");
g_Serial_Signal.putc('\n');
g_Serial_Signal.putc('>');
}
} while (!(sig == 0x0a || sig == 0x0d));
g_Serial_Signal.putc('\n');
//
// Recieve a Voltage datus and store it into member
//
// LOW PASS FILTERED
// Get 10 data and store mean as a sample.
// After get one original sample, system waits for 0.1 sec,
// thus it takes 1 sec evry sampling.
_Sample_Set[i].y = 0;
for(int j = 0; j < 10; j++) {
tmp_set.y = g_Sensor_Voltage.read();
#ifdef DEBUG
g_Serial_Signal.printf("%d,",tmp_set.y);
#endif
_Sample_Set[i].y += (tmp_set.y / 10);
wait(0.1);
}
#ifdef DEBUG
g_Serial_Signal.printf("(%d)\n",_Sample_Set[i].y);
#endif
}
// if the input data is over the bound, it is calibrated
if (_Sample_Set[i].x < 0)
_Sample_Set[i].x = 0;
}
//
// Sort set data array in x-Ascending order
//
tmp = 0;
for( int i = 0 ; i < _Sumple_Num; i++) {
for(int j = _Sample_Num - 1; j < i+1 ; j++) {
// use dst as index for dst range [2,20]
if (_Sample_Set[i].x > _Sample_set[j].x) {
tmp_set.x = _Sample_Set[i].x;
tmp_set.y = _Sample_Set[i].y;
_Sample_Set[i].x = _Sample_Set[j].x;
_Sample_Set[i].y = _Sample_Set[j].y;
_Sample_Set[j].x = tmp_set.x;
_Sample_Set[j].y = tmp_set.y;
}
// if a same dst has been input, calcurate mean.
else if (_Sample_Set[i].x == _Sample_set[j]) {
tmp_set.y = (_Sample_Set[i].y + _Sample_Set[j].y)/2;
_Sample_Set[i] = _Sample_Set[j] = tmp_set.y;
tmp++;
}
}
}
#ifdef DEBUG
g_Serial_Signal.printf(" _Sample_num: %d\n", _Sample_Num );
g_Serial_Signal.printf("-) tmp: %d\n", tmp );
#endif
// substruct tmp from number of sample.
_Sample_Num -= tmp;
#ifdef DEBUG
g_Serial_Signal.printf("-----------------\n");
g_Serial_Signal.printf(" _Sample_num: %d\n", _Sample_Num );
#endif
// generate t which is parameter related to x,y
_Sample_Set[i].t = 0;
for(int i = 1; i < _Sample_Num; i++)
_Sample_Set[i].t =
_Sample_Set[i-1].t
+ sqrt(pow(_Sample_Set[i].x - _Sample_Set[i-1].x, 2)
+pow(_Sample_Set[i].y - _Sample_Set[i-1].y, 2));
}
#define VERSION_C
//
// Function to define _u_spline, specific constants of spline.
//
void CubicSpline2d::_makeModel(double* arg_t, double* arg_ft, double* arg_C[4], const unsigned int arg_num)
{
// arg_t : t; The variable of f(t)
// arg_ft: f(t); The cubic poliminal in Interval-j.
// arg_C[i]: Ci; The coefficient of t^i of f(t) that defines Spline Model Poliminal f(t).
// arg_num: j in [0,_Sample_Num-1]; The number of interval.
// f(t)j = C3j*t^3 + C2j*t^2 + C1j*t + C0j
//
// N: max of index <=> (_Sample_Num - 1)
//
// u[i] === d^2/dx^2(Spline f)[i]
// i:[0,N]
// u[0] = u[N] = 0
#if defined (VERSION_C)
double *u = (double*)malloc((arg_num ) * sizeof(double));
#elif defined (VERSION_C++)
double *u = new double[arg_num];
#elif defined (VERSION_C++11)
std::array<double,arg_num> u;
#endif
//
// h[i] = x[i+1] - x[i]
// i:[0,N-1]; num of elm: N<=>_Sample_Num - 1
double *h = (double*)malloc((arg_num - 1) * sizeof(double));
//
// v[i] = 6*((y[i+2]-y[i+1])/h[i+1] + (y[i+1]-y[i])/h[i])
// i:[0,N-2]
double *v = (double*)malloc((arg_num - 2) * sizeof(double));
//
// temporary array whose num of elm equals v array
double *w = (double*)malloc((arg_num - 2) * sizeof(double));
//
// [ 2(h[0]+h[1]) , h[1] , O ] [u[1] ] [v[0] ]
// [ h[1] , 2(h[1]+h[2]) , h[2] ] [u[2] ] [v[1] ]
// [ ... ] * [... ] = [... ]
// [ h[j] , 2(h[j]+h[j+1]) , h[j+1] ] [u[j+1]] [v[j] ]
// [ ... ] [ ... ] [ ... ]
// [ h[N-3] , 2(h[N-3]+h[N-2]), h[N-2] ] [u[j+1]] [v[j] ]
// [ O h[N-2] , 2(h[N-2]+h[N-1]) ] [u[N-1]] [v[N-2]]
//
// For LU decomposition
double *Upper = (double*)malloc((arg_num - 2) * sizeof(double));
double *Lower = (double*)malloc((arg_num - 2) * sizeof(double));
#ifdef DEBUG
_printOutData(arg_t, arg_ft, arg_num, "\nargment set\n");
#endif
for(int i = 0; i < arg_num - 1; i++)
h[i] = (double)(arg_t[i + 1] - arg_t[i]);
for(int i = 0; i < arg_num - 2; i++)
v[i] = 6 * (
((double)(arg_ft[i + 2] - arg_ft[i + 1])) / h[i + 1]
-
((double)(arg_ft[i + 1] - arg_ft[i])) / h[i]
);
//
// LU decomposition
//
Upper[0] = 2 * (h[0] + h[1]);
Lower[0] = 0;
for (int i = 1; i < arg_num - 2; i++) {
Lower[i] = h[i] / Upper[i - 1];
Upper[i] = 2 * (h[i] + h[i + 1]) - Lower[i] * h[i];
}
//
// forward substitution
//
w[0] = v[0];
for (int i = 1; i < arg_num - 2; i ++) {
w[i] = v[i] - Lower[i] * w[i-1];
}
//
// backward substitution
//
u[arg_num - 2] = w[arg_num - 3] / Upper[arg_num - 3];
for(int i = arg_num - 3; i > 0; i--) {
u[i] = (w[(i - 1)] - h[(i)] * u[(i) + 1]) / Upper[(i - 1)];
}
// _u_spline[i] === d^2/dx^2(Spline f)[i]
u[0] = u[arg_num - 1] = 0.0;
#ifdef DEBUG
_printOutData(h, arg_num - 1, "h");
_printOutData(v, arg_num - 2, "v");
_printOutData(w, arg_num - 2, "w");
_printOutData(Upper, arg_num - 2, "Upper");
_printOutData(Lower, arg_num - 2, "Lower");
_printOutData(u, arg_num , "u");
#endif
for(int ival = 0; ival < arg_num - 1; ival++) {
C[3][ival] = (u[ival + 1] - u[ival]) / 6.0 / (arg_t[ival + 1] - arg_t[ival]);
C[2][ival] = (u[ival]) / 2.0;
C[1][ival] = (arg_ft[ival + 1] - arg_ft[ival]) / (arg_t[ival + 1] - arg_t[ival])
-
(arg_t[ival + 1] - arg_t[ival]) * (u[ival + 1] + 2.0 * u[ival]) / 6.0;
C[0][ival] = (arg_ft[ival]);
}
free(h);
free(u);
free(v);
free(w);
free(Upper);
free(Lower);
}
//
// Fuction to return the value of Cubic polynomial f(t)
//
double CubicSpline2d::_cubic_f(const double arg_t, const double arg_C[4])
{
double ft; //the value of Spline f(t).
ft = arg_C[3] * pow(arg_t, 3) + arg_C[2] * pow(arg_t, 2) + arg_C[1] * arg_t + arg_C[0];
return ft;
}
//
// Function to solve a cubic polinomial
// by using Gardano-Tartaglia formula
//
void CubicSpline2d::_solve_cubic_f(
std::complex<double>* arg_t,
const double arg_C[4],
const double arg_ft)
{
double c[3];
//f(t) = arg_ft/arg_C[3]
// = t^3 + c[2]*t^2 + c[1]*t + c[0].
for(int i = 0; i < 3; i++) {
c[i] = arg_C[i] / arg_C[3];
}
//modify the formula
//t^3 + c[2]*t^2 + c[1]*t + (c[0] - ft) = 0.
c[0] -= arg_ft / argC[3];
//The values defined from coefficients of the formula
//that identify solutions
double p,q,d;
p = ( -pow(c[2], 2) + 3 * c[1]) / 9;
q = (2 * pow(c[2], 3) - 9 * c[2] * c[1] + 27 * c[0]) / 54;
d = - c[2] / 3;
//Discriminant section
double D;
D = pow(p, 3) + pow(q, 2);
//The values defined from p and q
//that idetify solutions
std::complex<double> u,v;
//Real root only
if(D <= 0) {
u.real(-q);
u.imag(+sqrt(-D));
v.real(-q);
v.real(-sqrt(-D));
}
//One real root and two complex root
else {
u.real(-q+sqrt(D));
u.imag(0.0);
v.real(-q-sqrt(D));
v.real(0.0);
}
u = pow(u, 1/3);
v = pow(v, 1/3);
//Cubic root of 1
std::complex<double> omega[3]= {
std::complex<double>( 1.0, 0.0),
std::complex<double>(-1/2, sqrt(3)/2),
std::complex<double>(-1/2,-sqrt(3)/2)
};
//Solution of the formula
arg_t[0] = omega[0] * u + omega[0] * v + d;
arg_t[1] = omega[1] * u + omega[2] * v + d;
arg_t[2] = omega[2] * u + omega[1] * v + d;
}
double CubicSpline2d::getX(double arg_y)
{
double x;
double C[4];
double the_t;
int the_i;
std::complex<double>t_sol[3];
std::vector<double> t_real;
std::vector<int> t_ival;
// For the every Intervals of Spline,
//it solves the polynomial defined by C[i] of the interval,
//checks the solutions are real number,
//and ckecks the solutions are in the interval.
// And if not-excluded solutions are more than one,
//it trys to find which one is more nearest to last point.
for(int ival = 0; ival < _Sample_Num - 1; ival++) {
for(int i = 0; i < 4; i++) C[i] = _C_y[i][ival];
_solve_cubic_f(t_sol, C, arg_y);
for(int i = 0; i < 3; i++) {
// regarding only real solution
// acuracy (error range) is supposed +-10E-3 here(groundless)
if(std::abs(t_sol[i].imag()) < 0.001) {
/* */ if (ival == 0 && t_sol[i].real() < _Sample_Set[ival].t) {
t_real.push_back(_Sample_Set[ival].t);
t_ival.push_back(ival);
} else if (ival == _Sample_Num - 2 && _Sample_Set[ival + 1].t <= t_sol[i].real()) {
t_real.push_back(_Sample_Set[ival + 1].t);
t_ival.push_back(ival);
} else if (_Sample_Set[ival].t <= t_sol[i].real() && t_sol[i].real() < _Sample_Set[ival+1].t) {
t_real.push_back(t_sol[i].real());
t_ival.push_back(ival);
}
}
}
the_t = t_real[0];
the_i = t_ival[0];
//if t's size is bigger than 1
for(int i = 1; i < t_real.size(); i++) {
if(std::abs(t_real[i] - _Last_Point.t) < std::abs(t - _Last_Point.t)) {
the_t = t_real[i];
the_i = t_ival[i];
}
}
for(int i = 0; i < 4; i++) C[i] = _C_y[i][the_i];
x = _cubic_f(the_t, C);
}
return x;
}
double CubicSpline2d::getY(double arg_x)
{
double y;
double C[4];
double the_t;
int the_i;
std::complex<double>t_sol[3];
std::vector<double> t_real;
std::vector<int> t_ival;
// For the every Intervals of Spline,
//it solves the polynomial defined by C[i] of the interval,
//checks the solutions are real number,
//and ckecks the solutions are in the interval.
// And if not-excluded solutions are more than one,
//it trys to find which one is more nearest to last point.
for(int ival = 0; ival < _Sample_Num - 1; ival++) {
for(int i = 0; i < 4; i++) C[i] = _C_x[i][ival];
_solve_cubic_f(t_sol, C, arg_x);
for(int i = 0; i < 3; i++) {
// regarding only real solution
// acuracy (error range) is supposed +-10E-3 here(groundless)
if(std::abs(t_sol[i].imag()) < 0.001) {
/* */ if (ival == 0 && t_sol[i].real() < _Sample_Set[ival].t) {
t_real.push_back(_Sample_Set[ival].t);
t_ival.push_back(ival);
} else if (ival == _Sample_Num - 2 && _Sample_Set[ival + 1].t <= t_sol[i].real()) {
t_real.push_back(_Sample_Set[ival + 1].t);
t_ival.push_back(ival);
} else if (_Sample_Set[ival].t <= t_sol[i].real() && t_sol[i].real() < _Sample_Set[ival+1].t) {
t_real.push_back(t_sol[i].real());
t_ival.push_back(ival);
}
}
}
the_t = t_real[0];
the_i = t_ival[0];
//if t's size is bigger than 1
for(int i = 1; i < t_real.size(); i++) {
if(std::abs(t_real[i] - _Last_Point.t) < std::abs(t - _Last_Point.t)) {
the_t = t_real[i];
the_i = t_ival[i];
}
}
for(int i = 0; i < 4; i++) C[i] = _C_x[i][the_i];
y = _cubic_f(the_t, C);
}
return y;
}
void CubicSpline2d::calibrateSensor()
{
double t[_Sample_Num];
double ft[_Sample_Num];
_sampleData();
_Last_Point = _Sample_Set[0];
for(int i = 0; i < _Sample_Num; i++){
t[i] = _Sample_Set[i].t;
ft[i]= _Sample_Set[i].x;
}
_makeModel(t,ft,_C_x);
for(int i = 0; i < _Sample_Num; i++){
ft[i]= _Sample_Set[i].y;
}
_makeModel(t,ft,_C_y);
}
void CubicSpline2d::saveSetting()
{
FILE *fp;
fp = fopen("/local/savedata.log", "wb");
// Save _Sample_Num
fwrite(&_Sample_Num, sizeof(unsigned int), 1, fp);
fputc(0x3b, fp);
// Save _Sample_Set
for(int i = 0; i < _Sample_Num; i++) {
fwrite(&_Sample_Set[i].x, sizeof(double), 1, fp);
fputc(0x2c, fp);
fwrite(&_Sample_Set[i].y, sizeof(double), 1, fp);
fputc(0x2c, fp);
fwrite(&_Sample_Set[i].t, sizeof(double), 1, fp);
fputc(0x3b, fp);
}
// Save _C_x
for(int i = 0; i < _Sample_Num - 1; i++){
for(int j = 0; j < 4; j++){
fwrite(&_C_x[j][i], sizeof(double), 1, fp);
fputc((j != 3)? 0x2c : 0x3b, fp);
}
}
// Save _C_y
for(int i = 0; i < _Sample_Num - 1; i++){
for(int j = 0; j < 4; j++){
fwrite(&_C_y[j][i], sizeof(double), 1, fp);
fputc((j != 3)? 0x2c : 0x3b, fp);
}
}
fclose(fp);
}
void CubicSpline2d::saveSetting(
const char *filename
)
{
FILE *fp;
char *filepath;
int fnnum = 0;
while (filename[fnnum] != 0) fnnum++;
filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
sprintf(filepath, "/local/%s", filename);
fp = fopen(filepath, "wb");
// Save _Sample_Num
fwrite(&_Sample_Num, sizeof(unsigned int), 1, fp);
fputc(0x3b, fp);
// Save _Sample_Set
for(int i = 0; i < _Sample_Num; i++) {
fwrite(&_Sample_Set[i].x, sizeof(double), 1, fp);
fputc(0x2c, fp);
fwrite(&_Sample_Set[i].y, sizeof(double), 1, fp);
fputc(0x2c, fp);
fwrite(&_Sample_Set[i].t, sizeof(double), 1, fp);
fputc(0x3b, fp);
}
// Save _C_x
for(int i = 0; i < _Sample_Num - 1; i++){
for(int j = 0; j < 4; j++){
fwrite(&_C_x[j][i], sizeof(double), 1, fp);
fputc((j != 3)? 0x2c : 0x3b, fp);
}
}
// Save _C_y
for(int i = 0; i < _Sample_Num - 1; i++){
for(int j = 0; j < 4; j++){
fwrite(&_C_y[j][i], sizeof(double), 1, fp);
fputc((j != 3)? 0x2c : 0x3b, fp);
}
}
fclose(fp);
free(filepath);
}
void CubicSpline2d::loadSetting()
{
FILE *fp;
char tmp;
//sprintf(filepath, "/local/%s", filename);
//fp = fopen(filepath, "rb");
fp = fopen("/local/savedata.log", "rb");
// Load _Sample_Num
fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
fread(&tmp, sizeof(char), 1, fp);
// Load _Sample_Set
for(int i = 0; i < _Sample_Num; i++) {
fread(&_Sample_Set[i].x, sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
fread(&_Sample_Set[i].y, sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
fread(&_Sample_Set[i].t, sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
}
// Load _C_x
for(int i = 0; i < _Sample_Num - 1; i++) {
for(int j = 0; j < 4; j++){
fread(&_C_x[j][i], sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
}
// Load _C_y
for(int i = 0; i < _Sample_Num - 1; i++) {
for(int j = 0; j < 4; j++){
fread(&_C_y[j][i], sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
}
fclose(fp);
}
void CubicSpline2d::loadSetting(
const char *filename
)
{
FILE *fp;
char *filepath;
char tmp;
int fnnum = 0;
while (filename[fnnum] != 0) fnnum++;
filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
sprintf(filepath, "/local/%s", filename);
fp = fopen(filepath, "rb");
// Load _Sample_Num
fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
fread(&tmp, sizeof(char), 1, fp);
// Load _Sample_Set
for(int i = 0; i < _Sample_Num; i++) {
fread(&_Sample_Set[i].x, sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
fread(&_Sample_Set[i].y, sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
fread(&_Sample_Set[i].t, sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
}
// Load _C_x
for(int i = 0; i < _Sample_Num - 1; i++) {
for(int j = 0; j < 4; j++){
fread(&_C_x[j][i], sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
}
// Load _C_y
for(int i = 0; i < _Sample_Num - 1; i++) {
for(int j = 0; j < 4; j++){
fread(&_C_y[j][i], sizeof(double), 1, fp);
fread(&tmp, sizeof(char),1,fp);
}
fclose(fp);
free(filepath);
}
void CubicSpline2d::printOutData()
{
FILE *fp;
fp = fopen("/local/log.txt", "w"); // open file in writing mode
fprintf(fp, "dst, vol,(threshold)\n");
for(int i = 0; i < _ENUM; i++) {
fprintf(fp, "%d,%d,(%d)\n", _Set[i].dst, _Set[i].vol, _Threshold[i]);
}
fprintf(fp, "\nSample:dst, vol\n");
for(int i = 0; i < _Sample_Num; i++) {
fprintf(fp, "%d,%d\n", _Sample_Set[i].dst, _Sample_Set[i].vol);
}
fclose(fp);
}
void CubicSpline2d::_printOutData(unsigned short *arg, int num, char* name)
{
FILE *fp;
fp = fopen("/local/varlog.txt", "a"); // open file in add mode
fprintf(fp, "%10s\n", name);
for(int i = 0; i < num; i++) {
fprintf(fp, "%d, ", arg[i]);
}
fprintf(fp, "\n");
fclose(fp);
}
void CubicSpline2d::_printOutData(double *arg, int num, char* name)
{
FILE *fp;
fp = fopen("/local/varlog.txt", "a"); // open file in add mode
fprintf(fp, "%10s\n", name);
for(int i = 0; i < num; i++) {
fprintf(fp, "%.2f, ", arg[i]);
}
fprintf(fp, "\n");
fclose(fp);
}
void CubicSpline2d::_printOutDataCouple(double *arg1, double *arg2, int num, char* name)
{
FILE *fp;
fp = fopen("/local/varlog.txt", "a"); // open file in add mode
fprintf(fp, "%10s\n", name);
for(int i = 0; i < num; i++) {
fprintf(fp, "(%.2f, %.2f)\n", arg1[i], arg2[i]);
}
fprintf(fp, "\n");
fclose(fp);
}
void CubicSpline2d::_printOutData(Vxyt *arg, int num, char* name)
{
FILE *fp;
fp = fopen("/local/varlog.txt", "a"); // open file in add mode
fprintf(fp, "%10s\n", name);
for(int i = 0; i < num; i++) {
fprintf(fp, "%d, ", arg[i].vol);
}
fprintf(fp, "\n");
fclose(fp);
}
