あなたは、クラスを少しあなたを再構築できますが、それは別の独立したクラスが必要になります。 2Dと3Dの数学的なベクトルクラスのセットを作成することができますが、ベクターによって加算、減算、掛け算、スカラーなどのベクトルが行うことができるすべてのオーバーロードされた演算子と数学関数を持つ必要があります。クロス製品は心配する。メソッド、長さなどを正規化する必要があります。一度あなたはこれらの働く数学ベクトルクラスを持っています。次に、ベクトルを使用して形状クラスを再設計することができます。または、独自のベクトルクラスを作成する代わりに、OpenGLでの作業に使用されるGLMの数学ライブラリなどの数学ライブラリクラスを使用できます。これはフリーでオープンソースであり、ヘッダーのみのライブラリでもあります。パスにライブラリをインストールしたら、ヘッダをインクルードするだけです。リンクについて心配する必要はありません。そして、これらのベクトルのクラスでそれを行うのは、あなたの形状クラスで数学をより容易になり、形状クラスを設計するために容易になるだろう。そして、継承され
#include <glm\glm.hpp>
// Needed If Doing Matrix Transformations: Rotation, Translation Scaling etc.
// #include <glm\gtc\matrix_transform.hpp>
class Shape {
public:
enum Type {
NONE = 0,
TRIANGLE,
SQUARE,
CIRCLE,
};
protected:
Type type_;
glm::vec4 color_ { 1.0f, 1.0f, 1.0f, 1.0f }; // Initialize List Set To White By Default
double perimeter_; // Also Circumference for Circle
double area_;
// double volume_; // If in 3D.
public:
// Default Constructor
Shape() : type_(NONE), color_(glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)) {}
// User Defined Constructors
// Sets Shape Type Only Color Is Optional & By Default Is White
explicit Shape(Type type, glm::vec4 color = glm::vec4()) : type_(type), color_(color) {}
Type getType() const { return type_; }
void setType(Shape::Type type) {
if (type_ == NONE) {
// Its okay to set a new shape type
type_ = type;
}
// We Already Have a Defined Shape
return;
}
// Getters That Are Commonly Found Across All Shapes
double getPerimeter() const { return perimeter_; }
double getArea() const { return area_; }
// Common Functions that can be done to any shape
void setSolidColor(glm::vec4 color) { color_ = color };
glm::vec4 getColor() const { return color; }
// Common Interface That All Shapes Share But Must Override
virtual double calculateArea() = 0;
virtual double calculatePerimeter() = 0;
// Since we do not know what kind of shape to modify until we have one
// to work with, we do not know how many parameters this function will need.
// To get around this we can use a function template and then have overloads
// for each type we support
template<typename Type = Shape>
virtual void modify(Type* pShape /*,glm::vec3... params*/);
// Overloaded Types: - Should Be Defined & Overridden By the Derived Class
virtual void modify<Triangle>(Triangle* pTriangle, glm::vec3, glm::vec3, glm::vec3, glm::vec4 = glm::vec4()) { /* ... */ }
virtual void modify<Circle>(Cirlce* pCircle, float radius, glm::vec4 color = glm::vec4()) { /* ... */}
};
:ここでは擬似コードはどのように見えるかの例ですクラスは次のようになります。
class Triangle : public Shape {
public:
// Could Be An Option To Where This is a base class as well to specific types of triangles:
enum TriangleType {
Acute = 0,
Right,
Equilateral,
Obtuse
} // then each of these would have properties specific to each type
private:
glm::vec3[3] vertices_;
public:
// Default Constructor
Triangle() : Shape(TRIANGLE) {} // Sets The Shape Type But Has No Vertices Or Area; just default construction
// Vertices But No Color
Triangle(glm::vec3 A, glm::vec3 B, glm::vec3 C) : Shape(TRIANGLE) {
vertices_[0] = A;
vertices_[1] = B;
vettices_[2] = C;
// Call These To Have These Values
calculatePerimeter();
calculateArea();
}
// Vertices & Color
Triangle(glm::vec3 A, glm::vec3 B, glm::vec3 C, glm::vec4 color) : Shape(TRIANGLE) {
vertices_[0] = A;
vertices_[1] = B;
vertices_[2] = C;
calculatePerimeter();
calculateArea();
}
// No Need To Do The Set & Get Colors - Base Class Does that for you.
// Methods that this shape must implement
virtual double calculateArea() override {
// Calculations For Getting Area of A Triangle
area_ = /* calculation */;
};
virtual double calculatePerimeter() override {
// Calculations For Getting Perimeter of A Triangle
perimeter_ = /* calculation */;
};
void modify<Triangle>(Triangle* pTriangle, glm::vec3, glm::vec3, glm::vec3, glm::vec4 = glm::vec4()) override { /* ... */ }
};
ここで情報を表示します。個人的に私はこれらのクラスでこれを実装しません。ただ、ちょうどこのようなgetters
を使用して購入画面やファイルに値を印刷するには、あなたの標準std::cout
やstd::ofstream
などを使用します。
#include <iostream>
#include "Triangle.h"
int main() {
Triangle t1(glm::vec3(0.0f, 1.0f, -1.3f), // Vertex A
glm::vec3(3.2f, 5.5f, -8.9f), // B
glm::vec3(-4.5f, 7.6f, 8.2f), // C
glm::vec4(0.8f, 0.9f, 0.23f, 1.0f)); // Color
std::cout << "Perimeter is " << t1.getPerimeter() << std::endl;
std::cout << "Area is " << t1.getArea() << std::endl;
return 0;
}
私は約IS様聞いたことがありません。この関係をどう定義しますか? –
"modifyShape関数ここで、シェイプの各パラメータは、ユーザーのパラメータに基づいて変更されます。"これは、明確な要件のようには見えません。 「ユーザーのパラメータに基づいて」とはどういう意味ですか?ユーザーが5を入力し、(7,8)の単位三角形と(1、-2)を中心とする単位円がある場合、予想される結果はどうなりますか? –