MADNESS 0.10.1
sdf_shape_2D.h
Go to the documentation of this file.
1/*
2 This file is part of MADNESS.
3
4 Copyright (C) 2007,2010 Oak Ridge National Laboratory
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 For more information please contact:
21
22 Robert J. Harrison
23 Oak Ridge National Laboratory
24 One Bethel Valley Road
25 P.O. Box 2008, MS-6367
26
27 email: harrisonrj@ornl.gov
28 tel: 865-241-3937
29 fax: 865-572-0680
30
31 $Id$
32*/
33
34/**
35 \file mra/sdf_shape_2D.h
36 \brief Implements the SignedDFInterface for common 2-D geometric objects.
37 \ingroup mrabcint
38
39 This file provides signed distance functions for common 2-D geometric objects:
40 - Circle
41 - Rectangle
42
43 \note The signed distance functions should be the shortest distance between
44 a point and \b any point on the surface. This is hard to calculate in many
45 cases, so we use contours here. The surface layer may not be equally thick
46 around all points on the surface. Some shapes have the exact shortest
47 distances, which will be noted on a class-by-class basis. Serious usage
48 of the contour-based signed distance functions is not recommended.
49*/
50
51#ifndef MADNESS_MRA_SDF_SHAPE_2D_H__INCLUDED
52#define MADNESS_MRA_SDF_SHAPE_2D_H__INCLUDED
53
55
56namespace madness {
57
58 /// \brief A circle (2 dimensions)
59 class SDFCircle : public SignedDFInterface<2> {
60 protected:
61 const double radius; ///< Radius of circle
62 const coord_2d center; ///< Center of circle
63
64 public:
65 /** \brief SDF for a sphere
66
67 \param radius The radius of the sphere
68 \param center The center of the sphere */
69 SDFCircle(const double radius, const coord_2d &center)
70 : radius(radius)
71 , center(center)
72 {}
73
74 /** \brief Computes the normal distance
75
76 This SDF is exact, and easy to show.
77
78 \param pt Point at which to compute the distance from the surface
79 \return The signed distance from the surface */
80 double sdf(const coord_2d& pt) const {
81 double temp, r;
82 int i;
83
84 r = 0.0;
85 for(i = 0; i < 2; ++i) {
86 temp = pt[i] - center[i];
87 r += temp * temp;
88 }
89
90 return sqrt(r) - radius;
91 }
92
93 /** \brief Computes the gradient of the SDF.
94
95 \param pt Point at which to compute the gradient
96 \return the gradient */
97 coord_2d grad_sdf(const coord_2d& pt) const {
98 double x = pt[0] - center[0];
99 double y = pt[1] - center[1];
100 double r = sqrt(x*x + y*y);
101 coord_2d g;
102 if(r < 1.0e-6) {
103 g[0] = g[1] = 0.0;
104 }
105 else {
106 g[0] = x/r;
107 g[1] = y/r;
108 }
109 return g;
110 }
111 };
112
113 /** \brief A rectangle (2 dimensions)
114
115 This SDF naively uses contours, and should be improved for serious
116 usage.
117
118 \note LIMIT -- the 2 primary axes must be x and y */
119 class SDFRectangle : public SignedDFInterface<2> {
120 protected:
121 const coord_2d lengths; ///< Half the length of each side
122 const coord_2d center; ///< the center
123
124 public:
125 /** \brief Constructor for rectangle
126
127 \param length The lengths of the rectangle
128 \param center The center of the rectangle */
130 : lengths(length*0.5), center(center)
131 {}
132
133 /** \brief Computes the normal distance
134
135 \param pt Point at which to compute the distance from the surface
136 \return The signed distance from the surface */
137 double sdf(const coord_2d& pt) const {
138 double diff, max;
139
140 max = fabs(pt[0] - center[0]) - lengths[0];
141 diff = fabs(pt[1] - center[1]) - lengths[1];
142 if(diff > max)
143 max = diff;
144
145 return max;
146 }
147
148 /** Computes the gradient of the SDF.
149
150 \param pt Point at which to compute the gradient
151 \return the gradient */
152 coord_2d grad_sdf(const coord_2d& pt) const {
153 MADNESS_EXCEPTION("gradient method is not yet implemented for this shape",0);
154 }
155 };
156
157} // end of madness namespace
158
159#endif // MADNESS_MRA_SDF_SHAPE_2D_H__INCLUDED
A circle (2 dimensions)
Definition sdf_shape_2D.h:59
const double radius
Radius of circle.
Definition sdf_shape_2D.h:61
coord_2d grad_sdf(const coord_2d &pt) const
Computes the gradient of the SDF.
Definition sdf_shape_2D.h:97
SDFCircle(const double radius, const coord_2d &center)
SDF for a sphere.
Definition sdf_shape_2D.h:69
const coord_2d center
Center of circle.
Definition sdf_shape_2D.h:62
double sdf(const coord_2d &pt) const
Computes the normal distance.
Definition sdf_shape_2D.h:80
A rectangle (2 dimensions)
Definition sdf_shape_2D.h:119
const coord_2d center
the center
Definition sdf_shape_2D.h:122
const coord_2d lengths
Half the length of each side.
Definition sdf_shape_2D.h:121
coord_2d grad_sdf(const coord_2d &pt) const
Definition sdf_shape_2D.h:152
double sdf(const coord_2d &pt) const
Computes the normal distance.
Definition sdf_shape_2D.h:137
SDFRectangle(const coord_2d &length, const coord_2d &center)
Constructor for rectangle.
Definition sdf_shape_2D.h:129
The interface for a signed distance function (sdf).
Definition sdf_domainmask.h:74
A simple, fixed dimension vector.
Definition vector.h:64
static const double length
Definition hedft.cc:48
#define max(a, b)
Definition lda.h:51
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
NDIM const Function< R, NDIM > & g
Definition mra.h:2416
static Function< T, NDIM > diff(const Function< T, NDIM > &f, int axis)
Definition navstokes_cosines.cc:119
Defines abstract interfaces and concrete classes signed distance functions and domain masks.