質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1169閲覧

2つの三次元ベクトルから角度を求める問題。

NON36142293

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/02/05 12:10

実現したいこと

以下に示すプログラムをmul()メソッドを用いたものに変更したい。
※自分はEx02とvectorクラスを別々のファイルに分割して実行しています。

前提

①vector型オブジェクトをパラメータとして、自分自身とそのパラメータとの内積を計算し、戻り値とするメソッド。
②vector型オブジェクトをパラメータとして、自分自身とパラメータの2つのベクトルのなす角度を求めるメソッド。InProdメソッドを用いて作成すること。2つのベクトルa,bがなす角度θは、 
θ=〖cos〗^(-1) ((a・b)/√((a・a)*(b・b)))
で、計算できる。a・b は、ベクトルaとベクトルbの内積である。
③double型オブジェクトをパラメータとして、自分自身とその値との積を計算し、vector型のオブジェクトを戻り値とするメソッド(自分自身を書き変えてはいけない)
④ベクトル (1, 1, 0)とベクトル (1. 0. 1) とがなす角を求め、「度」単位で出力するプログラム。

分からないこと

mul()メソッドについて分からないことは2つで、
①どこから呼び出せば良いのかが分からない。
②returnにvector型が用いられているものの、何をどう返せばよいかが分からない。
”vector型のオブジェクトを戻り値とするメソッド(自分自身を書き変えてはいけない)”という条件がいまいち呑み込めません。

内積を計算するうえでmulを用いるのかな?と考えたものの、すべてInProd()内で解決してしまっているので題意を満たす意味としてもmul()を用いたものしたいと考えています。

該当のソースコード

java

1//Ex02クラス 2public class Ex02 { 3 public static void main (String[] args){ 4 vector a = new vector(1,0,1); 5 vector b = new vector(1,1,0); 6 double theta = a.angle(b); 7 System.out.println(theta); 8 } 9} 10 11//vectorクラス 12public class vector{ 13 14 private double a, b, c; 15 16 public vector(double p1, double p2, double p3){ 17 a = p1; 18 b = p2; 19 c = p3; 20 } 21 22 public double InProd(vector v){ //aとbの内積 23 return (this.a * v.a) + (this.b * v.b) + (this.c) * v.c; 24 } 25 public double angle(vector v){ 26 double theta; 27 theta = this.InProd(v)/Math.sqrt(this.InProd(this)*v.InProd(v)); 28 theta = Math.acos(theta); 29 theta = theta * 180.0 / Math.PI; 30 return theta; 31 } 32 //public vector mul(double a) { ③ } 33}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/02/05 12:18 編集

> 題意を満たす意味としてもmul()を用いたものしたいと考えています。 mulを使わないと、問題のどの箇所を満たさなくなるんですか? どうしてもmulを使いたいなら a.mul(1.0) をどこかに挟めばいいのでは?
NON36142293

2023/02/05 13:02

回答ありがとうございます。 一旦検討してみます。 題意を満たさなくなるという件に関しましたは、③のところだけ空白だど問題的にどうなのかと考えたので策を練ってた次第です。
episteme

2023/02/05 13:50 編集

> 一旦検討してみます。 何を? > ③のところだけ空白だど問題的にどうなのかと考えたので策を練ってた次第です。 どんな策? mul を実装すればいいんでしょ?
episteme

2023/02/05 13:53

> ”vector型のオブジェクトを戻り値とするメソッド(自分自身を書き変えてはいけない)”という条件がいまいち呑み込めません。 vector v = ... vector u = v.mul(123); とやっても v に変化がない ってことです。
NON36142293

2023/02/05 15:15

このような掲示板をあまり使ったことが無い故、やりとりが下手なのをお許しください。上記の解説で少し理解が進みました。 ありがとうございます。
guest

回答2

0

ベストアンサー

題意を満たしているかどうかは判りませんが、こんな感じで。

java

1 public double angle(vector v){ 2 double theta; 3 vector vNorm = this.mul(Math.sqrt(v.InProd(v))); 4 theta = Math.acos(this.InProd(v) / Math.sqrt(vNorm.InProd(vNorm))); 5 theta = theta * 180.0 / Math.PI; 6 return theta; 7 } 8 9 public vector mul(double a) { 10 return new vector(a * this.a, a * this.b, a * this.c); 11 }

投稿2023/02/05 15:01

編集2023/02/05 15:30
melian

総合スコア19803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NON36142293

2023/02/05 15:19

回答ありがとうございます。 参考になりました。 自分の質問の仕方が悪かったのですが、新たなクラスの追加は無しとなっています。(自分の質問ミスです 修正、加筆するとしたら既存のメソッドの内に新たに書き加える又は消去、という形になります。 ですので、main、vector、InProd、mul()の中でのみ書き加えていただければ助かります。
melian

2023/02/05 15:30

更新しました。
NON36142293

2023/02/06 00:39

ありがとうございます。実行結果をきちんと出せたのでBAとさせていただきます。
guest

0

θ=〖cos〗^(-1) ((a・b)/√((a・a)*(b・b))) において、
a・b , a・a , b・b の結果はすべてスカラー。

なのでこの式に mulすなわち ベクター * スカラー を適用する箇所が見当たらない。

投稿2023/02/05 12:15

編集2023/02/05 12:20
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問