練習問題

以下のようなクラスを作り、main関数で呼び出して、動作を確認しなさい。

  • 2次元のベクトルを表すcVec2クラスを作る
  • プライベートメンバ
    • メンバ変数
      • 実数で(x, y)座標 メンバ変数らしく宣言
  • パブリックメンバ:
    • コンストラクタを
      • 引数なし
      • x,yを引数でもち、座標を初期化するもの
    • メンバ関数(戻り値と引数は考えて)
      • セッター、ゲッター
      • メンバをプリントする printVec
      • ベクトルのスカラー倍を返す nmulVec関数
      • ベクトル同士の足し算を返す nplusVec関数
      • 内積を計算して返す iProduct関数
      • ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
        • 引数は、もう一つのベクトル(引数は何型?)、自分の位置と、引数で受け取った位置の距離を返す(型は何が適切?)

cVec2クラス

"cVec2.h"
#include <iostream>
 
class cVec2
{
	double x_, y_;
public:
	//引数付きコンストラクタ
	cVec2(double _x, double _y)
	:x_(_x), y_(_y){}
	//引数無しコンストラクタ
	cVec2():x_(0), y_(0){}
 
//セッター、ゲッター
	void SetXY(double _x, double _y);
	//ゲッターはそれぞれにしておいて使ったほうがいいよね
	double GetX(){return(this->x_);}//インライン定義
	double GetY(){return(this->y_);}//インライン定義
//メンバをプリントする PrintVec
	void PrintVec();
//ベクトルのスカラー倍を返す NmulVec関数
	cVec2 NmulVec(double _k);
//ベクトル同士の足し算を返す NplusVec関数
	cVec2 NplusVec(cVec2 _v);
//内積を計算して返す Iproduct関数
	double Iproduct(cVec2 _v);
//ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
	double DistanceBetweenVectors(cVec2 _v);
 
};
"cVec2.cpp"
#include "cVec2.h"
 
//セッター、ゲッター
void cVec2::SetXY(double _x, double _y)
{
	this->x_ = _x; //メンバ変数なのが分かるようにthisを使っておいた
	this->y_ = _y; //メンバ変数なのが分かるようにthisを使っておいた
}
//メンバをプリントする PrintVec
void cVec2::PrintVec()
{
	std::cout << "(" << this->x_ << "," 
                     << this->y_ <<  ")" << std::endl;  
}
//ベクトルのスカラー倍を返す NmulVec関数
cVec2 cVec2::NmulVec(double _k)
{
	cVec2 tmp; //作業用変数にメンバ(x, y)のk倍を計算する
	tmp.SetXY(_k*this->x_, _k*this->y_);
	return(tmp);
}
//ベクトル同士の足し算を返す NplusVec関数
//自分と_vを足す
cVec2 cVec2::NplusVec(cVec2 _v)
{
	cVec2 tmp; //作業用変数に(x_, y_)+_vを計算する
	double tx = this->x_ + _v.GetX();
	double ty = this->y_ + _v.GetY();
	tmp.SetXY(tx, ty);
	return(tmp);
}
//内積を計算して返す Iproduct関数
double cVec2::Iproduct(cVec2 _v)
{
	double tmp; //作業用変数に_v1・_v2を計算する
	tmp = this->x_*_v.GetX() + this->y_*_v.GetY();
	return(tmp);
}
//ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
double cVec2::DistanceBetweenVectors(cVec2 _v)
{
	//がんばれー
	double tmp;
	//tmp = 2点間の距離 
	return(tmp);
}

main.cpp

"main.cpp"
#include <iostream>
#include "cVec2.h"
 
using std::endl;
using std::cout;
using std::cin;
 
int main() {
	cVec2 p(3, 5);
	p.PrintVec();
	//pの4倍
	p.NmulVec(4.0);
	p.PrintVec();
	cVec2 p2(-4, 8);
	cVec2 tmp;
	tmp = p.NplusVec(p2);
	tmp.PrintVec();
	cout << "内積" <<  p.Iproduct(p2) << endl;
 
}
"cPoint.h"
#include <iostream>
 
