4

私の最後の質問は 2 分後に閉じられました。私は単にメンバー関数の助けを求めています。以下をチェックするメンバー関数が必要です。

  1. 正方形が別の正方形の外部にあるかどうか。
  2. 正方形に別の正方形が含まれているかどうか。
  3. 正方形が別の正方形に含まれているかどうか。
  4. 正方形が別の正方形に外部的に接しているかどうか (つまり、それらの境界が接触しているかどうか、しかしそれらの境界点を除いて、それらは互いに外部にあるかどうか);
  5. 正方形が別の正方形に内部的に接しているかどうか (つまり、境界上に共通の点がありますが、それらの境界点を除いて、1 つの正方形が他の正方形に含まれています)。
  6. 正方形の境界線が別の正方形の境界線と交差するかどうか。

私のプライベートメンバーは次のとおりです。

次に、x と y の両方を使用して周長と面積を計算するパブリック メンバー関数を使用する必要がありますか?

これは私がこれまでに持っているものです:ヘッダーファイル

#include  <iostream>
#include  <cmath>
class Square
{
int x, y;
int  size;

public:
Square(int x, int y, int size) : x(x), y(y), size(size) { }
~Square() {};
bool isExternal(const Square& rhs);
bool contains(const Square& otherSquare);
bool iscontained(const Square& otherSquare);

bool borderintersect (const Square& otherSquare);
bool bordertangent (const Square& otherSquare);
}

実装

#include "Square.h"


bool Square::isExternal(const Square& rhs) const {
    return (((x < rhs.x) || ((x + size) > (rhs.x + rhs.size)) &&  ((y < rhs.y) || ((y + size) > (rhs.y + rhs.size)) 
};
bool Square::contains(const Square& otherSquare)const {
};
bool Square::iscontained(const Square& otherSquare)const {
};

bool borderintersect(const Square& othersquare)
{
// If this square's bottom is greater than the other square's top
if ((this->y - (this->size / 2)) > (othersquare->y + (othersquare->size / 2)))
{
    return (false);
}
// the reverse
if ((this->y + (this->size / 2)) < (othersquare->y - (othersquare->size / 2)))
{
    return (false);
}
// If this square's left is greater than the other square's right
if ((this->x - (this->size / 2)) > (othersquare->x + (othersquare->size / 2)))
{
    return (false);
}

if ((this->x + (this->size / 2)) < (othersquare->x - (othersquare->size / 2)))
{
    return (false);
}
return (true);

bool Square::bordertangent (const Square& otherSquare)const {
};

テストプログラム

#include "Square.h"
#include <iostream>
using namespace std;

  int main() {

Square sq1(0, 0, 10);
Square sq2(1, 1, 10);

    if(sq1.isExternal(sq2)) {
    cout<<"Square 1 is external to square 2"<<endl;
}

if(sq1.contains(sq2){
    cout<<"Square 1 contains square 2"<<endl;

return 0;
}

座標とサイズの x と y の両方を取得するために、これをヘッダー ファイルに含める必要がありますか?

double  getX( )  const {  return x;  }
double  getY( )  const {  return y;  }
double  getSize( )  const {  return size;  }               
4

2 に答える 2

3

クラスの実装をどこから始めればよいか迷っているようです。そのため、いくつかのガイダンスを提供します。あなたの質問はすべて、ある座標空間での 2 つの正方形の相対位置の確認に関するものです。それらに答えるには、各正方形について 2 つのことを知る必要があります。

  • 位置 ( x,y座標 (多くの場合、正方形の角))
  • サイズ ( size)

間違いなく正方形を意味すると仮定すると、幅と高さは等しいので、サイズを格納するために必要な変数は 1 つだけです。実際に長方形を使用できる場合は、 と が必要widthになりheightます。それぞれが独自の位置とサイズを持つ必要があるSquareため、これらはクラスのメンバーである必要があります。位置とサイズから計算できるため、正方形の各コーナーの座標を保存する必要はありません。既に持っているデータから計算できるデータを保存することは冗長性と呼ばれSquare一般に避けたいことです。 . これは、2 つの異なる座標系でどのように見えるかを示しています (1 つyは下向き、もう1 つyは上向き)。

 x-->
y                size
|   (x,y).___________________
v        |                   |
         |                   |
         |                   |
         |                   |
    size |                   |
         |                   |
         |                   |
         |                   |
         |___________________| (x+size, y+size)

          ___________________ (x+size, y+size)
         |                   |
         |                   |
         |                   |
         |                   |
    size |                   |
         |                   |
         |                   |
^        |                   |
|   (x,y).___________________|
y                size
  x-->

別の方法として、正方形の対角にある 2の位置を保存することもできます。ただし、実際に長方形ではなく正方形を扱っている場合は、点が両方の軸に沿って互いに同じ距離にある必要があるという不変条件を手動で適用する必要があります。長方形にはこの不変条件がないため、より適切に適用できますが、移動などの操作はより複雑になります (1 つではなく 2 つのポイントを移動する必要があります)。

perimeterまたはareaメンバー関数は必要ありません。どの質問でも、これらのことのいずれかを知っている必要はありません。2 つの正方形の位置とサイズを簡単に比較することで、すべての質問に答えることができます。

それらを非公開にするかどうかは、設計上の問題です。Squareそれらを非公開にすることで、のインターフェイスを介してそれらへのアクセスを制御できます。bool Square::contains(const Square& otherSquare)次に、 public メンバー関数を提供して、 のように呼び出すなど、いくつかの質問に対する回答を確認できるようにすることができますsquare.contains(otherSquare)。可能なクラス定義の始まりは次のとおりです。

class Square
{
 private:
  int x, y, size;
 public:
  Square(int x, int y, int size) : x(x), y(y), size(size) { }
  bool contains(const Square& other)
  {
    // Do comparisons between x, y, size and other.x, other.y, other.size
  }
  // ...
};

または、( のメンバーではなく) 名前空間スコープで関数をSquare使用し、それらを のフレンドにするSquareか、パブリックの位置とサイズのメンバーにすることができSquareます。このような単純な例では、これは問題になりません。


座標とサイズの x と y の両方を取得するために、これをヘッダー ファイルに含める必要がありますか?

double  getX( )  const {  return x;  }
double  getY( )  const {  return y;  }
double  getSize( )  const {  return size;  }   

これらの種類の関数は、一般にgetterとして知られています。これらは、クラスのプライベート メンバー変数へのアクセスを提供します。あなたの場合、作成している関数は のメンバー関数であるため、これらのゲッターを提供する必要はありませんSquare。のメンバー関数はSquare、他の のプライベート メンバーにアクセスできるため、Squareこれらのゲッターを介してアクセスする必要はありません。

ただし、他のクラスが特定のxy、およびsize値にアクセスSquareする必要がある場合は、ゲッターを提供する (またはメンバーをパブリックにする) 必要があります。

于 2012-12-04T14:46:57.820 に答える
0

このようなものから始めて、そこから進んでください

class Square
{
    double m_x, m_y;
    double m_length;

    public:
    Square(double x, double y, double length) : m_x(x), m_y(y), m_length(length) {}
    ~Square() {};

    bool isExternal(const Square& rhs);
}

--- implementation
bool Square::isExternal(const Square& rhs) 
{
    bool retval = true;
    // do some calculations ..
    return retval;
}


--- main

int main(void)
{
    Square sq1(0, 0, 10);
    Square sq1(1, 1, 10);

    if(sq1.isExternal(sq2) {
    }
}
于 2012-12-04T14:46:51.533 に答える