ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのベクトルの計算を行うクラスの作成について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
失礼します。
このような課題が出たのですが、よろしければ助言お願いします。
クラス自体は以下のような構成でつくります(若干、C言語向きに構成が与えられているかもしれません)。




クラス:Gvector

メンバー:double coord[4]

メソッド:Gvector(double,double,double) コンストラクタ

void set_coord(double,double,double) 引数の値を属性に保存

void get_coord(&double,&double,&double) 属性値を取ってくる

Gvector copy() ベクトルのコピー

Gvector cross(Gvector) 引数のベクトルとの外積を求める

double dot(Gvector) 引数のベクトルとの内積を求める

void normalize() 単位ベクトルにする

Gvector add(Gvector) 引数のベクトルとの和を求める

Gvector subtract(Gvector) 引数のベクトルとの差を求める

boolean equal(Gvector) 引数のベクトルと同じかどうかを判定

boolean null() 0ベクトルかどうかを判定する

void disp() ベクトルを表示する

コメント(26)

配列が[4]なのに、入れる値が3つなのは何故でしょう?
さらっと見ただけなので勘違いしてるかもしれませんが。。。
ぁ、あと、
>属性値を取ってくる
のに、void なのは何故?
何度もすみませんorz
>boolean null()
nullは予約語だから使えないです。
isNullとかならぉk。

