2

Java の swing および awt ライブラリ (それらを初めて使用する) を正しく動作させるのに大きな問題があります。基本的には、ランダムに生成した三角形を作ってJPanelに表示したいです。しばらく取り組んでいますが、三角形が表示されないようです。

私は次のような RandomTriangle クラスを持っています:

import java.util.*;
import java.math.*;

public class RandomTriangle {

  private Random rand = new Random();

  private int x1, y1,     // Coordinates
              x2, y2,
              x3, y3;
  private double a, b, c; // Sides

  public RandomTriangle(int limit) {
    do { // make sure that no points are on the same line
      x1 = rand.nextInt(limit);
      y1 = rand.nextInt(limit);

      x2 = rand.nextInt(limit);
      y2 = rand.nextInt(limit);

      x3 = rand.nextInt(limit);
      y3 = rand.nextInt(limit);
    } while (!((x2 - x1) * (y3 - y1) == (y2 - y1) * (x3 - x1)));

    a = Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2));
    b = Math.sqrt(Math.pow((x3 - x2), 2) + Math.pow((y3 - y2), 2));
    c = Math.sqrt(Math.pow((x1 - x3), 2) + Math.pow((y1 - y3), 2));
  }


  public int[] getXCoordinates() {
    int[] coordinates = {this.x1, this.x2, this.x3};
    return coordinates;
  }

  public int[] getYCoordinates() {
    int[] coordinates = {this.y1, this.y2, this.y3};
    return coordinates;
  }
}

次に、JPanel を拡張する SimpleTriangles クラスを作成します。

import javax.swing.*;
import java.awt.*;

public class SimpleTriangles extends JPanel {

  public SimpleTriangles() {
    JFrame frame = new JFrame("Draw triangle in JPanel");  
    frame.add(this);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    frame.setSize(400,400);  
    frame.setLocationRelativeTo(null);  
    frame.setVisible(true);  
  }

  public void paint(Graphics g) {
    super.paint( g );
    RandomTriangle myTriangle = new RandomTriangle(150);
    int[] x = myTriangle.getXCoordinates();
    int[] y = myTriangle.getYCoordinates();

    g.setColor(new Color(255,192,0));
    g.fillPolygon(x, y, 3);
  }

  public static void main(String[] args) {
    RandomTriangle myTriangle = new RandomTriangle(300);
    for (int x : myTriangle.getXCoordinates())
      System.out.println(x);
    for (int y : myTriangle.getYCoordinates())
      System.out.println(y);

    SimpleTriangles st = new SimpleTriangles(); 
  }
}

私がひどく間違っていることはありますか?私が言ったように、Java で GUI をいじるのは初めてなので、うまくいくかもしれません。これを実行すると、グレーの空白の JPanel が表示されます。ただし、などのように座標を明示的に指定するとint[]x={0,150,300};、三角形が得られます。

ありがとうございました!

4

2 に答える 2

5

ポイントが同じ線上にないことを保証する式は、2 つのポイントが同じ線上にあることを保証しません。多くの場合、少なくとも 2 つの共線ポイントがあります。これを回避するには、次を使用します。

   ...
   } while (((x2 - x1) * (y3 - y1) == (y2 - y1) * (x3 - x1)));
于 2012-10-02T23:17:23.190 に答える
4

なぜそれが機能したのか簡単に説明していただけますか?

述語p = ((x2 - x1) * (y3 - y1) == (y2 - y1) * (x3 - x1))true、3 つの点が同一線上にある場合です。

ステートメントwhileは、共線上の 3 つの点が見つかった場合にのみループwhile (!p)を終了します。do

対照的に、@Reimeus のステートメント は、有効な三角形が見つかった場合にのみループwhile (p)を終了します。do

于 2012-10-03T04:54:44.487 に答える