0

わかりました親愛なる皆さん、私はこの質問を持っていますが、それを解決する特定の方法を本当に知りません. 私はJavaで「ペイントアプリケーション」のようにやっています.すべての準備ができていることは知っていますが、コンピュータグラフィックスアルゴリズムで形状をペイントする必要があります.

つまり、形状がコンテナーにペイントされたら、形状を選択して移動できるように、一種の「オブジェクト」のように変換するにはどうすればよいですか (別のアルゴリズムで移動する必要があります)。画面内でクリックされたランダムなポイントがオブジェクトに属していることをどのように知ることができるかを知るには、それを(アルゴリズムで)塗りつぶすことができます。

Point クラスと Shape クラスがあり、画面をクリックすると座標が取得され、すべての形状とそのポイントが表示されると考えていましたが、これはあまり効率的ではない可能性があります。アイデアはありますか?助けてくれてありがとう。これが私のコードの一部です:

public class Windows extends JFrame{

private JPanel panel;
private JLabel etiqueta,etiqueta2;
public Windows() {
    initcomp();
}
public void initcomp()
{
    panel = new JPanel();
    panel.setBounds(50, 50, 300, 300);
    etiqueta = new JLabel("Circulo Trigonometrico");
    etiqueta.setBounds(20, 40, 200, 30);
    etiqueta2 = new JLabel("Circulo Bresenham");
    etiqueta2.setBounds(150, 110, 200, 30);

    panel.setLayout(null);
    panel.add(etiqueta);
    panel.add(etiqueta2);
    panel.setBackground(Color.gray);
this.add(panel);
    this.setLayout(null);
    this.setVisible(true);
    this.setSize(400,400);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics g){
    super.paint(g);
       Graphics2D g2d = (Graphics2D) g;
       g2d.setColor(Color.red);
       g2d.setStroke(new BasicStroke(2));

       dibujarCirculo_bresenham(g2d, 50, 260, 260);
       dibujarCirculo_trigonometrico(g2d, 50, 130, 200);
}
/*This functions paints a Circle*/
public void dibujarCirculo_trigonometrico(Graphics g,int R,int xc,int yc)
{

      int x,y;
      for (int i = 0; i < 180; i++) {
        double angulo = Math.toRadians(i);
        x = (int) (Math.cos(angulo)*R);
        y = (int) (Math.sin(angulo)*R);
        g.drawLine(x+xc, y+yc, x+xc, y+yc);
        g.drawLine((-x+xc), (-y+yc), (-x+xc), (-y+yc));
    }
 }
4

2 に答える 2

0

どの画像も有効であると想定しています (特定の形状のセットに制限されていません)。同様のプロパティを持つ連続した領域を取得するには、塗りつぶしを使用してみてください。

ここに画像の説明を入力

特定の形状に色を付けたり移動したりするには、塗りつぶしを使用してピクセルのセットを決定し、それに応じてセットを操作できます。同様の色相などに許容範囲を設定して、ペイントのように厳密ではなく、Photoshop の魔法の選択ツールのようにすることができます。

于 2013-05-29T04:03:25.743 に答える
0

正確に何を望んでいるかに応じて、ここで取るべきアプローチがいくつかあります。

1) オブジェクトを、画面上に描かれたものごとに 1 つずつ、Circle、Rectangle、Polygon などのクラスを持つことです。paint (画面上に描画する方法)、isCLickInsideOf (サイズ/位置などを指定して、この形状に含まれる画面上のこの時点でのクリックか?) などのメソッドを定義します。次に、画面を再描画するために各オブジェクトを描画し、オブジェクトがクリックされているかどうかをテストするために、各オブジェクトにどう思うか尋ねます。

2) オブジェクトの色が均一である場合、ユーザーがフラッドフィル アルゴリズムを使用してピクセルの 1 つをクリックすると、形状を構成するすべてのピクセルを取得できます。次に、これらをある種のデータ構造にロードしたり、ユーザーがマウスを動かしたときにそれらを移動したりできます。また、すべてのオブジェクトが一意の色を持っていることが保証されている場合は、見ただけでどのオブジェクトがクリックされているかをテストできます。カラーで。(OpenGL のようなライブラリは、このようなトリックを使用して、クリックしたオブジェクトを特定することがあります。各オブジェクトを非表示のフレームに単色で描画し、マウス ポインターの下のピクセルの色をテストします)

于 2013-05-29T05:27:26.577 に答える