ベクトルって何だっけってレベルの私には・・・orz・・・
コ(´・ェ・`)ロ さん>
コメありがとうございます☆
教授に確認してみたところ、配列が4っていうのは(x,y,z,1)ということだそうです。
属性値を取ってくる場合voidは使わないのですか??
すいませんまだ勉強不足でして。。

この課題自体が正直探り探りなものらしく少し問題がある箇所があるようです。。
void get_coord(&double,&double,&double)
これは参照渡しなのでvoidでいいのですが、Javaではdoubleのようなプリミティブ型の変数を参照渡しすることは出来ません。
C言語で出た課題であればこのコミュニティーで聞かれるのは適切でないかもしれません。

配列数が4なのはクオータニオンを使って計算するためでしょう。
恐らく後半で、アフィン変換などか変わってくるのではないかと思います。

確認になりますが、これはJavaの課題でしょうか?
もしそうだとすれば、このメソッド定義はJava的に正しいものではないため実現できません。
しのぶさん>
コメありがとうございます。

研究室で出された課題なのですが、JAVAをやっている人とC言語をやっている人にわかれていまして。
説明を受けた時も両方一緒でしたし配られた課題はまったく同じなんです。
教授がC言語の授業を担当しているので、メソッド定義もC言語向きにされてしまっているのかもしれません。

すいません、曖昧な感じになってしまって。
このままの定義をJavaで実装することは出来ないので、教授に相談するなどすると良いかと思います。

特にこの部分が問題です。
void get_coord(&double,&double,&double) 属性値を取ってくる

例えば、
void get_coord(double[])
のように(ほかにも方法はあります)なると思います。
>void get_coord(double[])
これもJavaでは無理でしょ…。

double[] get_coord()
とするのが一番Javaらしいと思いますよ。
>>void get_coord(double[])
>これもJavaでは無理でしょ…。

配列は参照渡しなので属性取得は可能です。
あー、ほんとだ。
でも使いにくい方法ですね…。

オブジェクト作っている以上、getterで取得する際は、
返り値があったほうが理解しやすいと考えてます。
しのぶさん>
問題箇所の指摘ありがとうございます。
そのあたりの話を教授に相談してみます。
その他にJAVAでプログラムする点で問題があるとこはあるでしょうか?
よければ教えてくださいm(__)m
檸檬さん>
コメントありがとうございますm(__)m

いろいろな表現の方法があるのですね。
JAVAを勉強し始めたのが、この4月からでして。。
まだ知識的にまったくダメなのでご指摘お願いします。
chunさん>
コメントありがとうございます。

少し話についていけてない部分もあるんですが、これから勉強します。
問題がありましたら、またご指摘のほうお願いします。
Javaっぽく作ってみました。
normalizeは知らないです。

public class Gvector{
final private double[] coord;
public Gvector(double[] coord){
this.coord=coord;
}
public double[] getCoord(){
return coord;
}
public Gvector copy() {
return new Gvector(coord);
}
public Gvector dot(Gvector vector) {
double[] coord2=vector.getCoord();
double[] d=new double[3];
d[0]=coord[0]*coord2[0];
d[1]=coord[1]*coord2[1];
d[2]=coord[2]*coord2[2];
return new Gvector(d);
}
public void disp(){
System.out.println("("+coord[0]+","+coord[1]+","+coord[2]+")");
}
public Gvector subtract(Gvector vector) {
double[] coord2=vector.getCoord();
double[] d=new double[3];
d[0]=coord[0]-coord2[0];
d[1]=coord[1]-coord2[1];
d[2]=coord[2]-coord2[2];
return new Gvector(d);
}
public Gvector add(Gvector vector) {
double[] coord2=vector.getCoord();
double[] d=new double[3];
d[0]=coord[0]+coord2[0];
d[1]=coord[1]+coord2[1];
d[2]=coord[2]+coord2[2];
return new Gvector(d);
}
public Gvector cross(Gvector vector) {
double[] coord2=vector.getCoord();
double[] d=new double[3];
d[0]=coord2[1]*coord[2]-coord2[2]*coord[1];
d[1]=coord2[2]*coord[0]-coord2[0]*coord[2];
d[2]=coord2[0]*coord[1]-coord2[1]*coord[0];
return new Gvector(d);
}
public boolean isNull() {
return 0==coord[0]&&0==coord[1]&&0==coord[2];
}
public boolean equal(Gvector vector) {
double[] d = vector.getCoord();
return d[0]==coord[0]&&d[1]==coord[1]&&d[2]==coord[2];
}
}
>檸檬さん

基本的に戻り値があったほうがgetterらしくて使い易いと私も考えます。

ただ、今回の場合
get_coord() でメンバ(coord)を返してしまうと、Gvectorに関係ないところで変更されてしまう可能性があります。Gvectorは数学的なvectorを表すクラスだと考えれば、外部で一貫性が破壊されるのは好ましくなありません。
このような場合は明示的に配列を渡し、値を(メンバへの参照ではなく)受け取るほうが、安全であると考えることもできます。

場合場合ですけどね。
ホントは配列じゃなくてCoordクラスを作った方がよいです。
適当に工夫して直してください。
>vectorに関係ないところで変更されてしまう可能性があります。

ゴモットモ。
ということで突っ込まれる前にリファクタしました。

public Gvector(double[] coord){
double[] d=new double[3];
System.arraycopy(coord, 0, d, 0, 3);
this.coord=d;
}
public double[] getCoord(){
double[] d=new double[3];
System.arraycopy(coord, 0, d, 0, 3);
return d;
}
>get_coord() でメンバ(coord)を返してしまうと、Gvectorに関係ないところで変更されてしまう可能性があります。
そうなら、chunさんの下のメソッドを使うのが僕は好きですね。

僕自身、あまり参照を意識したくないってのがあるのかな?
chunさん、ジュンセイさん>
プログラムを作っていただいてありがとうございますm(__)m
非常に参考になります!

(x,y,z,1)という部分ですが、教授が言うには(x,y,z)を1で割るのだそうです。結果的には何も変わりませんが、「1で割ることでちょっと良いことがある」と言っていましたあせあせ(飛び散る汗)

その辺りの詳しいプリントを配られたのですが今、手元にないので明日にでも確認してみます。
>21
補足していただき、ありがとうございます。
ただ、Coordを不変にするかどうか微妙です。
しのぶさんの指摘もわかりますし。

>22
是非。
ベクトルで4変数用いるのは、
斉次座標系での位置ベクトルを表現するためじゃないでしょうか?
斉次座標系とは、3次元の場合なら、
通常の座標が(x, y, z)である点を、
0でない任意の数wを用いて(xw, yw, zw, w)と表現します。
同じ座標の表現が複数通り与えられるわけです。
なぜこんな面倒な表記を取るのかというと、
コンピュータグラフィックス等での座標変換時に、
本来はベクトルの和で表されるべき空間内の「平行移動」を
他の変換である拡大・縮小や回転などと同じように
行列の積の演算のみで表現できるからなんです。
この辺はややこしい数学のお話ですね……。


なお、そのことを踏まえると、
normalizeとは、おそらく斉次座標の正規化のこと。
(x, y, z, w)で表されてるベクトルの内部情報を
(x/w, y/w, z/w, 1)という
簡単な形式に変換することではないでしょうか?

あ、トピ主さんは正しいかどうかご確認願います。
ゆ〜ゆ〜さん>
コメントと詳しい説明ありがとうございますm(__)m

難しいことはまだわからないのですが、ずばりその通りだと思います。
どうやら、このGvectorクラスはJAVAでJOGLを用いて立体グラフィックを表示させるための準備段階のようです。
実は、もう一つ行列の課題も同時に出されてるので間違いないと思います。

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング