OSDN Git Service

[no commit message]
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / model / Surface.java
1 /*
2  * triangle surface
3  *
4  * License : The MIT License
5  * Copyright(c) 2010 MikuToga Partners
6  */
7
8 package jp.sourceforge.mikutoga.pmd.model;
9
10 import java.util.ArrayList;
11 import java.util.Iterator;
12 import java.util.List;
13 import jp.sourceforge.mikutoga.corelib.SerialNumbered;
14
15 /**
16  * 3頂点の三角形からなる面情報。
17  */
18 public class Surface implements SerialNumbered, Iterable<Vertex> {
19
20     private Vertex vertex1;
21     private Vertex vertex2;
22     private Vertex vertex3;
23
24     private int serialNo = -1;
25
26     /**
27      * コンストラクタ。
28      * 3頂点がnullの状態で生成される。
29      */
30     public Surface(){
31         super();
32         return;
33     }
34
35     /**
36      * 3頂点を設定する。
37      * @param vertex1 頂点1
38      * @param vertex2 頂点2
39      * @param vertex3 頂点3
40      * @throws  IllegalArgumentException 重複する頂点が引数に含まれた
41      */
42     public void setTriangle(Vertex vertex1, Vertex vertex2, Vertex vertex3)
43             throws IllegalArgumentException{
44         if(vertex1 != null && (vertex1 == vertex2 || vertex1 == vertex3)){
45             throw new IllegalArgumentException();
46         }
47         if(vertex2 != null && vertex2 == vertex3){
48             throw new IllegalArgumentException();
49         }
50
51         this.vertex1 = vertex1;
52         this.vertex2 = vertex2;
53         this.vertex3 = vertex3;
54
55         return;
56     }
57
58     /**
59      * 3頂点を返す。
60      * @param store 頂点格納用配列。nullもしくは3要素に満たない場合は無視され、
61      * 新規に格納用配列が生成される。
62      * @return 先頭3要素に3頂点が収められた配列。未設定要素にはnullが入る。
63      * 引数が長さ3以上の配列であれば引数と同じ配列が返る。
64      */
65     public Vertex[] getTriangle(Vertex[] store){
66         Vertex[] result;
67         if(store == null || store.length < 3){
68             result = new Vertex[3];
69         }else{
70             result = store;
71         }
72
73         result[0] = this.vertex1;
74         result[1] = this.vertex2;
75         result[2] = this.vertex3;
76
77         return result;
78     }
79
80     /**
81      * 頂点その1を返す。
82      * @return 頂点その1
83      */
84     public Vertex getVertex1(){
85         return this.vertex1;
86     }
87
88     /**
89      * 頂点その2を返す。
90      * @return 頂点その2
91      */
92     public Vertex getVertex2(){
93         return this.vertex2;
94     }
95
96     /**
97      * 頂点その3を返す。
98      * @return 頂点その3
99      */
100     public Vertex getVertex3(){
101         return this.vertex3;
102     }
103
104     /**
105      * {@inheritDoc}
106      * 頂点を返す反復子を生成する。
107      * 反復子がnullを返す可能性もありうる。
108      * @return {@inheritDoc}
109      */
110     @Override
111     public Iterator<Vertex> iterator(){
112         List<Vertex> list = new ArrayList<Vertex>(3);
113
114         list.add(this.vertex1);
115         list.add(this.vertex2);
116         list.add(this.vertex3);
117
118         return list.iterator();
119     }
120
121     /**
122      * 3頂点全てが設定されているか判定する。
123      * @return 3頂点とも非nullが設定されていればtrue
124      */
125     public boolean isCompleted(){
126         if(   this.vertex1 != null
127            && this.vertex2 != null
128            && this.vertex3 != null ){
129             return true;
130         }
131         return false;
132     }
133
134     /**
135      * {@inheritDoc}
136      * @param num {@inheritDoc}
137      */
138     @Override
139     public void setSerialNumber(int num){
140         this.serialNo = num;
141         return;
142     }
143
144     /**
145      * {@inheritDoc}
146      * @return {@inheritDoc}
147      */
148     @Override
149     public int getSerialNumber(){
150         return this.serialNo;
151     }
152
153     /**
154      * {@inheritDoc}
155      * @return {@inheritDoc}
156      */
157     @Override
158     public String toString(){
159         StringBuilder result = new StringBuilder();
160
161         result.append("Surface(")
162               .append(getSerialNumber())
163               .append(")");
164
165         if(isCompleted()){
166             result.append(" VID=[")
167                   .append(this.vertex1.getSerialNumber())
168                   .append(',')
169                   .append(this.vertex2.getSerialNumber())
170                   .append(',')
171                   .append(this.vertex3.getSerialNumber())
172                   .append(']');
173         }
174
175         return result.toString();
176     }
177
178 }