質問編集履歴

4

試したこと追記

2019/01/03 13:27

投稿

kouya_tdu
kouya_tdu

スコア13

test CHANGED
File without changes
test CHANGED
@@ -330,17 +330,19 @@
330
330
 
331
331
 
332
332
 
333
+
334
+
333
335
  class MyJPanel extends javax.swing.JPanel {
334
336
 
335
337
 
336
338
 
337
339
  /** 粒子の座標 */
338
340
 
339
- final private Point3D.Double[] m;
341
+ final private Point3D[] m;
340
342
 
341
343
  /** 重心の座標 */
342
344
 
343
- final private Point3D.Double g;
345
+ final private Point3D g;
344
346
 
345
347
  /** 角速度 */
346
348
 
@@ -348,7 +350,7 @@
348
350
 
349
351
  /** 並進速度 */
350
352
 
351
- Point3D.Double v;
353
+ Point3D v;
352
354
 
353
355
 
354
356
 
@@ -368,13 +370,13 @@
368
370
 
369
371
  // 粒子の座標を決める
370
372
 
371
- m = new Point3D.Double[] {
373
+ m = new Point3D[] {
372
-
374
+
373
- new Point3D.Double(50, 50, 0), // m1
375
+ new Point3D(50, 50, 0), // m1
374
-
376
+
375
- new Point3D.Double(50, 70, 0), // m2
377
+ new Point3D(50, 70, 0), // m2
376
-
378
+
377
- new Point3D.Double(70, 70, 0), // m3
379
+ new Point3D(70, 70, 0), // m3
378
380
 
379
381
  };
380
382
 
@@ -382,7 +384,7 @@
382
384
 
383
385
  // 重心を計算(粒子の重さが全て等しい場合、座標平均が重心となる)
384
386
 
385
- g = new Point3D.Double(
387
+ g = new Point3D(
386
388
 
387
389
  Arrays.stream(m).mapToDouble(p -> p.x).average().getAsDouble(),
388
390
 
@@ -496,7 +498,7 @@
496
498
 
497
499
  // 並進速度
498
500
 
499
- v = new Point3D.Double(f[0] * derutat / (3 * mg), f[1] * derutat / (3 * mg), f[2] * derutat / (3 * mg) );
501
+ v = new Point3D(f[0] * derutat / (3 * mg), f[1] * derutat / (3 * mg), f[2] * derutat / (3 * mg) );
500
502
 
501
503
 
502
504
 
@@ -518,7 +520,7 @@
518
520
 
519
521
  // 各粒子の位置更新
520
522
 
521
- for (Point3D.Double p : m) {
523
+ for (Point3D p : m) {
522
524
 
523
525
  double x = p.x + v.x, y = p.y + v.y, z = p.z + v.z;
524
526
 
@@ -546,7 +548,7 @@
546
548
 
547
549
  // 粒子の描画
548
550
 
549
- for(Point3D.Double p : m) {
551
+ for(Point3D p : m) {
550
552
 
551
553
  // とりえあえず、直径を20にしてる
552
554
 
@@ -560,6 +562,8 @@
560
562
 
561
563
  }
562
564
 
565
+
566
+
563
567
  ```
564
568
 
565
569
 

3

試したこと追記

2019/01/03 13:27

投稿

kouya_tdu
kouya_tdu

スコア13

test CHANGED
File without changes
test CHANGED
@@ -280,12 +280,12 @@
280
280
 
281
281
  2Dの箇所を3Dに変えてZ軸に数値を入れたのですがうまく動きませんでした。
282
282
 
283
+ class Point3Dを作り追加しました。
284
+
283
285
  ```Java
284
286
 
285
287
  import java.awt.geom.Point2D;
286
288
 
287
- import javafx.geometry.Point3D;
288
-
289
289
  import java.util.Arrays;
290
290
 
291
291
  import javax.swing.JFrame;
@@ -314,6 +314,22 @@
314
314
 
315
315
 
316
316
 
317
+ class Point3D {
318
+
319
+ public double x, y, z;
320
+
321
+
322
+
323
+ Point3D(double x, double y, double z) {
324
+
325
+ this.x = x; this.y = y; this.z = z;
326
+
327
+ }
328
+
329
+ }
330
+
331
+
332
+
317
333
  class MyJPanel extends javax.swing.JPanel {
318
334
 
319
335
 

2

試したこと追記

2019/01/03 12:41

投稿

kouya_tdu
kouya_tdu

スコア13

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  3つの粒子で表現したL字型の剛体に力を加えた時の簡単な運動はできました。
6
6
 
7
- 2次元平面上では出来たのですがこれを3次元平面上に変換するやり方が分かりませんのでご教授お願いします
7
+ 2次元平面上では出来たのですがこれを3次元平面上に変換するやり方が分かりません。
8
+
9
+ どのようにコードを書けば良いか躓いています、ご教授お願いします。
8
10
 
9
11
 
10
12
 
@@ -278,6 +280,272 @@
278
280
 
279
281
  2Dの箇所を3Dに変えてZ軸に数値を入れたのですがうまく動きませんでした。
280
282
 
283
+ ```Java
284
+
285
+ import java.awt.geom.Point2D;
286
+
287
+ import javafx.geometry.Point3D;
288
+
289
+ import java.util.Arrays;
290
+
291
+ import javax.swing.JFrame;
292
+
293
+
294
+
295
+ class Main {
296
+
297
+ public static void main(String args[]) {
298
+
299
+ JFrame frame = new JFrame();
300
+
301
+ frame.setSize(500, 500);
302
+
303
+ frame.getContentPane().add(new MyJPanel());
304
+
305
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
306
+
307
+ frame.setVisible(true);
308
+
309
+ }
310
+
311
+
312
+
313
+ }
314
+
315
+
316
+
317
+ class MyJPanel extends javax.swing.JPanel {
318
+
319
+
320
+
321
+ /** 粒子の座標 */
322
+
323
+ final private Point3D.Double[] m;
324
+
325
+ /** 重心の座標 */
326
+
327
+ final private Point3D.Double g;
328
+
329
+ /** 角速度 */
330
+
331
+ final double omega;
332
+
333
+ /** 並進速度 */
334
+
335
+ Point3D.Double v;
336
+
337
+
338
+
339
+
340
+
341
+ /**
342
+
343
+ * コンストラクタ
344
+
345
+ * <p>各粒子位置、重心、速度の初期化。および座標更新タイマの設定</p>
346
+
347
+ */
348
+
349
+ public MyJPanel() {
350
+
351
+
352
+
353
+ // 粒子の座標を決める
354
+
355
+ m = new Point3D.Double[] {
356
+
357
+ new Point3D.Double(50, 50, 0), // m1
358
+
359
+ new Point3D.Double(50, 70, 0), // m2
360
+
361
+ new Point3D.Double(70, 70, 0), // m3
362
+
363
+ };
364
+
365
+
366
+
367
+ // 重心を計算(粒子の重さが全て等しい場合、座標平均が重心となる)
368
+
369
+ g = new Point3D.Double(
370
+
371
+ Arrays.stream(m).mapToDouble(p -> p.x).average().getAsDouble(),
372
+
373
+ Arrays.stream(m).mapToDouble(p -> p.y).average().getAsDouble(),
374
+
375
+ Arrays.stream(m).mapToDouble(p -> p.z).average().getAsDouble());
376
+
377
+
378
+
379
+ double m1x = 50, m1y = 50, m2x = 50, m2y = 70, m3x = 70, m3y = 70;
380
+
381
+ double derutat = 0.01;
382
+
383
+ double mg =1;
384
+
385
+
386
+
387
+ double [][] a = new double[3][3];
388
+
389
+ a[0][0] = mg * (m1y - g.y) * (m1y - g.y) + mg * (m2y - g.y) * (m2y - g.y) + mg * (m3y - g.y) * (m3y - g.y);
390
+
391
+ 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);
392
+
393
+ a[0][2] = 0;
394
+
395
+ 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);
396
+
397
+ a[1][1] = mg * (m1x - g.x) * (m1x - g.x) + mg * (m2x - g.x) * (m2x - g.x) + mg * (m3x - g.x) * (m3x - g.x);
398
+
399
+ a[1][2] = 0;
400
+
401
+ a[2][0] = 0;
402
+
403
+ a[2][1] = 0;
404
+
405
+ 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);
406
+
407
+
408
+
409
+ double [][] b = new double[3][3];
410
+
411
+ 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]);
412
+
413
+ 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]);
414
+
415
+ b[0][2] = 0;
416
+
417
+ 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]);
418
+
419
+ 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]);
420
+
421
+ b[1][2] = 0;
422
+
423
+ b[2][0] = 0;
424
+
425
+ b[2][1] = 0;
426
+
427
+ 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]);
428
+
429
+
430
+
431
+ double [] r = new double[3];
432
+
433
+ r[0] = m1x - g.x;
434
+
435
+ r[1] = m1y - g.y;
436
+
437
+ r[2] = 0;
438
+
439
+
440
+
441
+ double [] f = new double[3];
442
+
443
+ f[0] = 500;
444
+
445
+ f[1] = 200;
446
+
447
+ f[2] = 0;
448
+
449
+
450
+
451
+ double [] gaiseki = new double[3];
452
+
453
+ gaiseki[0] = (r[1] * f[2] - r[2] * f[1]) * derutat;
454
+
455
+ gaiseki[1] = (r[2] * f[0] - r[0] * f[2]) * derutat;
456
+
457
+ gaiseki[2] = (r[0] * f[1] - r[1] * f[0]) * derutat;
458
+
459
+
460
+
461
+ double [] kakusokudo = new double[3];
462
+
463
+ kakusokudo[0] = b[0][0] * gaiseki[0] + b[0][1] * gaiseki[1] + b[0][2] * gaiseki[2];
464
+
465
+ kakusokudo[1] = b[1][0] * gaiseki[0] + b[1][1] * gaiseki[1] + b[1][2] * gaiseki[2];
466
+
467
+ kakusokudo[2] = b[2][0] * gaiseki[0] + b[2][1] * gaiseki[1] + b[2][2] * gaiseki[2];
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+ // 角速度
476
+
477
+ omega = kakusokudo[2];
478
+
479
+
480
+
481
+ // 並進速度
482
+
483
+ v = new Point3D.Double(f[0] * derutat / (3 * mg), f[1] * derutat / (3 * mg), f[2] * derutat / (3 * mg) );
484
+
485
+
486
+
487
+ // 30ミリ秒おきに位置座標を更新して、描画更新要求
488
+
489
+ new javax.swing.Timer(30, e -> {
490
+
491
+
492
+
493
+ // 並進運動による位置更新
494
+
495
+ g.x += v.x;
496
+
497
+ g.y += v.y;
498
+
499
+ g.z += v.z;
500
+
501
+
502
+
503
+ // 各粒子の位置更新
504
+
505
+ for (Point3D.Double p : m) {
506
+
507
+ double x = p.x + v.x, y = p.y + v.y, z = p.z + v.z;
508
+
509
+ p.x = (x - g.x) * Math.cos(omega) - (y - g.y) * Math.sin(omega) + g.x;
510
+
511
+ p.y = (x - g.x) * Math.sin(omega) + (y - g.y) * Math.cos(omega) + g.y;
512
+
513
+ }
514
+
515
+
516
+
517
+ // 描画更新要求
518
+
519
+ repaint();
520
+
521
+ }).start();
522
+
523
+ }
524
+
525
+
526
+
527
+ public void paintComponent(java.awt.Graphics g) {
528
+
529
+ super.paintComponent(g);
530
+
531
+ // 粒子の描画
532
+
533
+ for(Point3D.Double p : m) {
534
+
535
+ // とりえあえず、直径を20にしてる
536
+
537
+ g.drawOval((int)p.x, (int)p.y, (int)p.z, 20, 20, 20);
538
+
539
+ }
540
+
541
+
542
+
543
+ }
544
+
545
+ }
546
+
547
+ ```
548
+
281
549
 
282
550
 
283
551
  ### 補足情報(FW/ツールのバージョンなど)

1

ソースコードの記入法

2019/01/03 10:26

投稿

kouya_tdu
kouya_tdu

スコア13

test CHANGED
File without changes
test CHANGED
@@ -12,6 +12,8 @@
12
12
 
13
13
  ### 該当のソースコード
14
14
 
15
+ ```Java
16
+
15
17
  import java.awt.geom.Point2D;
16
18
 
17
19
  import java.util.Arrays;
@@ -268,12 +270,12 @@
268
270
 
269
271
  }
270
272
 
273
+ ```
274
+
271
275
 
272
276
 
273
277
  ### 試したこと
274
278
 
275
-
276
-
277
279
  2Dの箇所を3Dに変えてZ軸に数値を入れたのですがうまく動きませんでした。
278
280
 
279
281