OSDN Git Service

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