class cPoint
{
	double x_, y_;
public:
	cPoint(double _x, double _y):x_(_x),y_(_y){}
	cPoint():x_(0),y_(0){}
	void SetX(double _x){ x_ = _x;}
	void SetY(double _y){ y_ = _y;}
	double GetX(){return(x_);}
	double GetY(){return(y_);}
};

cVec2クラスに ぶっこんでいきます。

"cVec2.h"
#include "cPoint.h"
#include <iostream>
 
class cVec2 {
  // double x_, y_;
  cPoint p_; //とあるx, yの値を持ったオブジェクト
public:
  //引数付きコンストラクタ
  //インスタンスイニシャライザで、メンバのクラスのコンストラクタ呼べるよ!
  cVec2(double _x, double _y) 
  : p_(_x, _y) {}
  //引数無しコンストラクタ
  cVec2() : p_(0, 0) {}
 
  //セッター、ゲッター
  void SetXY(double _x, double _y);
  //ゲッターはそれぞれにしておいて使ったほうがいいよね
  double GetX() { return (p_.GetX()); } //インライン定義
  double GetY() { return (p_.GetY()); } //インライン定義
  //メンバをプリントする PrintVec
  void PrintVec();
  //ベクトルのスカラー倍を返す NmulVec関数
  cVec2 NmulVec(double _k);
  //ベクトル同士の足し算を返す NplusVec関数
  cVec2 NplusVec(cVec2 _v);
  //内積を計算して返す Iproduct関数
  double Iproduct(cVec2 _v);
  //ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
  double DistanceBetweenVectors(cVec2 _v);
};
"cVec2.cpp"
#include "cVec2.h"
 
//セッター、ゲッター
void cVec2::SetXY(double _x, double _y)
{
	p_.SetX(_x); //p_.x_に_xをセット
	p_.SetY(_y); //p_.y_に_yをセット
}
//メンバをプリントする PrintVec
void cVec2::PrintVec()
{
	std::cout << "(" << p_.GetX() << "," 
                     << p_.GetY() <<  ")" << std::endl;  
}
//ベクトルのスカラー倍を返す NmulVec関数
cVec2 cVec2::NmulVec(double _k)
{
	cVec2 tmp; //作業用変数にメンバ(x, y)のk倍を計算する
	tmp.SetXY(_k*p_.GetX(), _k*p_.GetY());
	return(tmp);
}
//ベクトル同士の足し算を返す NplusVec関数
//自分と_vを足す
cVec2 cVec2::NplusVec(cVec2 _v)
{
	cVec2 tmp; //作業用変数に(x_, y_)+_vを計算する
	double tx = p_.GetX() + _v.GetX();
	double ty = p_.GetY() + _v.GetY();
	tmp.SetXY(tx, ty);
	return(tmp);
}
//内積を計算して返す Iproduct関数
double cVec2::Iproduct(cVec2 _v)
{
	double tmp; //作業用変数に_v1・_v2を計算する
	tmp = p_.GetX()*_v.GetX() + p_.GetY()*_v.GetY();
	return(tmp);
}
//ベクトルを座標とみなして2つのベクトルの距離を計算して返すメンバ関数
double cVec2::DistanceBetweenVectors(cVec2 _v)
{
	//がんばれー
	double tmp;
	//tmp = 2点間の距離 
	return(tmp);
}
"main.cpp"
#include <iostream>
#include "cVec2.h"
 
using std::endl;
using std::cout;
using std::cin;
 
int main() {
	cVec2 p(3, 5);
	p.PrintVec();
	cVec2 pzero;
	pzero.PrintVec();
 
	cVec2 tmp;
	//pの4倍
	tmp = p.NmulVec(4.0); 
	tmp.PrintVec();
 
	cVec2 p2(-4, 8);
 
	tmp = p.NplusVec(p2);
	tmp.PrintVec();
	cout << "内積" <<  p.Iproduct(p2) << endl;
 
}
  • game-engineer/classes/2022/game-programing-1/second-term/11/11-16-2.txt
  • 最終更新: 3年前
  • by root