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|