Developer documentation | Axl-2.5.1

axlSurfaceRevolutionParametricConverter.cpp
Go to the documentation of this file.
1 //Author: Hung NGUYEN 9:17 AM 20/05/2014
2 
3 
4 
5 #include <axlCore/axlMesh.h>
9 #include "axlCircleArc.h"
10 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
11 
12 
13 class axlSurfaceRevolutionParametricConverterPrivate
14 {
15 public:
17 };
18 
20 {
21  d->data = NULL;
22 }
23 
25 {
26  delete d;
27 
28  d = NULL;
29 }
30 
32 {
33  return "Converter from axlSurfaceRevolutionParametric to axlMesh";
34 }
35 
37 {
38  return "axlSurfaceRevolutionParametricConverter";
39 }
40 
42 {
43  return QStringList() << "axlSurfaceRevolutionParametricConverter" << "axlSurfaceRevolutionParametric";
44 }
46 {
47  return "axlMesh";
48 }
49 
51 {
52  return dtkAbstractDataFactory::instance()->registerDataConverterType("axlSurfaceRevolutionParametricConverter", QStringList(), "axlMesh", createaxlSurfaceRevolutionParametricConverter);
53 }
54 
55 axlPoint *axlSurfaceRevolutionParametricConverter::rotatePoint(double a, double b, double c, double x, double y,double z, double u, double v, double w, double alpha)
56 {
57  axlPoint *res = new axlPoint();
58  qreal a1 = (a*(qPow(v,2)+qPow(w,2))-u*(b*v+c*w-u*x-v*y-w*z))*(1-qCos(alpha))+x*qCos(alpha)+(-c*v+b*w-w*y+v*z)*qSin(alpha);
59  qreal a2 = (b*(qPow(u,2)+qPow(w,2))-v*(a*u+c*w-u*x-v*y-w*z))*(1-qCos(alpha))+y*qCos(alpha)+(c*u-a*w+w*x-u*z)*qSin(alpha);
60  qreal a3 = (c*(qPow(u,2)+qPow(v,2))-w*(a*u+b*v-u*x-v*y-w*z))*(1-qCos(alpha))+z*qCos(alpha)+(-b*u+a*v-v*x+u*y)*qSin(alpha);
61  res->setCoordinates(a1,a2,a3);
62  return res;
63 };
64 
65 axlPoint* axlSurfaceRevolutionParametricConverter::RotatePoint(axlPoint a,axlPoint x,axlPoint u, double alpha)
66 {
67  return rotatePoint(a.x(),a.y(),a.z(),x.x(),x.y(),x.z(),u.x(),u.y(),u.z(),alpha);
68 };
69 
70 axlPoint* axlSurfaceRevolutionParametricConverter::RotatePoint(axlLine *line,axlPoint *x, double alpha)
71 {
72  axlPoint dir = line->secondPoint()->operator-(line->firstPoint());
73  dir.normalize();//should change it to better function
74  return RotatePoint(*(line->firstPoint()),*x,dir,alpha);
75 }
76 double axlSurfaceRevolutionParametricConverter::angle(axlPoint vCompute, axlPoint vRef, axlPoint normal)
77 {
78  axlPoint y = axlPoint::crossProduct(normal,vRef);
79  return std::atan2(axlPoint::dotProduct(vCompute,y),axlPoint::dotProduct(vCompute,vRef));
80 }
81 
82 //conputing the angle of arc with base on the function angle().
83 double axlSurfaceRevolutionParametricConverter::angleOfArc(const axlCircleArc *arc)
84 {
85  if(std::abs(axlPoint::crossProduct(arc->point1()-arc->center(),arc->point2()-arc->center()).norm())<1e-5)
86  {
87  if(arc->isDirect())
88  return M_PI;
89  else
90  return -M_PI;
91  }
92 
93  double ang = angle(arc->point2()-arc->center(),arc->point1()-arc->center(),/*arc->normal()*/arc->calculateNormal());
94  //
95  //if(ang>0 && !arc->isDirect())
96  // ang = ang - 2*M_PI;
97  //else if(ang<0&&!arc->isDirect())
98  // //ang = ang + 2*M_PI;
99  if(ang<0)
100  return ang+ 2*M_PI;
101  /*if(axlPoint::dotProduct(axlPoint::crossProduct(arc->point1()-arc->center(),arc->point2()-arc->center()),arc->normal())<0&&arc->isDirect())
102  return ang + 2*M_PI;
103  if(axlPoint::dotProduct(axlPoint::crossProduct(arc->point1()-arc->center(),arc->point2()-arc->center()),arc->normal())>0&&!arc->isDirect())
104  return ang - 2*M_PI;*/
105  return ang;
106 }
107 axlPoint axlSurfaceRevolutionParametricConverter::normalCCWArc(const axlCircleArc& arc)
108 {
109  if(std::abs(axlPoint::crossProduct(arc.point1()-arc.center(),arc.point2()-arc.center()).norm())<1e-5)
110  {
111  if(arc.isDirect())
112  return arc.normal();
113  else
114  return arc.normal()*(-1);
115  }
116  else
117  return arc.calculateNormal();
118 
119 }
120 QList<axlPoint *> axlSurfaceRevolutionParametricConverter::Sampling(axlAbstractCurve *curve)
121 {
122  QList<axlPoint *> result;
123 
124  if(axlLine *line = dynamic_cast<axlLine *>(curve))
125  {
126  result.append(line->firstPoint());
127  result.append(line->secondPoint());
128  }
129  else if(axlCircleArc *ca = dynamic_cast<axlCircleArc *>(curve))
130  {
131  double step = angleOfArc(ca)/40;
132  /*if((axlPoint::dotProduct(ca->normal(),axlPoint::crossProduct(ca->point1()-ca->center(),ca->point2()-ca->center()))>0&&ca->isDirect())||(axlPoint::dotProduct(ca->normal(),axlPoint::crossProduct(ca->point1()-ca->center(),ca->point2()-ca->center()))<0&&!ca->isDirect()))
133  {
134  step = qAcos(axlPoint::dotProduct(ca->point1()-ca->center(),ca->point2()-ca->center())/(ca->point1()-ca->center()).norm()*(ca->point1()-ca->center()).norm())/40;
135  }
136  else
137  {
138  step = 2*M_PI - qAcos(axlPoint::dotProduct(ca->point1()-ca->center(),ca->point2()-ca->center())/(ca->point1()-ca->center()).norm()*(ca->point1()-ca->center()).norm())/40;
139  }*/
140  for(int i = 0; i<=40;i++)
141  {
142  axlPoint *inter = new axlPoint(ca->point1());
143  result.append(RotatePoint(new axlLine(ca->center(),ca->center()+normalCCWArc(*ca)),inter,i*step));
144  }
145  }
146  else if(axlAbstractCurveBSpline *curvepara = dynamic_cast<axlAbstractCurveBSpline *>(curve))
147  {
148  double step = (curvepara->endParam()-curvepara->startParam())/40;
149  for(int i = 0;i<41;i++)
150  {
151  result.append(new axlPoint(curvepara->eval(curvepara->startParam()+i*step)));
152  }
153 
154  }
155  return result;
156 }
158 {
159 
160  if(!d->data)
161  return NULL;
162 
163  axlMesh *output = new axlMesh();
164  int NoS = 40;
165  double step = (d->data->getEndAngle()-d->data->getStartAngle())/NoS;
166  qDebug()<<d->data->getCurve()->description();
167  QList<axlPoint *> samples = Sampling(d->data->getCurve());
168 
169  for(int i = 0;i<samples.size();i++)
170  {
171  for(int j = 0;j<NoS+1;j++)
172  {
173  output->push_back_vertex(RotatePoint(d->data->getAxe(),samples.value(i),d->data->getStartAngle()+j*step));
174  }
175  }
176  int i1, i2;
177  for(int i = 0; i < samples.size()-1; i++)
178  {
179  for(int j= 0; j <NoS; j++)
180  {
181  i1 = i * (NoS+1) + j;
182  i2 = i1 + NoS+1;
183 
184  QVector<int> firstTriangle;
185  QVector<int> secondTriamgle;
186 
187  firstTriangle.push_back(i1);
188  firstTriangle.push_back(i1 + 1);
189  firstTriangle.push_back(i2);
190 
191  secondTriamgle.push_back(i2);
192  secondTriamgle.push_back(i1 + 1);
193  secondTriamgle.push_back(i2 + 1);
194 
195  output->push_back_face(firstTriangle);
196  output->push_back_face(secondTriamgle);
197 
198  }
199 
200  }
201 
202  axlMesh::Edge ed0,ed1,ed2,ed3;
203  for(int i = 0; i < NoS+1 ; i++)
204  {
205  ed0<<i;
206  }
207  output->push_back_edge(ed0);
208 
209  for(int j = 0; j < samples.size() ; j++)
210  {
211  ed1<<(NoS+j*(NoS+1));
212  }
213  output->push_back_edge(ed1);
214 
215 
216  for(int i = 0; i < NoS+1 ; i++)
217  {
218  ed2<<(samples.size()-2)*(NoS+1) + (NoS-i);
219  }
220  output->push_back_edge(ed2);
221 
222  for(int j = 0; j < samples.size() ; j++)
223  {
224  ed3<<(samples.size()-1-j)*(NoS+1);
225  }
226  output->push_back_edge(ed3);
227  qDebug()<<output->description();
228  output->vertex_show() = true;
229  output->face_show() = true;
230  output->vertex_show() = true;
231  return output;
232 }
233 
235 {
236  if(axlSurfaceRevolutionParametric *Data = dynamic_cast<axlSurfaceRevolutionParametric *>(data))
237  d->data = Data;
238 }
239 
240 dtkAbstractDataConverter *createaxlSurfaceRevolutionParametricConverter(void)
241 {
243 }
bool isDirect(void) const
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
virtual QString description(void) const
Definition: axlMesh.cpp:985
Class axlLine defines 3D lines.
Definition: axlLine.h:35
bool vertex_show(void) const
Definition: axlMesh.cpp:159
axlPoint point1(void) const
void push_back_edge(int, int)
Definition: axlMesh.cpp:669
axlPoint * secondPoint(void) const
Returns second point of the line.
Definition: axlLine.cpp:137
#define M_PI
QVector< int > Edge
An edge is represented by a sequence of vertices.
Definition: axlMesh.h:55
axlPoint center(void) const
axlPoint * firstPoint(void) const
Returns first point of the line.
Definition: axlLine.cpp:128
void normalize(void)
Definition: axlPoint.cpp:410
dtkAbstractDataConverter * createaxlSurfaceRevolutionParametricConverter(void)
axlPoint point2(void) const
static double dotProduct(const axlPoint &lhs, const axlPoint &rhs)
Definition: axlPoint.cpp:508
bool face_show(void) const
Definition: axlMesh.cpp:200
double y
Definition: axlPoint.h:37
axlPoint calculateNormal(void) const
void push_back_face(const Face &face)
Definition: axlMesh.cpp:735
axlPoint normal(void) const
double z
Definition: axlPoint.h:38
static axlPoint crossProduct(const axlPoint &lhs, const axlPoint &rhs)
Returns the cross product between lhs (coords) and rhs (coords).
Definition: axlPoint.cpp:485
double x
Definition: axlPoint.h:37
void setCoordinates(double x, double y, double z)
Change coordinates of this point.
Definition: axlPoint.cpp:370
Class axlMesh defines a piecewise-linear 3D object.
Definition: axlMesh.h:41
void push_back_vertex(const double &x, const double &y, const double &z)
Add a new vertex to the mesh.
Definition: axlMesh.cpp:333