source: trunk/src/core2/RpMeshRect3D.cc @ 3177

Last change on this file since 3177 was 3177, checked in by mmc, 12 years ago

Updated all of the copyright notices to reference the transfer to
the new HUBzero Foundation, LLC.

File size: 4.0 KB
Line 
1/*
2 * ----------------------------------------------------------------------
3 *  Rappture::MeshRect3D
4 *    This is a non-uniform, structured 3D mesh.  Each of the x, y,
5 *    and z-axes can be configured independently.  Their product
6 *    forms a rectangular mesh in 3D space.
7 *
8 * ======================================================================
9 *  AUTHOR:  Michael McLennan, Purdue University
10 *  Copyright (c) 2004-2012  HUBzero Foundation, LLC
11 *
12 *  See the file "license.terms" for information on usage and
13 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14 * ======================================================================
15 */
16#include "RpMeshRect3D.h"
17
18using namespace Rappture;
19
20CellRect3D::CellRect3D()
21{
22    for (int i=0; i < 8; i++) {
23        _nodeIds[i] = -1;
24        _x[i] = 0.0;
25        _y[i] = 0.0;
26        _z[i] = 0.0;
27    }
28}
29
30CellRect3D::CellRect3D(const CellRect3D& cell)
31{
32    for (int i=0; i < 8; i++) {
33        _nodeIds[i] = cell._nodeIds[i];
34        _x[i] = cell._x[i];
35        _y[i] = cell._y[i];
36        _z[i] = cell._z[i];
37    }
38}
39
40CellRect3D&
41CellRect3D::operator=(const CellRect3D& cell)
42{
43    for (int i=0; i < 8; i++) {
44        _nodeIds[i] = cell._nodeIds[i];
45        _x[i] = cell._x[i];
46        _y[i] = cell._y[i];
47        _z[i] = cell._z[i];
48    }
49    return *this;
50}
51
52int&
53CellRect3D::nodeId(int n)
54{
55    assert(n >= 0 && n < 8);
56    return _nodeIds[n];
57}
58
59double&
60CellRect3D::x(int n)
61{
62    assert(n >= 0 && n < 8);
63    return _x[n];
64}
65
66double&
67CellRect3D::y(int n)
68{
69    assert(n >= 0 && n < 8);
70    return _y[n];
71}
72
73double&
74CellRect3D::z(int n)
75{
76    assert(n >= 0 && n < 8);
77    return _z[n];
78}
79
80int
81CellRect3D::isOutside() const
82{
83    for (int i=0; i < 8; i++) {
84        if (_nodeIds[i] < 0) {
85            return 1;
86        }
87    }
88    return 0;
89}
90
91
92MeshRect3D::MeshRect3D()
93{
94}
95
96MeshRect3D::MeshRect3D(const Mesh1D& xm, const Mesh1D& ym, const Mesh1D& zm)
97{
98    _axis[0] = xm;
99    _axis[1] = ym;
100    _axis[2] = zm;
101}
102
103MeshRect3D::MeshRect3D(const MeshRect3D& mesh)
104    : _axis(mesh._axis)
105{
106}
107
108MeshRect3D&
109MeshRect3D::operator=(const MeshRect3D& mesh)
110{
111    _axis[0] = mesh._axis[0];
112    _axis[1] = mesh._axis[1];
113    _axis[2] = mesh._axis[2];
114    return *this;
115}
116
117MeshRect3D::~MeshRect3D()
118{
119}
120
121Node1D&
122MeshRect3D::add(Axis which, const Node1D& node)
123{
124    return _axis[which].add(node);
125}
126
127MeshRect3D&
128MeshRect3D::remove(Axis which, int nodeId)
129{
130    _axis[which].remove(nodeId);
131    return *this;
132}
133
134MeshRect3D&
135MeshRect3D::remove(Axis which, const Node1D& node)
136{
137    _axis[which].remove(node);
138    return *this;
139}
140
141MeshRect3D&
142MeshRect3D::clear()
143{
144    _axis[0].clear();
145    _axis[1].clear();
146    _axis[2].clear();
147    return *this;
148}
149
150int
151MeshRect3D::size(Axis which) const
152{
153    return _axis[which].size();
154}
155
156Node1D&
157MeshRect3D::at(Axis which, int pos)
158{
159    return _axis[which].at(pos);
160}
161
162double
163MeshRect3D::rangeMin(Axis which) const
164{
165    return _axis[which].rangeMin();
166}
167
168double
169MeshRect3D::rangeMax(Axis which) const
170{
171    return _axis[which].rangeMax();
172}
173
174CellRect3D
175MeshRect3D::locate(const Node3D& node) const
176{
177    CellRect3D result;
178    Cell1D cells[3];
179    Node1D coord(0.0);
180
181    coord.x(node.x());
182    cells[0] = _axis[0].locate(coord);
183
184    coord.x(node.y());
185    cells[1] = _axis[1].locate(coord);
186
187    coord.x(node.z());
188    cells[2] = _axis[2].locate(coord);
189
190    int n = 0;
191    for (int iz=0; iz < 2; iz++) {
192        for (int iy=0; iy < 2; iy++) {
193            for (int ix=0; ix < 2; ix++) {
194                int nx = cells[0].nodeId(ix);
195                int ny = cells[1].nodeId(iy);
196                int nz = cells[2].nodeId(iz);
197                if (nx >= 0 && ny >= 0 && nz >= 0) {
198                    result.nodeId(n) = nz*(_axis[0].size()*_axis[1].size())
199                                       + ny*(_axis[0].size())
200                                       + nx;
201                    result.x(n) = cells[0].x(ix);
202                    result.y(n) = cells[1].x(iy);
203                    result.z(n) = cells[2].x(iz);
204                }
205                n++;
206            }
207        }
208    }
209    return result;
210}
Note: See TracBrowser for help on using the repository browser.