Coding/VB C C++

bcpp 5.5 사용시 자주 써먹는 유틸리티 함수들

smores 2016. 3. 22. 22:43

도스시절 Turbo C 로 부터 시작한 C/C++ 사용은 윈도우즈 10을 사용하는 오늘날까지도 계속되고 있다. 뭐, 거창하게 윈도우용 GUI 프로그래밍을 하는 것은 아니고 여러가지 모델링/시뮬레이션 등을 할 때 스크립트 언어 식으로 간단한 시뮬레이션, 데이터 가공 등의 목적으로 사용하는 것이기에 굳이 무거운 비주얼 스튜디오 등의 IDE를 사용할 것도 없이 옛 EditPlus 2.1 에 무료로 풀어준 Borland C++ 5.5 커맨드라인 컴파일러 연결해서 그냥 몇줄 끄적이는 정도이다. 아쉬운 점은 그나마 유용하게 잘 써먹던 BC5.5 에 딸려오는 문법 Help(EditPlus 에서 Ctrl-5 를 하면 현재 커서가 가 있는 해당 함수에 대한 문법을 보여준다)가 너무 옛 HLP 포맷이어서 더이상 Win10에서 지원을 하지 않는다는 점 정도... (Win7 까지는 패치가 있어서 겨우 쓸 수 있었다) 게다가 문법이 너무 옛 문법이어서 제대로 C/C++을 쓰려면 아무래도 mingw 등을 설치하고 Geany 에디터에 연결해서 사용하는 것이 나은 것 아닌가 싶기는 하지만, 워낙 익숙한 문법에 익숙한 에디터라 바꾸기가 쉽지 않다.


어쨌거나 나 자신만을 위해 자주 써 먹는 직접 만든 몇몇 유틸리티 함수들이 있기에 기록으로 남겨 둬 본다.


#include <iostream>

#include <fstream>

#include <cstdio>

#include <cstdlib>

#include <string>

#include <cmath>

using namespace std;


const double rad = 3.141592653/180.;

const double eps = 1.0e-5;


double random_d(double degreerandom)

{

return (double)rand() / (double)RAND_MAX * degreerandom;

}


int RandINT0(int RANGE_MIN, int RANGE_MAX) 

int ret= int( (double)rand() / (double)RAND_MAX * (RANGE_MAX - RANGE_MIN + 1) + RANGE_MIN ); 

if (ret > RANGE_MAX) ret = RANGE_MAX;

if (ret < RANGE_MIN) ret = RANGE_MIN;

return ret;

}


bool InCircle(double x, double y, double r)

{

if (sqrt(x*x+y*y)<r)    

return true;

else

return false;

}


bool InRange(double x, double v1, double v2)  // [v1, v2)

{

if ((x>=v1) && (x<v2)) return true;

else return false;

}


bool InRectangle(double x, double y, double wx1, double wy1, double wx2, double wy2)

{

return (InRange(x,wx1,wx2) && InRange(y,wy1,wy2));

}


double FakeErrFn(double x, double x0, double w, double p)  // [x0-w,x0+w]:s-curve, x<x0-w:-1, x>x0+w;+1

{

double ret = 0;

if (x<x0-w) 

{

ret = -1;

else if (x>x0+w) 

{

ret = +1;

}

else

{

double x1=(x-x0+w)/w; // x1=0~2

if (x1<=1)

{

ret = pow(x1, p)-1;

}

else // x1=1~2

{

x1=2-x1;

ret = -pow(x1, p)+1;

}

}

return ret;

}


마지막 것은 일종의 가짜 err function 같은 것인데 간혹 경계를 기준으로 두 물리량이 자연스럽게 섞여 들어가는 (blending?) 것을 구현하고자 할 때 일종의 섞이는 확률을 결정하는 S 자 형태의 분포 함수로 써먹는다. 경계에서 섞여 들어가는 속도(?)는 커브의 기울기가 결정하는 데 이것은 p 값 (>1, 보통은 2 이상) 으로 조절 가능하다. 아래 그림이 그 예를 보여준다.