Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Creating a 2D or 3D array?

0 views
Skip to first unread message

carl

unread,
Oct 28, 2009, 3:52:10 PM10/28/09
to
I need to create either a 2D or 3D array based on the dimension specified by
the user. So far I just split it in two cases depending on the specified
parameter:


// 2D grid
if(NDimensions==2) {
double offset = imageSize[0] / (nodes-1) * 1.0;
// generalize to ND ?.
int id = 0;
for (int i = 0; i < nodes; i++) {
for (int j = 0; j < nodes; j++) {
ControlPointType cp;

VectorType location, deformation;
location[0] = i*offset;
location[1] = j*offset;

deformation.Fill(0);
cp.setDeformation(deformation);
cp.setLocation(location);
cp.setId(id);
m_ControlPoints.push_back(cp);
id++;
}
}
}

// 2D cube
if(NDimensions == 3) {
double x_offset = imageSize[0] / (nodes-1) * 1.0;
double y_offset = imageSize[1] / (nodes-1) * 1.0;
double z_offset = imageSize[2] / (nodes-1) * 1.0;
int id = 0;
for (int i = 0; i < nodes; i++) {
for (int j = 0; j < nodes; j++) {
for (int k = 0; k < nodes; k++) {
ControlPointType cp;
VectorType location, deformation;
location[0] = i*x_offset;
location[1] = j*y_offset;
location[2] = k*z_offset;
deformation.Fill(0);
cp.setDeformation(deformation);
cp.setLocation(location);
cp.setId(id);
m_ControlPoints.push_back(cp);
id++;
}
}
}

}


But is there some more generic way to do this or is it only possible when
splitting the code up like above?

Victor Bazarov

unread,
Oct 28, 2009, 4:44:49 PM10/28/09
to
carl wrote:
> I need to create either a 2D or 3D array based on the dimension
> specified by the user. So far I just split it in two cases depending on
> the specified parameter:
> [..]

> But is there some more generic way to do this or is it only possible
> when splitting the code up like above?

You seem to have forgotten to mention that the sizes of your dimensions
are the same. Are they? If so, you could write a template, something
in line with

#include <vector>

template<int N, unsigned Exp> struct Pow {
static unsigned long const res = N * Pow<N,Exp-1>::res;
};

template<int N> struct Pow<N,0U> {
static unsigned long const res = 1;
};

template<class T, int N, int Dims> class MyArray
{
std::vector<T> data;
public:
MyArray() : data(Pow<N,Dims>::res) {}
};

int main() {
MyArray<int, 50, 3> i; // that's how you use it
}

(filling up 'MyArray' with indexing and other functionality is left as
an exercise)

Of course, that still leaves 'N' specified at compile-time. So, rewrite
this to specify it at run-time, as the argument to the constructor. You
won't need 'Pow' template (or, rather, you will need a different 'Pow'
template).

Good luck!

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask

0 new messages