インスタンス化されたオブジェクトの 2 次元配列、11 X 11 フィールドがあります。
フィールドの 1 つまたは 2 つをプライマリとして設定できます。これは、そのフィールドが A 値に適していることを意味します。プライマリ フィールドは相対座標系の中心となり、近くにある近隣 (X と Y の +/-1) が B 値に適合し、他の 4 つのレベルの近隣が C 値に適合します。残りのフィールド (この 11 行/列の例ではフィールドはありません) は、D - デフォルト値の資格があります。-1 のインデックスは実際にはインデックス 11 であるため、インデックス 0 はインデックス 12 です。
上位値セット 配列にプライマリ フィールドが 2 つある場合。
質問: インスタンス化されたオブジェクトの値のセッターを計算し、パワーセッターに与えるための C++ での最適な方法は何ですか?
- @rhalbersma によって提供された最初の例を条件に合わせて変更
PrimaryFieldsNet.h
#ifndef PRIMARYFIELDSNET_H
#define PRIMARYFIELDSNET_H
#define ABS(X) ((X) > 0 ? (X) : (-(X)))
#include <iostream>
using namespace std;
typedef pair<int, int> Point;
class PrimaryFieldsNet
{
private:
int m_rows;
int m_grid[11][11];
PrimaryFieldsNet() { }
int distance_x(Point const& a, Point const& b);
int distance_y(Point const& a, Point const& b);
int delta_x(Point const& a, Point const& b);
int delta_y(Point const& a, Point const& b);
int calculate(Point const& a, Point const& b);
void update_grid(Point const& pry_p1);
void update_grid(Point const& pry_p1, Point const& pry_p2);
public:
PrimaryFieldsNet(int rows);
void setup();
void setup(Point const& pry_p1);
void setup(Point const& pry_p1, Point const& pry_p2);
int* grid();
};
#endif
PrimaryFieldsNet.cpp
#include "PrimaryFieldsNet.h"
PrimaryFieldsNet::PrimaryFieldsNet(int rows)
{
m_rows = rows;
}
int* PrimaryFieldsNet::grid()
{
//cout << m_grid << endl;
return *m_grid;
}
int PrimaryFieldsNet::distance_x(Point const& a, Point const& b)
{
return a.first - b.first;
}
int PrimaryFieldsNet::distance_y(Point const& a, Point const& b)
{
return a.second - b.second;
}
int PrimaryFieldsNet::delta_x(Point const& a, Point const& b)
{
int d_x;
d_x = distance_x(a, b);
if (d_x < -(m_rows-1)/2)
d_x = a.first + m_rows - b.first;
else if (d_x > (m_rows-1)/2)
d_x = ABS(a.first - m_rows - b.first);
else
d_x = ABS(d_x);
return d_x;
}
int PrimaryFieldsNet::delta_y(Point const& a, Point const& b)
{
int d_y;
d_y = distance_y(a, b);
if (d_y < -(m_rows-1)/2)
d_y = a.second + m_rows - b.second;
else if (d_y > (m_rows-1)/2)
d_y = ABS(a.second - m_rows - b.second);
else
d_y = ABS(d_y);
return d_y;
}
int PrimaryFieldsNet::calculate(Point const& a, Point const& b)
{
int dmax, result;
dmax = max(delta_x(a, b), delta_y(a, b));
if (dmax < 2)
result = dmax;
else if (dmax < (m_rows+1)/2)
result = 2;
else
result = 3;
return result;
}
void PrimaryFieldsNet::update_grid(Point const& pry_p1)
{
for (int x = 0; x < m_rows; ++x)
for (int y = 0; y < m_rows; ++y)
m_grid[x][y] = calculate(Point(x,y), pry_p1);
}
void PrimaryFieldsNet::update_grid(Point const& pry_p1, Point const& pry_p2)
{
for (int x = 0; x < m_rows; ++x)
for (int y = 0; y < m_rows; ++y)
m_grid[x][y] = min(calculate(Point(x,y), pry_p1), calculate(Point(x,y), pry_p2));
}
void PrimaryFieldsNet::setup()
{
Point pry_p1((m_rows-1)/2,(m_rows-1)/2);
update_grid(pry_p1);
}
void PrimaryFieldsNet::setup(Point const& pry_p1)
{
update_grid(pry_p1);
}
void PrimaryFieldsNet::setup(Point const& pry_p1, Point const& pry_p2)
{
update_grid(pry_p1, pry_p2);
}
main.cpp
#include <iostream>
#include "PrimaryFieldsNet.h"
using namespace std;
int main()
{
int* grid;
PrimaryFieldsNet pfnet(11);
//pfnet.setup(Point(5,2));
pfnet.setup(Point(10,6), Point(2,2));
grid = pfnet.grid();
for (int x = 0; x < 11; ++x) {
for (int y = 0; y < 11; ++y)
cout << *(grid + x*11 + y) << " ";
cout << "\n";
}
return 0;
}
サンプル出力は次のようになります。
2 2 2 2 2 1 1 1 2 2 2
2 1 1 1 2 2 2 2 2 2 2
2 1 0 1 2 2 2 2 2 2 2
2 1 1 1 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 1 1 1 2 2 2
2 2 2 2 2 1 0 1 2 2 2