SCALE.C

[目次 | 関数 | マクロ]

目次

関数一覧

マクロ一覧


   1|/************************************************************************
   2|*  1. <<< ◆スケール変換 (Scale) >>> 
   3|*
   4|* グラフィック座標と論理座標の対応を指定して、拡大率を設定し、座標変換します。
   5|*************************************************************************/
   6|
   7|#define  STDLIBS_INCLUDE
   8|#define  STDLIBS_INCLUDE_MATH_H
   9|#ifdef  USES_MXP_AUTOINC
  10| #include "scale.ah"  /* Auto include header, Look at mixer-... folder */
  11|#else
  12| #include  <all.h>
  13|#endif
  14|
  15|
  16| 
  17|/************************************************************************
  18|*  2. <<< [Scale_init] 初期化する(グラフィック座標と論理座標の設定) >>> 
  19|*************************************************************************/
  20|void  Scale_init( Scale* m, double GX1, double GY1, double GX2,
  21| double GY2, double LX1, double LY1, double LX2, double LY2 )
  22|{
  23|  #if (((0)))
  24|    Errors_printf( "G(%f,%f)-(%f,%f) L(%f,%f)-(%f,%f)",
  25|      GX1,GY1,GX2,GY2,LX1,LY1,LX2,LY2 );
  26|  #endif
  27|
  28|  ASSERT( GX1 != GX2 && GY1 != GY2 && LX1 != LX2 && LY1 != LY2 );
  29|      /* Width or Height is Zero */
  30|
  31|  m->GX1 = GX1;
  32|  m->GX2 = GX2;
  33|  m->GXP = ( GX2 - GX1 ) / ( LX2 - LX1 );
  34|  m->GY1 = GY1;
  35|  m->GY2 = GY2;
  36|  m->GYP = ( GY2 - GY1 ) / ( LY2 - LY1 );
  37|  m->LX1 = LX1;
  38|  m->LX2 = LX2;
  39|  m->LXP = ( LX2 - LX1 ) / ( GX2 - GX1 );
  40|  m->LY1 = LY1;
  41|  m->LY2 = LY2;
  42|  m->LYP = ( LY2 - LY1 ) / ( GY2 - GY1 );
  43|
  44|  #if (((0)))
  45|    Errors_printf( "GXP=%f, GYP=%f, LXP=%f, LYP=%f",
  46|      m->GXP, m->GYP, m->LXP, m->LYP );
  47|  #endif
  48|}
  49|
  50|
  51| 
  52|/************************************************************************
  53|*  3. <<< [Scale_setG2] 比率は今までと同じにして画面の座標範囲を設定する >>> 
  54|*************************************************************************/
  55|void  Scale_setG2( Scale* m,
  56|  double GX1, double GY1, double GX2, double GY2 )
  57|{
  58|  double  PX1, PX2, PY1, PY2;
  59|
  60|  PX1 = ( GX1 - m->GX2 ) / ( m->GX1 - m->GX2 );
  61|  PX2 = ( GX2 - m->GX1 ) / ( m->GX2 - m->GX1 );
  62|  PY1 = ( GY1 - m->GY2 ) / ( m->GY1 - m->GY2 );
  63|  PY2 = ( GY2 - m->GY1 ) / ( m->GY2 - m->GY1 );
  64|  Scale_init( m, GX1, GY1, GX2, GY2,
  65|             m->LX2 + PX1 * ( m->LX1 - m->LX2 ),
  66|             m->LY2 + PY1 * ( m->LY1 - m->LY2 ),
  67|             m->LX1 + PX2 * ( m->LX2 - m->LX1 ),
  68|             m->LY1 + PY2 * ( m->LY2 - m->LY1 ) );
  69|}
  70|
  71|
  72| 
  73|/************************************************************************
  74|*  4. <<< [Scale_setL_1To1] 縦横比が 1対 1になるように論理座標を変更する >>> 
  75|*【補足】
  76|*・縦か横か足りない方を大きくします。
  77|*************************************************************************/
  78|void  Scale_setL_1To1( Scale* m,
  79|  double LX1, double LY1, double LX2, double LY2 )
  80|{
  81|  double  GW = fabs( m->GX1 - m->GX2 );
  82|  double  GH = fabs( m->GY1 - m->GY2 );
  83|  double  LW = fabs( LX1 - LX2 );
  84|  double  LH = fabs( LX1 - LX2 );
  85|
  86|  ASSERT( GW != 0.0 && GH != 0.0 && LW != 0.0 && LH != 0.0 );   /* Width or Height is Zero */
  87|
  88|  if ( LW * GH == GW * LH ) {  /* ( LW / LH == GW / GH ) */  }
  89|
  90|  /* 幅を大きくする */
  91|  else if ( LW * GH < GW * LH ) {
  92|    double  LWNew = LH * GW / GH;
  93|    if ( LX1 < LX2 ) {
  94|      LX1 -= ( LWNew - LW ) / 2;  LX2 += ( LWNew - LW ) / 2;
  95|    }
  96|    else {
  97|      LX1 += ( LWNew - LW ) / 2;  LX2 -= ( LWNew - LW ) / 2;
  98|    }
  99|  }
 100|
 101|  /* 高さを大きくする */
 102|  else {
 103|    double  LHNew = LW * GH / GW;
 104|    if ( LY1 < LY2 ) {
 105|      LY1 -= ( LHNew - LH ) / 2;  LY2 += ( LHNew - LH ) / 2;
 106|    }
 107|    else {
 108|      LY1 += ( LHNew - LH ) / 2;  LY2 -= ( LHNew - LH ) / 2;
 109|    }
 110|  }
 111|  Scale_setL( m, LX1, LY1, LX2, LY2 );
 112|}
 113|
 114|
 115| 
 116|/************************************************************************
 117|*  5. <<< [Scale_print] パラメータを表示する >>> 
 118|*【引数】
 119|*  ・char*  title;  行頭に加えるメッセージ
 120|*************************************************************************/
 121|#if defined(USES_ERRORS) && !defined(ERRORS_CUT_DEBUG_TOOL)
 122|void  Scale_print( Scale* m, const char* title )
 123|{
 124|  Errors_printf( "%s:Scale(%p): G(%f,%f)-(%f,%f), L(%f,%f)-(%f,%f) ",
 125|    title, m,
 126|    m->GX1, m->GY1, m->GX2, m->GY2,
 127|    m->LX1, m->LY1, m->LX2, m->LY2 );
 128|}
 129|#endif
 130|
 131| 
 132|/*--------------------------------------------------------------------*/
 133|/*  6. <<< ◆(Scale_Progre) 進捗状況を計算するツール >>> */ 
 134|/*--------------------------------------------------------------------*/
 135|
 136| 
 137|/************************************************************************
 138|*  7. <<< [Scale_Progre_getPer] 進捗状況を計算する >>> 
 139|*【引数】
 140|*  ・int  startPer;   開始パーセント×100(0〜10000)
 141|*  ・int  endPer;     終了パーセント×100(0〜10000)
 142|*  ・int  nPos;       分割数
 143|*  ・int  pos;        分割数の現在の番目(0〜nPos)
 144|*  ・int  返り値;     現在のパーセント×100(0〜10000)
 145|*【例】
 146|* iPos ++;  (*disp)( obj, Scale_Progre_getPer(1200, 1500, nPos, iPos) );
 147|*************************************************************************/
 148|int   Scale_Progre_getPer( int startPer, int endPer, int nPos, int pos )
 149|{
 150|  int  per;
 151|
 152|  ASSERT( startPer >= 0 && startPer <= 10000 );
 153|  ASSERT( endPer >= 0 && endPer <= 10000 );
 154|  ASSERT( startPer <= endPer );
 155|  ASSERT( nPos >= 0 );
 156|  ASSERT( pos >= 0 && pos <= nPos );
 157|
 158|  per = startPer + (endPer - startPer) * pos / nPos;
 159|
 160|  ASSERT( per >= 0 && per <= 10000 );
 161|
 162|  return  per;
 163|}
 164|
 165| 
 166|