OSDN Git Service

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