From e24ed5a69ce1588080158f2072b84ef33dec349d Mon Sep 17 00:00:00 2001 From: pgovyadi Date: Fri, 5 Feb 2016 15:43:31 -0600 Subject: [PATCH] circle added --- stim/math/circle.h | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+), 0 deletions(-) create mode 100644 stim/math/circle.h diff --git a/stim/math/circle.h b/stim/math/circle.h new file mode 100644 index 0000000..1bfc6ca --- /dev/null +++ b/stim/math/circle.h @@ -0,0 +1,131 @@ +#ifndef STIM_CIRCLE_H +#define STIM_CIRCLE_H + +//enable CUDA_CALLABLE macro +#include +#include +#include +#include +#include +#include +#include +#include + +namespace stim +{ + +template +struct circle : rect +{ + private: + T theta; + + public: + + using stim::rect::p; + using stim::rect::normal; + using stim::rect::center; + using stim::rect::scale; + ///base constructor + ///@param th value of the angle of the starting point from 0 to 360. + CUDA_CALLABLE circle(float th = 0.0) : rect() + { + theta = th; + } + + ///create a rectangle given a size and position in Z space. + ///@param size: size of the rectangle in ND space. + ///@param z_pos z coordinate of the rectangle. + ///@param th value of the angle of the starting point from 0 to 360. + CUDA_CALLABLE circle(T size, T zpos = (T)0, float th = 0.0) : rect(size, zpos) + { + theta = th; + } + + ///create a rectangle from a center point, normal + ///@param c: x,y,z location of the center. + ///@param n: x,y,z direction of the normal. + ///@param th value of the angle of the starting point from 0 to 360. + CUDA_CALLABLE circle(vec c, vec n = vec(0,0,1), float th = 0.0) : rect(c, n) + { + theta = th; + } + + ///create a rectangle from a center point, normal, and size + ///@param c: x,y,z location of the center. + ///@param s: size of the rectangle. + ///@param n: x,y,z direction of the normal. + ///@param th value of the angle of the starting point from 0 to 360. + CUDA_CALLABLE circle(vec c, T s, vec n = vec(0,0,1), float th = 0.0):rect(c,s,n) + { + theta = th; + } + + ///creates a rectangle from a centerpoint and an X and Y direction vectors. + ///@param center: x,y,z location of the center. + ///@param directionX: u,v,w direction of the X vector. + ///@param directionY: u,v,w direction of the Y vector. + ///@param th value of the angle of the starting point from 0 to 360. + CUDA_CALLABLE circle(vec center, vec directionX, vec directionY, float th = 0.0) : rect(center, directionX, directionY) + { + theta = th; + } + + ///creates a rectangle from a size, centerpoint, X, and Y direction vectors. + ///@param size of the rectangle in ND space. + ///@param center: x,y,z location of the center. + ///@param directionX: u,v,w direction of the X vector. + ///@param directionY: u,v,w direction of the Y vector. + ///@param th value of the angle of the starting point from 0 to 360. + CUDA_CALLABLE circle(T size, vec center, vec directionX, vec directionY, float th = 0.0) : rect(size, center, directionX, directionY) + { + theta = th; + } + + ///creates a rectangle from a size, centerpoint, X, and Y direction vectors. + ///@param size of the rectangle in ND space, size[0] = size in X, size[1] = size in Y. + ///@param center: x,y,z location of the center. + ///@param directionX: u,v,w direction of the X vector. + ///@param directionY: u,v,w direction of the Y vector. + ///@param th value of the angle of the starting point from 0 to 360. + CUDA_CALLABLE circle(vec size, vec center, vec directionX, vec directionY, float th = 0.0) : rect(size, center, directionX, directionY) + { + theta = th; + } + + ///returns a vector with the points on the initialized circle. + ///connecting the points results in a circle. + ///@param n: integer for the number of points representing the circle. + std::vector > + getPoints(int n) + { + std::vector > result; + stim::vec point; + T x,y; + float step = 360.0/(float) n; + for(float j = theta; j <= theta+360.0; j += step) + { + y = 0.5*cos(j*2.0*M_PI/360.0)+0.5; + x = 0.5*sin(j*2.0*M_PI/360.0)+0.5; + result.push_back(p(x,y)); + } + + return result; + } + + ///returns a vector with the points on the initialized circle. + ///connecting the points results in a circle. + ///@param n: integer for the number of points representing the circle. + stim::vec + p(T theta) + { + T x,y; + y = 0.5*cos(theta*2.0*M_PI/360.0)+0.5; + x = 0.5*sin(theta*2.0*M_PI/360.0)+0.5; + return p(x,y); + } +}; + +} + +#endif -- libgit2 0.21.4