12/16 並行プログラミング


11/25の課題について


12/2の課題


12/9の課題


質問と解答

Q.
12/9に出された課題のHTMLファイルの作り方が良くわかりません。というより、
むしろ提出方法がわかりません。
もう少しわかりやすく説明していただけないでしょうか?

A.(小田原さん)
TAの小田原です。
HTMLファイルに(1)アプレットを表示させる のが課題ですが、それに加えて(2)
ソースコード、(3)用いた画像ファイルをそのHTMLファイルに掲載します。

(1)〜(3)までを必ず書き込んで置きましょう。
file:/home/cc26806/java/Kadai1209/index.html
に例を作ってみました。このアプレットでは不合格点だと思いますが(^^;、
HTMLの書き方的にはこんな感じでよいと思います。

HTMLを作成したら、それをindex.htmlという名前で~/java の下の Kadai1209 
というディレクトリに置き、課題提出用のコマンド
(/home/ktanaka/bin/report1209 1)を実行します。

% mkdir ~/java/Kadai1209
% mv (作成したHTMLファイル) ~/java/Kadai1209/index.html
% mv (作成した画像ファイル) ~/java/Kadai1209
% mv (アプレットのソースコード) ~/java/Kadai1209   
% cd ~/java/Kadai1209
% javac Hoge.java

( ここで、自分のブラウザから「file:/home/ユーザ名/java/Kadai1209/index.html」
を見て、正しく表示されるかどうかを確認する )

% /home/ktanaka/bin/report1209 1

ブラウザで課題のHTMLファイルを閲覧したら、アプレットが正しく表示される
ことを確かめておきましょう。

Q.
それと12/9の講義でアプレットプログラミングのページとアプレットプログラミング(2)のページのプログラムのどう言った状況で使い分けたらよいのでしょうか?
A.
TAの小田原です。

「アプレットプログラミング」では、ブラウザで動くプログラムの説明をして
います。普通のアプレットの説明です。
「アプレットプログラミング(2)」ではアプレットの応用として、アプレット
プログラムからHTMLファイルに貼りついていない独自のFrameを作成すること
もできる、という話です。
後者が前者の拡張になっているので、必要に応じて(2)で説明されたテクニッ
クを用いればよいのだと思います。
アプレットからウインドウを出せるということは、ユーザインタフェース的に
も同等のものが作成できるということですよね。制限はいろいろありますが。

A.
計プロTAの矢野です。

先ほど質問をいただきました、半透明な画像の描画について回答します。
授業中にすぐに答えられなくてすみませんでした。

透明度をつけた画像の合成は、
授業で現在利用しているGraphicsクラスではなく、
拡張されたGraphics2Dクラス(Graphicsクラスを継承しています)を利用すると
簡単に作ることができます。
(継承については
https://lecture.ecc.u-tokyo.ac.jp/~ktanaka/programming03/1028-6.html
を参考にしてください)

画像が合成できるプログラムとサンプル画像を添付しておきました。
下のプログラムをコンパイルして実行してみてください。
2つの画像が半透明に重なって描画されていると思います。
(描画完成までにひどくちらつきますがごめんなさい)

下のプログラムではpaintメソッドに注目してください。
まずGraphicsクラスのオブジェクトgを
Graphics2Dクラスのオブジェクトg2にキャストしてから作業します。
次に透明度を指定できるCompositeクラスを作成します。
下のプログラムでは2通り作りましたが、
指定したい透明度の分だけ作っておけばよいと思います。

それから画像を描画(drawImage)しますが、
描画の前にsetCompositeメソッドで透明度を設定します。
(授業の中で、たとえば赤い線を描くときなどに
g.setColor(red); などとしたと思いますが、基本的にはそれと同じ要領ですね。)

以降は、描画の透明度を変化させたいときに
適宜setCompositeしていくというかんじで
描画してゆけばよいかと思います。

授業の本筋とは少しずれてしまいましたが、
参考にしていただければと思います。

それでは失礼します。


--以下プログラム (CrossDissolve.java)

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

class CrossDissolve extends Frame {
  
  //イメージの読み込み
  Image img1 = getToolkit().getImage("sample1.png");
  Image img2 = getToolkit().getImage("sample2.png");

  public static void main(String[] args){
    WindowListener l = new WindowAdapter() {
      public void windowClosing(WindowEvent we) {System.exit(0);}
    };
    CrossDissolve f = new CrossDissolve();
    f.setSize(200, 200);
    f.setVisible(true);
    f.addWindowListener(l);
  }
  
  public void paint(Graphics g) {
    //gをアルファ合成が可能なGraphics2Dクラスにキャストして代入します
    Graphics2D g2 = (Graphics2D)g;
    
    //透明度のインスタンスを作成します
    Composite c1 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                                              .6f); /* 透明度0.6 */
    Composite c2 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                                              .3f); /* 透明度0.3 */
    
    //g2にアルファ情報のインスタンスを与えます
    g2.setComposite(c1);
    //img1は透明度0.6で描かれます
    g2.drawImage(img1, 10, 10, this);
    
    g2.setComposite(c2); //ここで透明度が0.3に設定されました
    //img2は透明度0.3で描かれます
    g2.drawImage(img2, 30, 30, this);
    
  }
}

最終課題について

1月25日(日) 21:00までに,好きな題材を選んで Java 言語でプログラムを作 成し,そのプログラムの説明をする HTML 文書を作成しなさい. 「~/java/Kadai1216/」というディレクトリを 作成し,HTML文書(index.html)とプログラムはすべて,その下に作成すること.

その上で, 最終回の1月27日(火)に,教卓上のNCを使って,発表(デモンストレーションと プログラムの説明)をしてもらい(提出人数によっては全員ではなくこちらの指 定した人だけになると思います),それで評価します.


次へ進む