質問するログイン新規登録

質問編集履歴

4

試したこと追記

2019/01/03 13:27

投稿

kouya_tdu
kouya_tdu

スコア13

title CHANGED
File without changes
body CHANGED
@@ -164,16 +164,17 @@
164
164
  }
165
165
  }
166
166
 
167
+
167
168
  class MyJPanel extends javax.swing.JPanel {
168
169
 
169
170
  /** 粒子の座標 */
170
- final private Point3D.Double[] m;
171
+ final private Point3D[] m;
171
172
  /** 重心の座標 */
172
- final private Point3D.Double g;
173
+ final private Point3D g;
173
174
  /** 角速度 */
174
175
  final double omega;
175
176
  /** 並進速度 */
176
- Point3D.Double v;
177
+ Point3D v;
177
178
 
178
179
 
179
180
  /**
@@ -183,14 +184,14 @@
183
184
  public MyJPanel() {
184
185
 
185
186
  // 粒子の座標を決める
186
- m = new Point3D.Double[] {
187
+ m = new Point3D[] {
187
- new Point3D.Double(50, 50, 0), // m1
188
+ new Point3D(50, 50, 0), // m1
188
- new Point3D.Double(50, 70, 0), // m2
189
+ new Point3D(50, 70, 0), // m2
189
- new Point3D.Double(70, 70, 0), // m3
190
+ new Point3D(70, 70, 0), // m3
190
191
  };
191
192
 
192
193
  // 重心を計算(粒子の重さが全て等しい場合、座標平均が重心となる)
193
- g = new Point3D.Double(
194
+ g = new Point3D(
194
195
  Arrays.stream(m).mapToDouble(p -> p.x).average().getAsDouble(),
195
196
  Arrays.stream(m).mapToDouble(p -> p.y).average().getAsDouble(),
196
197
  Arrays.stream(m).mapToDouble(p -> p.z).average().getAsDouble());
@@ -247,7 +248,7 @@
247
248
  omega = kakusokudo[2];
248
249
 
249
250
  // 並進速度
250
- v = new Point3D.Double(f[0] * derutat / (3 * mg), f[1] * derutat / (3 * mg), f[2] * derutat / (3 * mg) );
251
+ v = new Point3D(f[0] * derutat / (3 * mg), f[1] * derutat / (3 * mg), f[2] * derutat / (3 * mg) );
251
252
 
252
253
  // 30ミリ秒おきに位置座標を更新して、描画更新要求
253
254
  new javax.swing.Timer(30, e -> {
@@ -258,7 +259,7 @@
258
259
  g.z += v.z;
259
260
 
260
261
  // 各粒子の位置更新
261
- for (Point3D.Double p : m) {
262
+ for (Point3D p : m) {
262
263
  double x = p.x + v.x, y = p.y + v.y, z = p.z + v.z;
263
264
  p.x = (x - g.x) * Math.cos(omega) - (y - g.y) * Math.sin(omega) + g.x;
264
265
  p.y = (x - g.x) * Math.sin(omega) + (y - g.y) * Math.cos(omega) + g.y;
@@ -272,13 +273,14 @@
272
273
  public void paintComponent(java.awt.Graphics g) {
273
274
  super.paintComponent(g);
274
275
  // 粒子の描画
275
- for(Point3D.Double p : m) {
276
+ for(Point3D p : m) {
276
277
  // とりえあえず、直径を20にしてる
277
278
  g.drawOval((int)p.x, (int)p.y, (int)p.z, 20, 20, 20);
278
279
  }
279
280
 
280
281
  }
281
282
  }
283
+
282
284
  ```
283
285
 
284
286
  ### 補足情報(FW/ツールのバージョンなど)

3

試したこと追記

2019/01/03 13:27

投稿

kouya_tdu
kouya_tdu

スコア13

title CHANGED
File without changes
body CHANGED
@@ -139,9 +139,9 @@
139
139
 
140
140
  ### 試したこと
141
141
  2Dの箇所を3Dに変えてZ軸に数値を入れたのですがうまく動きませんでした。
142
+ class Point3Dを作り追加しました。
142
143
  ```Java
143
144
  import java.awt.geom.Point2D;
144
- import javafx.geometry.Point3D;
145
145
  import java.util.Arrays;
146
146
  import javax.swing.JFrame;
147
147
 
@@ -156,6 +156,14 @@
156
156
 
157
157
  }
158
158
 
159
+ class Point3D {
160
+ public double x, y, z;
161
+
162
+ Point3D(double x, double y, double z) {
163
+ this.x = x; this.y = y; this.z = z;
164
+ }
165
+ }
166
+
159
167
  class MyJPanel extends javax.swing.JPanel {
160
168
 
161
169
  /** 粒子の座標 */

2

試したこと追記

2019/01/03 12:41

投稿

kouya_tdu
kouya_tdu

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
  Java(swing)で粒子法による剛体のシミュレーションをやりたいです。
3
3
  3つの粒子で表現したL字型の剛体に力を加えた時の簡単な運動はできました。
4
- 2次元平面上では出来たのですがこれを3次元平面上に変換するやり方が分かりませんのでご教授お願いします
4
+ 2次元平面上では出来たのですがこれを3次元平面上に変換するやり方が分かりません。
5
+ どのようにコードを書けば良いか躓いています、ご教授お願いします。
5
6
 
6
7
 
7
8
  ### 該当のソースコード
@@ -138,5 +139,138 @@
138
139
 
139
140
  ### 試したこと
140
141
  2Dの箇所を3Dに変えてZ軸に数値を入れたのですがうまく動きませんでした。
142
+ ```Java
143
+ import java.awt.geom.Point2D;
144
+ import javafx.geometry.Point3D;
145
+ import java.util.Arrays;
146
+ import javax.swing.JFrame;
141
147
 
148
+ class Main {
149
+ public static void main(String args[]) {
150
+ JFrame frame = new JFrame();
151
+ frame.setSize(500, 500);
152
+ frame.getContentPane().add(new MyJPanel());
153
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
154
+ frame.setVisible(true);
155
+ }
156
+
157
+ }
158
+
159
+ class MyJPanel extends javax.swing.JPanel {
160
+
161
+ /** 粒子の座標 */
162
+ final private Point3D.Double[] m;
163
+ /** 重心の座標 */
164
+ final private Point3D.Double g;
165
+ /** 角速度 */
166
+ final double omega;
167
+ /** 並進速度 */
168
+ Point3D.Double v;
169
+
170
+
171
+ /**
172
+ * コンストラクタ
173
+ * <p>各粒子位置、重心、速度の初期化。および座標更新タイマの設定</p>
174
+ */
175
+ public MyJPanel() {
176
+
177
+ // 粒子の座標を決める
178
+ m = new Point3D.Double[] {
179
+ new Point3D.Double(50, 50, 0), // m1
180
+ new Point3D.Double(50, 70, 0), // m2
181
+ new Point3D.Double(70, 70, 0), // m3
182
+ };
183
+
184
+ // 重心を計算(粒子の重さが全て等しい場合、座標平均が重心となる)
185
+ g = new Point3D.Double(
186
+ Arrays.stream(m).mapToDouble(p -> p.x).average().getAsDouble(),
187
+ Arrays.stream(m).mapToDouble(p -> p.y).average().getAsDouble(),
188
+ Arrays.stream(m).mapToDouble(p -> p.z).average().getAsDouble());
189
+
190
+ double m1x = 50, m1y = 50, m2x = 50, m2y = 70, m3x = 70, m3y = 70;
191
+ double derutat = 0.01;
192
+ double mg =1;
193
+
194
+ double [][] a = new double[3][3];
195
+ a[0][0] = mg * (m1y - g.y) * (m1y - g.y) + mg * (m2y - g.y) * (m2y - g.y) + mg * (m3y - g.y) * (m3y - g.y);
196
+ a[0][1] = -1 * mg * (m1x - g.x) * (m1y - g.y) - mg * (m2x - g.x) * (m2y - g.y) - mg * (m3x - g.x) * (m3y - g.y);
197
+ a[0][2] = 0;
198
+ a[1][0] = -1 * mg * (m1x - g.x) * (m1y - g.y) - mg * (m2x - g.x) * (m2y - g.y) - mg * (m3x - g.x) * (m3y - g.y);
199
+ a[1][1] = mg * (m1x - g.x) * (m1x - g.x) + mg * (m2x - g.x) * (m2x - g.x) + mg * (m3x - g.x) * (m3x - g.x);
200
+ a[1][2] = 0;
201
+ a[2][0] = 0;
202
+ a[2][1] = 0;
203
+ a[2][2] = mg * (m1x - g.x) * (m1x - g.x) + (m1y - g.y) * (m1y - g.y) + mg * (m2x - g.x) * (m2x - g.x) + (m2y - g.y) * (m2y - g.y) + mg * (m3x - g.x) * (m3x - g.x) + (m3y - g.y) * (m3y - g.y);
204
+
205
+ double [][] b = new double[3][3];
206
+ b[0][0] = a[1][1] * a[2][2] / (a[0][0] * a[1][1] * a[2][2] - a[0][1] * a[1][0] * a[2][2]);
207
+ b[0][1] = -1 * a[0][1] * a[2][2] / (a[0][0] * a[1][1] * a[2][2] - a[0][1] * a[1][0] * a[2][2]);
208
+ b[0][2] = 0;
209
+ b[1][0] = -1 * a[1][0] * a[2][2] / (a[0][0] * a[1][1] * a[2][2] - a[0][1] * a[1][0] * a[2][2]);
210
+ b[1][1] = (a[0][0] * a[2][2] - a[0][2] * a[2][0]) / (a[0][0] * a[1][1] * a[2][2] - a[0][1] * a[1][0] * a[2][2]);
211
+ b[1][2] = 0;
212
+ b[2][0] = 0;
213
+ b[2][1] = 0;
214
+ b[2][2] = (a[0][0] * a[1][1] - a[0][1] * a[1][0]) / (a[0][0] * a[1][1] * a[2][2] - a[0][1] * a[1][0] * a[2][2]);
215
+
216
+ double [] r = new double[3];
217
+ r[0] = m1x - g.x;
218
+ r[1] = m1y - g.y;
219
+ r[2] = 0;
220
+
221
+ double [] f = new double[3];
222
+ f[0] = 500;
223
+ f[1] = 200;
224
+ f[2] = 0;
225
+
226
+ double [] gaiseki = new double[3];
227
+ gaiseki[0] = (r[1] * f[2] - r[2] * f[1]) * derutat;
228
+ gaiseki[1] = (r[2] * f[0] - r[0] * f[2]) * derutat;
229
+ gaiseki[2] = (r[0] * f[1] - r[1] * f[0]) * derutat;
230
+
231
+ double [] kakusokudo = new double[3];
232
+ kakusokudo[0] = b[0][0] * gaiseki[0] + b[0][1] * gaiseki[1] + b[0][2] * gaiseki[2];
233
+ kakusokudo[1] = b[1][0] * gaiseki[0] + b[1][1] * gaiseki[1] + b[1][2] * gaiseki[2];
234
+ kakusokudo[2] = b[2][0] * gaiseki[0] + b[2][1] * gaiseki[1] + b[2][2] * gaiseki[2];
235
+
236
+
237
+
238
+ // 角速度
239
+ omega = kakusokudo[2];
240
+
241
+ // 並進速度
242
+ v = new Point3D.Double(f[0] * derutat / (3 * mg), f[1] * derutat / (3 * mg), f[2] * derutat / (3 * mg) );
243
+
244
+ // 30ミリ秒おきに位置座標を更新して、描画更新要求
245
+ new javax.swing.Timer(30, e -> {
246
+
247
+ // 並進運動による位置更新
248
+ g.x += v.x;
249
+ g.y += v.y;
250
+ g.z += v.z;
251
+
252
+ // 各粒子の位置更新
253
+ for (Point3D.Double p : m) {
254
+ double x = p.x + v.x, y = p.y + v.y, z = p.z + v.z;
255
+ p.x = (x - g.x) * Math.cos(omega) - (y - g.y) * Math.sin(omega) + g.x;
256
+ p.y = (x - g.x) * Math.sin(omega) + (y - g.y) * Math.cos(omega) + g.y;
257
+ }
258
+
259
+ // 描画更新要求
260
+ repaint();
261
+ }).start();
262
+ }
263
+
264
+ public void paintComponent(java.awt.Graphics g) {
265
+ super.paintComponent(g);
266
+ // 粒子の描画
267
+ for(Point3D.Double p : m) {
268
+ // とりえあえず、直径を20にしてる
269
+ g.drawOval((int)p.x, (int)p.y, (int)p.z, 20, 20, 20);
270
+ }
271
+
272
+ }
273
+ }
274
+ ```
275
+
142
276
  ### 補足情報(FW/ツールのバージョンなど)

1

ソースコードの記入法

2019/01/03 10:26

投稿

kouya_tdu
kouya_tdu

スコア13

title CHANGED
File without changes
body CHANGED
@@ -5,6 +5,7 @@
5
5
 
6
6
 
7
7
  ### 該当のソースコード
8
+ ```Java
8
9
  import java.awt.geom.Point2D;
9
10
  import java.util.Arrays;
10
11
  import javax.swing.JFrame;
@@ -133,9 +134,9 @@
133
134
 
134
135
  }
135
136
  }
137
+ ```
136
138
 
137
139
  ### 試したこと
138
-
139
140
  2Dの箇所を3Dに変えてZ軸に数値を入れたのですがうまく動きませんでした。
140
141
 
141
142
  ### 補足情報(FW/ツールのバージョンなど)