2017. 10. 20. 03:23
아두이노
겜메 시절에 3D구현한다고 만들어 쓰던거
유니티에선 쓸일이 없지만 윈폼, 아두이노등 3D 연산 미지원 언어들에선 쓸만함
double Rad2Deg=180.0/3.14;
double Deg2Rad=3.14/180.0;
Vector3 len_vec(float len, float dir_x, float dir_y, float dir_z)
{
Vector3 _return;
double _len_z_x;
_len_z_x= len_x(len, (double)dir_y);
_return.x = (float)len_x(_len_z_x, (double)dir_z);
_return.y = (float)len_y(_len_z_x, (double)dir_z);
_return.z = (float)len_y(len, (double)dir_y);
return _return;
}
Vector3 len_vec(float len, Vector3 dir)
{
Vector3 _return;
double _len_z_x;
_len_z_x= len_x(len, (double)dir.y);
_return.x = (float)len_x(_len_z_x, (double)dir.z);
_return.y = (float)len_y(_len_z_x, (double)dir.z);
_return.z = (float)len_y(len, (double)dir.y);
return _return;
}
Vector3 len_vec(double len, Vector3 dir)
{
//unity
Vector3 _return;
double _len_z_x;
_len_z_x= len_x(len, -dir.x);
_return.y = len_y(len, -dir.x);
_return.z = len_x(_len_z_x, dir.y);
_return.x = len_y(_len_z_x, dir.y);
return _return;
}
float len_vec(Vector3 vec, Vector3 dir)
{
Vector3 _return_vec=vec;
float dir_t;
dir_t=_return_vec.y;
_return_vec.y=len_x(dir_t,_return_vec.z,dir.x);
_return_vec.z=len_y(dir_t,_return_vec.z,dir.x);
dir_t=_return_vec.x;
_return_vec.x=len_x(dir_t,_return_vec.z,dir.y);
_return_vec.z=len_y(dir_t,_return_vec.z,dir.y);
dir_t=_return_vec.x;
_return_vec.x=len_x(dir_t,_return_vec.y,dir.z);
_return_vec.y=len_y(dir_t,_return_vec.y,dir.z);
return _return_vec;
}
float len_x(float x, float y, float dir)
{
float _return_x;
_return_x=len_x(x,dir);
_return_x+=len_y(y,-dir);
return _return_x;
}
float len_y(float x, float y, float dir)
{
float _return_y;
_return_y=len_y(x,dir);
_return_y+=len_x(y,-dir);
return _return_y;
}
Vector2 len_vec(Vector2 vec, float dir)
{
Vector2 _return_vec;
_return_vec.x=len_x(vec.x,dir);
_return_vec.y=len_y(vec.x,dir);
_return_vec.x+=len_y(vec.y,-dir);
_return_vec.y+=len_x(vec.y,-dir);
return _return_vec;
}
//x와 각도를 이용해 y를 구함
float x_and_angle_get_y(float x , float dir)
{
//return y
return tan(dir*0.01745329222)*x;
}
float len_x(float len, float dir)//유니티
{
return Mathf.Cos((float)(dir * Mathf.PI / 180.0)) * len;
}
float len_y(float len, float dir)//유니티
{
return Mathf.Atan((float)(dir * Mathf.PI / 180.0)) * len;
}
float len_x(float len, float dir)
{
return cos(dir*0.01745329222)*len;
}
float len_y(float len, float dir)
{
return sin(dir*0.01745329222)*len;
}
float dir_normalized(float dir)
{
if (dir < 0)
{
return 360-(-dir % 360);
}
return dir % 360;
}
float get_dir(Vector2 FromVec, Vector2 ToVec)
{
return get_dir(ToVec-FromVec);
}
float get_dir( Vector2 ToVec)
{
ToVec = ToVec.normalized;
return Mathf.Atan2(ToVec.x, ToVec.y) * Mathf.Rad2Deg;
}
float get_dir( Vector2 ToVec)
{
ToVec = ToVec.normalized;
return Mathf.Atan(ToVec.y/ToVec.x) * Mathf.Rad2Deg;
}
public double d_set(double _Dir)
{
if (_Dir < 0d)
{
_Dir = 360d - ((-_Dir) % 360d);
}
if (_Dir >= 360d)
{
return _Dir % 360d;
}
return _Dir;
}
public double d_set(double _Dir)
{
while(_Dir < 0)
{
_Dir += 360;
}
while(_Dir >= 360)
{
_Dir -= 360;
}
return _Dir;
}
public double d_set_a(double _Dir)
{
_Dir=d_set(_Dir);
if(_Dir>180)
{
return _Dir-360;
}
return _Dir;
}
Vector3 d_set(Vector3 _Dir)
{
//unity
_Dir.x=d_set_a(_Dir.x);
_Dir.y=d_set(_Dir.y);
_Dir.z=d_set(_Dir.z);
if(abs(_Dir.x)>90)
{
_Dir.x=d_set_a(180-_Dir.x);
_Dir.y=d_set(_Dir.y+180);
_Dir.z=d_set(_Dir.z+180);
}
return _Dir;
}
'아두이노' 카테고리의 다른 글
자이로 좌표계 (0) | 2018.02.17 |
---|---|
attiny 쓰기 (0) | 2018.02.11 |
VirtualWire 사용하기 (0) | 2017.06.02 |