Get it on Google Play


Wm뮤 :: 각도 계산 스크립트

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
퇴직한 전자과 게임프로그래머
2020.3.48f1 , 2022.3.6f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


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
posted by 모카쨩

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입