• ベストアンサー

矢印を描画

JAVAで矢印を描画したいのですが、どうしたらいいのかわかりません。 矢印の位置をFOR文でx、yの値を変えながら、いくつもつくりたいのですが・・・。また、角度も変えていきたいのですが・・・。 なにかそのような命令があるのでしょうか?? ないのなら、どう書いたらいいか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

Javaの2Dグラフィクスを最初からちゃんと勉強しましょう。 出発点は: http://java.sun.com/docs/books/tutorial/2d/TOC.htmlhttp://java.sun.com/products/java-media/2D/samples/suite/index.html 矢印を描くコードの参考例は、ネット上にたくさんあります。ここではそのひとつを: http://forum.java.sun.com/thread.jspa?forumID=20&threadID=5190827

ryouou
質問者

お礼

すぐの回答、ありがとうございます。 わかりました。まだまだ不勉強だったんですね。 教えてくださってありがとうございます。 頑張ってみます☆

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

汎用性/再利用性のある矢印線オブジェクトを作ってみました。大急ぎで作ったのでアラがあると思いますが、参考になれば幸いです。 ----------------------------------------------------- /* 片方だけ矢がある矢印線 */ import java.awt.*; import java.awt.geom.*; import javax.swing.*; import static java.awt.RenderingHints.*; public class OneSideArrow extends Path2D.Float{  enum Side{LEFT, RIGHT};  Point start;  Point end;  double length;  double slope; //radian  int angle; //degree  double theta; //radian  int barblen;            //起点,終点,矢羽根の角度,矢羽根の長さ  public OneSideArrow(Point s, Point e, int a, int b){   start = s;   end = e;   length = start.distance(end);   slope = getSlope(start, end);   angle = a;   theta = Math.toRadians(angle);   barblen = b;   moveTo(start);   append(new Line2D.Double(start, end), false);   attachBarb();  }  public void attachBarb(){   append(getBarb(Side.LEFT), false);   append(getBarb(Side.RIGHT), false);  }  private Line2D getBarb(Side s){   double slant = s == Side.LEFT ? slope + theta : slope - theta;   double tipx = end.x - barblen * Math.cos(slant);   double tipy = end.y - barblen * Math.sin(slant);   return new Line2D.Double(end.x, end.y, tipx, tipy);  }  public double getSlope(Point ps, Point pe){   double dy = pe.y - ps.y;   double dx = pe.x - ps.x;   return (Math.atan2(dy, dx));  }  public void moveTo(Point p){   moveTo((float)p.x, (float)p.y);  }  // このバージョンでは不使用  public void lineTo(Point p){   lineTo((float)p.x, (float)p.y);  }  /* テスト用のパネル */  static class DrawPanel extends JPanel{   Shape shape;   RenderingHints rh;   DrawPanel(Shape shp, int width, int height){    shape = shp;    setPreferredSize(new Dimension(width, height));    setBackground(Color.white);    rh = new RenderingHints(null);    rh.put(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);    rh.put(KEY_STROKE_CONTROL, VALUE_STROKE_PURE);   }   public void paintComponent(Graphics g){    super.paintComponent(g);    Graphics2D g2 = (Graphics2D)g;    g2.setRenderingHints(rh);    g2.setStroke(new BasicStroke(2.0f));    g2.setPaint(Color.red);    if (shape != null){     g2.draw(shape);    }   }  }  /* テスト */  public static void main(String[] args){   JFrame frame = new JFrame();   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   OneSideArrow arrow    = new OneSideArrow(new Point(15, 15), new Point(185, 175), 18, 13);   DrawPanel dp = new DrawPanel(arrow, 200, 200);   frame.getContentPane().add(dp, BorderLayout.CENTER);   frame.pack();   frame.setVisible(true);  } } ------------------------------------------------

ryouou
質問者

お礼

わざわざ、ありがとうございます☆ 自分でも、ちゃんとつくれるよう、_ranco_さんのをみながら、 勉強します(^^)

全文を見る
すると、全ての回答が全文表示されます。
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

長い線を1本と、小さな線を2本描くのでOK? それとも、矢の部分は図形? どっちにしても、いちいちdrawLine()するのでなく、そのようなShapeオブジェクト、とくにPath2Dオブジェクトを定義して、角度などはオブジェクトをコンストラクトするときのパラメータにすればよいでしょう。

ryouou
質問者

お礼

さっそくの回答ありがとうございます。 はい、長い線を1本と、小さい線を2本です。 すいません・・・。 >>Shapeオブジェクト、とくにPath2Dオブジェクト とは、何のことかがわからないのですが・・・。 まだまだ、勉強不足で・・・。 教えてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Javaからパイプでデータ送信しGnuplot描画

    大変お世話になります。 以下のスロットで、Javaから単純にGnuplotのsin(x)コマンドを実行させ、描画される方法が紹介されていました。 http://okwave.jp/qa/q5427703.html 今回、上記の改良として以下の2点についてご質問させて頂けますでしょうか。 1)Java側で、例えば y=sin(x) の、x値(for文により生成)、y値を計算させ表示。 同時にこの、x値、y値を(多分)パイプ経由で、Gnuplot側に送りそれを描画させる方法。 (Javaから"plot sin(x)"を指示するのではなく、Gnuplotにはデータ値を送付) 2)及び上記描画(プロット)表示を、アニメーション的に描画される方法。 多分、こちらもJava側でGnuplot向けの描画コマンド中にfor文を用意し、x値とそのy値のセットを順次・動的にGnuplot側に送り出す事が必要と思います。 (C言語では同様のアニメーション表示が出来ている記載が別webにあり、sin(x)波がニョロニョロと動くように描画されています) http://ayapin-film.sakura.ne.jp/LJ/Docs/40th.pdf http://www.eng.kagawa-u.ac.jp/~haruna/memo/gnuplot/gnuC.html http://kabuto.phys.sci.osaka-u.ac.jp/~yuhii/pc/gnuplot_animation.html 以上2点をご存知でしたら、教示して頂きたいと思います。 ご理解頂ける方がいらっしゃいましたら、ご指導宜しくお願い致します。

  • 描画

    DirectXで扇形を描画する質問です。 60度の角度で上方向に扇形を描画さしたいのですが(円弧の方が上) 開始地点は275から半径50の扇形を描画さしたいのですが pD3Device->SetTexture(0, pTexture[0]); pt[0].x = 250.0f; pt[1].x = 300.0f; pt[3].x = 275.0f; pt[2].x = 275.0f; pt[0].y = 225.0f; pt[1].y = 225.0f; pt[2].y = 275.0f; pt[3].y = 275.0f; pt[0].tu = pt[3].tu = 0.0f  / 1024; pt[1].tu = pt[2].tu = 200.0f / 1024; pt[0].tv = pt[1].tv = 0.0f  / 1024; pt[2].tv = pt[3].tv = 200.0f / 1024; pD3Device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,pt,sizeof(CUSTOMVERTEX)); このままでは、斜面が50の三角形ができただけで・・・ pt[0].xとpt[1].xは、ただ単に50とゆうだけで角度で表していないので場所は変わるかと思いますがpt[2].xとpt[3].xは275から開始でお願いします。 これを扇形にしたいのですが、どなたかご教示ください。お願いします。

  • Java3Dにおける再描画

    Java3Dで,例えば. (1.0+x,1.0+y,1.0+z)のBOXを,ボタンを押すごとにx,y,zにランダムの数値が入れ形状を変化させるプログラムを作りたいのですが,再描画の方法がわかりません. どなたか教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • Double型の座標の描画の仕方

    以下のようなデータで 横軸をx、縦軸をyとするような 波形を描画したいのですが yがDouble型のためDrawLineを使えません。 y*1000として小数点以下をなくしても こんどは値が大きすぎて画面外に表示されるように ないます。どのように対処すればよいでしょうか。 x y 0 0.223 20 0.637 40 0.494 60 -0.436

  • アルゴリズム : 円描画

    画像を作ってるのですが、円描画のまともな方法が分かりません。 現在は、数学っぽいサイトを検索した所円の方程式は r2乗 = X2乗 + Y2乗 と言うのが出てきたのでそれを元に作ってます。 具体的には、y軸に近い部分はx軸から。x軸に近い部分はy軸から描画を始め、 それそれ8回に分けて一つの円を描画しまてす。 イメージ的には rを定数とし、y軸の直下や真上付近ならx軸を一つづつずらし、yの値を求めます。 x軸の右側付近とかならy軸をずらします。 数学風に書くと y ** 2 = (x + n) ** 2 + r ** 2 みたいなイメージです。(n = 何個目のドットを描画しているか。**はPerlなどでべき乗)。 これの平方根を求めて端数を四捨五入してます。 この方法だと軸から遠ざかると塗りつぶすドットが飛び飛びになるので8回(もしくは4回)の描画が必要です。 問題はまず、 それが一般的な方法かどうかと言う点です。8回に分けるもんだから処理が汚いです。 さらになぜか、円も汚いです。 いや理由はだいたい分かるんですけど、ドット数に少数点とかないから四捨五入とかしてます。 すると、どうもちゃんとした円にならないです。そこドットの描画一個ズレてるだろコレ? おまえそれ、明らかに1ドットずらしたほうが綺麗な円になるぞ? みたいことが起きます。 もう一つ、他の疑問なんですがちょっと数学的な疑問で、 円を1/8づつ描画させるにはnのループ回数を n = r / (1.4140 < m < 1.4146) くらいの値に設定しなきゃならないことが分かりました。 なぜ割り算させたのかはもう覚えてません。 一つづつ手作業で確かめて絞り込んだ数値なのですが、 どうもmが2の平方根に似ている気がします。 なぜこうなるんでしょう。たぶん数学的な何かだと思うのですが。 なお数学的な知識は全然ないです。学校では一日中寝るのが特技でした。 まさかこんな技術が必要になるとは…。

  • 図の上に、斜めの線を繰り返し描画する方法

    はじめまして。 PHP&JavaScriptで作成したプログラムより、 ブラウザ(Firefox or IE)で図の上に斜めの線を描画する方法について 知恵をお貸し頂きたいです。 やりたい事としては、以下のとおりです。 (1)ある座標A(x1,y1)とB(x2,y2)が計算で求められます。 (2)既に描画されている図の上にAからBへ線(できれば矢印)を引きます。 (3)(1)と(2)が繰り返されます。 ということを実現したいです。 ↓のようなイメージなのですが、 経験がほとんどなく理解が浅い段階なので、そもそも間違っているかもです。 アドバイス頂けると幸いです。 よろしくお願いします。 ---- … <script> function paint(x1, y1, x2, y2) { /* */ } </script> <body onload="paint()"> for() { /* x1, y1, x2, y2 が求まる */ echo "<div>"; echo ""; //paint()呼び出し echo "</dev>"; } ・・・ ----

    • ベストアンサー
    • PHP
  • 円弧の描画について

    円弧の描画について お世話になります。 Visio2007を使用しています。 Visioで円を描画し、その円の情報を基に計算を行い、円弧の作成をしたいと考え ていますが、計算方法が分からずご質問させて頂きました。 以下の【元となる情報】から【求める情報】を計算にて求めます。 【元となる情報】 左上X座標:円の左上X座標 左上Y座標:円の左上Y座標 幅:円の幅 高さ:円の高さ 始点角度:円弧の始点の角度(円の中心から右方向を0度とし       時計回りの角度) 終点角度:円弧の終点の角度(始点角度を0度とし時計回りの角度) (始点角度と終点角度は1度単位で設定をします) 【求める情報】 http://msdn.microsoft.com/ja-jp/library/cc344284.aspx 例えば、 ・始点角度が0度、終点角度が90度の時は円の右下1/4の円弧が作成される ・始点角度が90度、終点角度が180度の時は円の左半分の円弧が作成される 以上の様な円弧を求めるような計算方法をご存知でしたらご教授 お願い致します。

  • 図の上に、斜めの線を繰り返し描画する方法

    はじめまして。 板違いでしたので、改めて書き込ませて頂きます。 PHP&JavaScriptで作成したプログラムより、 ブラウザ(Firefox or IE)で図の上に斜めの線を描画する方法について 知恵をお貸し頂きたいです。 やりたい事としては、以下のとおりです。 (1)ある座標A(x1,y1)とB(x2,y2)が計算で求められます。 (2)既に描画されている図の上にAからBへ線(できれば矢印)を引きます。 (3)(1)と(2)が繰り返されます。 ということを実現したいです。 ↓のようなイメージなのですが、 経験がほとんどなく理解が浅い段階なので、そもそも間違っているかもです。 アドバイス頂けると幸いです。 よろしくお願いします。 ---- … <script> function paint(x1, y1, x2, y2) { /* */ } </script> <body onload="paint()"> for() { /* x1, y1, x2, y2 が求まる */ echo "<div>"; echo ""; //paint()呼び出し echo "</dev>"; } ・・・ ----

  • JAVAのプログラミングについて質問があります。

    私は今、javaのGUIのAWTについてのプログラミング問題で頭を抱えています。自分でも一応考えてみたのですが1週間やってみましたが歯がたちません。お忙しいところ恐縮なのですが問題の答えを示してもらえると大変助かります。以下が問題文です。「1953×2250pixelの画像を以下の方法で描画するプログラムを作成しなさい。 配列pixelcolor[1953][2250]に0から254までの値が与えられている。0を黒、254を白、その中間は値が大きくなるほど白に近づくグレーとし、配列pixelcolor(x.y)の値からpixel(x.y)を描画する。」 どうかお願いいたします。

    • ベストアンサー
    • Java
  • visual C++ 2008 矢印の描写

    visual C++ 2008 のマネージアプリケーションで矢印を描きたいのですが、線しか描けません。 角度に応じて先端に三角形をつける、もしくは直接矢印を描く方法があるなら教えてください。 ちなみに線は、 Graphics^ gr = this->CreateGraphics(); gr->DrawLine(Pens::Black,x1,y1,x2,y2); で描いています。 入門用の参考書を頼りにプログラムしていたのですが、載っていなかったので質問させていただきました。よろしくお願いします。