OSDN Git Service

7bf5d22350cadb9a8f7efbd57d03dadd02e4fbaf
[mikutoga/Vmd2XML.git] / src / main / java / jp / sfjp / mikutoga / vmd / model / BezierParam.java
1 /*
2  * 3D bezier interpolation curve params
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.vmd.model;
9
10 import java.text.MessageFormat;
11
12 /**
13  * 三次ベジェ曲線による補間カーブを記述する。
14  * <p>制御点P0,P1,P2,P3の座標により記述される。
15  * <p>P0は(0,0)で固定。P3は(127,127)で固定。
16  * 残りのP1,P2は、P0,P3を対角線とする正方形の内部に位置しなければならない。
17  */
18 public class BezierParam {
19
20     /**
21      * 制御点P1のXデフォルト値(直線補間)。
22      */
23     public static final byte DEF_P1X = 20;
24     /**
25      * 制御点P1のYデフォルト値(直線補間)。
26      */
27     public static final byte DEF_P1Y = 20;
28     /**
29      * 制御点P2のXデフォルト値(直線補間)。
30      */
31     public static final byte DEF_P2X = 107;
32     /**
33      * 制御点P2のYデフォルト値(直線補間)。
34      */
35     public static final byte DEF_P2Y = 107;
36
37     /**
38      * 制御点P1のXデフォルト値(EaseInOut)。
39      */
40     public static final byte EIO_P1X = 64;
41     /**
42      * 制御点P1のYデフォルト値(EaseInOut)。
43      */
44     public static final byte EIO_P1Y =  0;
45     /**
46      * 制御点P2のXデフォルト値(EaseInOut)。
47      */
48     public static final byte EIO_P2X = 64;
49     /**
50      * 制御点P2のYデフォルト値(EaseInOut)。
51      */
52     public static final byte EIO_P2Y = 127;
53
54     /**
55      * 制御点空間各軸最小値。
56      */
57     public static final byte MIN_VAL = 0;
58
59     /**
60      * 制御点空間各軸最大値。
61      */
62     public static final byte MAX_VAL = 127;
63
64     private static final String MSG_TXT = "P1=({0}, {1}) P2=({2}, {3})";
65
66
67     private byte p1x = DEF_P1X;
68     private byte p1y = DEF_P1Y;
69     private byte p2x = DEF_P2X;
70     private byte p2y = DEF_P2Y;
71
72
73     /**
74      * コンストラクタ。
75      * <p>デフォルトの直線補間が設定される。
76      */
77     public BezierParam(){
78         super();
79         return;
80     }
81
82     /**
83      * 制御点P1のX座標を返す。
84      * @return 制御点P1のX座標
85      */
86     public byte getP1x() {
87         return this.p1x;
88     }
89
90     /**
91      * 制御点P1のY座標を返す。
92      * @return 制御点P1のY座標
93      */
94     public byte getP1y() {
95         return this.p1y;
96     }
97
98     /**
99      * 制御点P2のX座標を返す。
100      * @return 制御点P2のX座標
101      */
102     public byte getP2x() {
103         return this.p2x;
104     }
105
106     /**
107      * 制御点P2のY座標を返す。
108      * @return 制御点P2のY座標
109      */
110     public byte getP2y() {
111         return this.p2y;
112     }
113
114     /**
115      * 制御点P1のX座標を設定する。
116      * @param p1x 制御点P1のX座標
117      */
118     public void setP1x(byte p1x) {
119         this.p1x = p1x;
120         return;
121     }
122
123     /**
124      * 制御点P1のY座標を設定する。
125      * @param p1y 制御点P1のY座標
126      */
127     public void setP1y(byte p1y) {
128         this.p1y = p1y;
129         return;
130     }
131
132     /**
133      * 制御点P2のX座標を設定する。
134      * @param p2x 制御点P2のX座標
135      */
136     public void setP2x(byte p2x) {
137         this.p2x = p2x;
138         return;
139     }
140
141     /**
142      * 制御点P2のY座標を設定する。
143      * @param p2y 制御点P2のY座標
144      */
145     public void setP2y(byte p2y) {
146         this.p2y = p2y;
147         return;
148     }
149
150     /**
151      * 制御点P1の座標を設定する。
152      * @param p1xArg 制御点P1のX座標
153      * @param p1yArg 制御点P1のY座標
154      */
155     public void setP1(byte p1xArg, byte p1yArg) {
156         this.p1x = p1xArg;
157         this.p1y = p1yArg;
158         return;
159     }
160
161     /**
162      * 制御点P2の座標を設定する。
163      * @param p2xArg 制御点P2のX座標
164      * @param p2yArg 制御点P2のY座標
165      */
166     public void setP2(byte p2xArg, byte p2yArg) {
167         this.p2x = p2xArg;
168         this.p2y = p2yArg;
169         return;
170     }
171
172     /**
173      * 直線補間か判定する。
174      * <p>P1,P2双方がP0-P3対角線上に存在する場合を直線補間とする。
175      * @return 直線補間ならtrue
176      */
177     public boolean isLinear(){
178         if(this.p1x != this.p1y) return false;
179         if(this.p2x != this.p2y) return false;
180         return true;
181     }
182
183     /**
184      * MMDデフォルトの直線補間か判定する。
185      * @return MMDデフォルトの直線補間ならtrue
186      */
187     public boolean isDefaultLinear(){
188         if(this.p1x != DEF_P1X) return false;
189         if(this.p1y != DEF_P1Y) return false;
190
191         if(this.p2x != DEF_P2X) return false;
192         if(this.p2y != DEF_P2Y) return false;
193
194         return true;
195     }
196
197     /**
198      * MMDデフォルトのEaseInOutカーブか判定する。
199      * @return  MMDデフォルトのEaseInOutカーブならtrue
200      */
201     public boolean isDefaultEaseInOut(){
202         if(this.p1x != EIO_P1X) return false;
203         if(this.p1y != EIO_P1Y) return false;
204
205         if(this.p2x != EIO_P2X) return false;
206         if(this.p2y != EIO_P2Y) return false;
207
208         return true;
209     }
210
211     /**
212      * MMDデフォルトの直線補間に設定する。
213      */
214     public void setDefaultLinear(){
215         this.p1x = DEF_P1X;
216         this.p1y = DEF_P1Y;
217         this.p2x = DEF_P2X;
218         this.p2y = DEF_P2Y;
219         return;
220     }
221
222     /**
223      * MMDデフォルトのEaseInOutカーブに設定する。
224      */
225     public void setDefaultEaseInOut(){
226         this.p1x = EIO_P1X;
227         this.p1y = EIO_P1Y;
228         this.p2x = EIO_P2X;
229         this.p2y = EIO_P2Y;
230         return;
231     }
232
233     /**
234      * {@inheritDoc}
235      * @return {@inheritDoc}
236      */
237     @Override
238     public String toString(){
239         String msg = MessageFormat.format(MSG_TXT,
240                                           this.p1x, this.p1y,
241                                           this.p2x, this.p2y );
242         return msg;
243     }
244
245 }