アプリ版:「スタンプのみでお礼する」機能のリリースについて

スクロールーバーを移動させると、表示している正三角形がその場で回転するプログラムを作りたいのですが、まったくわかりません・・・。

正三角形を作る座標は既にできてます。cos、sinを使うやつですよね?

でも、スクロールバーの値を読み取って、どうやって回転するように座標に組み込むかがわかりません。
知恵を貸してくださいm(__)mお願いします。

A 回答 (3件)

 以下は、下のスクロールバーを動かすと上の三角形が回転するアプレットのサンプルです。


画数は、ページのparamタグで指定しています。

-----アプレット-----

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

public class triapp extends Applet {

VolatileImage OSI = null;
Graphics G;
int N, X[], Y[], W, H;
Scrollbar SB;

public void init() {

try {
N = Integer.parseInt(getParameter("N"));
} catch (Exception e) { N = 3; };

W = getWidth();
H = getHeight();

X = new int[N];
Y = new int[N];

setLayout(new BorderLayout());
SB = new Scrollbar(Scrollbar.HORIZONTAL, 0, 60, -314, 314 + 60);
add(SB, BorderLayout.SOUTH);
SB.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
MakeTriangle((double)e.getValue() / 100.0);
repaint();
};
});

};

public void start() {

OSI = createVolatileImage(W, H);
G = OSI.getGraphics();
G.setColor(Color.RED);

MakeTriangle(0.0);
repaint();

};

public void MakeTriangle(double t) {

G.clearRect(0, 0, W, H);

for (int i = 0; i < N; i ++) {
double d = 2 * Math.PI * (double)i / (double)N + t;
X[i] = (int)(Math.sin(d) * 100) + W / 2;
Y[i] = - (int)(Math.cos(d) * 100) + H / 2;
if (i == 0) G.drawOval(X[0] - 10, Y[0] - 10, 20, 20);
};

G.drawPolygon(X, Y, N);

};

public void paint(Graphics g) { if (OSI != null) g.drawImage(OSI, 0, 0, this); };
public void update(Graphics g) { paint(g); };

}

-----ページHTML-----

<html>
<head><title>Rotate Triangle</title></head>
<body><center>
<applet codebase="." code="triapp" width="320" height="280">
<param name="N" value="3">
<applet codebase="." code="triapp" width="320" height="280">
<param name="N" value="7">
</applet>
</center></body>
</html>
    • good
    • 0

Swing的(つまりMVC的)にやるなら、


スクロールバーからモデル(BoundedRangeModelオブジェクト)をゲットして、それにChangeListenerをaddします。ChangeListenerのstateChanged()メソッドの中で、スクロールバーのgetValue()の値を見ながら角度を表すパラメータthetaの値を変えて、三角形を表示しているパネルのrepaint()をコールします。

三角形を表示しているパネルのpaintComponent()の中では、引数のGraphics->Graphics2Dがrotate(theta, x, y)をコールします。x,yは座標変換(translate)の量です。以上により、回転が実現します。
    • good
    • 0

ソースコードを見ないと何ともいえませんが


スクロールバーのクラスとして、
たとえば、JScrollBarを使っているとすると
そのgetValueメソッドでスクロールバーの値を取得し
Math.PIとかけ合せて、10でも20でも好きな数で割った値を
cos、sinの引数に足し算すれば求まるのではないのでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!