Developer documentation | Axl-2.5.1

axlSurfaceParametricOffsetConverter.cpp
Go to the documentation of this file.
1 /* axlSurfaceParametricOffsetConverter.cpp ---
2  *
3  * Author: Julien Wintz
4  * Copyright (C) 2008-2011 - Julien Wintz, Inria.
5  * Created: Tue Jan 24 11:03:18 2012 (+0100)
6  * Version: $Id$
7  * Last-Updated: Tue Jan 24 11:27:25 2012 (+0100)
8  * By: Julien Wintz
9  * Update #: 50
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
20 #include "axlMesh.h"
23 
24 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
25 
26 class axlSurfaceParametricOffsetConverterPrivate
27 {
28 public:
30 };
31 
33 {
34  d->data = NULL;
35 }
36 
38 {
39  delete d;
40 
41  d = NULL;
42 }
43 
45 {
46  return "Converter from axlSurfaceParametricOffsetConverter to axlMesh";
47 }
48 
50 {
51  return "axlSurfaceParametricOffsetConverter";
52 }
53 
55 {
56  return QStringList() << "axlSurfaceParametricOffsetConverter" << "axlSurfaceParametricOffset";
57 }
58 
60 {
61  return "axlMesh";
62 }
63 
65 {
66  return dtkAbstractDataFactory::instance()->registerDataConverterType("axlSurfaceParametricOffsetConverter", QStringList(), "axlMesh", createaxlSurfaceParametricOffsetConverter);
67 }
68 
70 {
71  if(!d->data)
72  return NULL;
73 
74  axlMesh *mesh = new axlMesh;
75  double uMin = d->data->surfaceParam()->startParam_u();
76  double uMax = d->data->surfaceParam()->endParam_u();
77  double vMin = d->data->surfaceParam()->startParam_v();
78  double vMax = d->data->surfaceParam()->endParam_v();
79  double stepu = (uMax-uMin)/40;
80  double stepv = (vMax-vMin)/40;
81 
82  for(double u=uMin ;u < uMax ;u+=stepu ){
83  for(double v=vMin ;v < vMax ;v+=stepv){
84  axlPoint *currentNormal = new axlPoint;
85  axlPoint *currentEval = new axlPoint;
86  d->data->surfaceParam()->normal(currentNormal, u, v);
87  d->data->surfaceParam()->eval(currentEval, u,v);
88  currentNormal->normalize();
89  axlPoint *currentResult = new axlPoint(*currentEval + *currentNormal * d->data->offset());
90  mesh->push_back_vertex(currentResult);
91 
92  delete currentResult;
93  delete currentNormal;
94  delete currentEval;
95  }
96  }
97 
98  int n_u = 40; // Temporary
99  int n_v = 40;
100 
101  int ind1, ind2;
102 
103  for(int j = 0; j < n_v - 1; j++) {
104 
105  for(int i= 0; i <n_u - 1; i++) {
106 
107  ind1 = j * n_u + i;
108  ind2 = ind1 + n_u;
109 
110  QVector<int> firstTriangle;
111  QVector<int> secondTriamgle;
112 
113  firstTriangle.push_back(ind1);
114  firstTriangle.push_back(ind1 + 1);
115  firstTriangle.push_back(ind2);
116 
117  secondTriamgle.push_back(ind2);
118  secondTriamgle.push_back(ind1 + 1);
119  secondTriamgle.push_back(ind2 + 1);
120 
121  mesh->push_back_face(firstTriangle);
122  mesh->push_back_face(secondTriamgle);
123  }
124  }
125 
126  mesh->setColor(d->data->color());
127  mesh->setOpacity(d->data->opacity());
128  mesh->setShader(d->data->shader());
129  return mesh;
130 }
131 
133 {
134  if(axlSurfaceParametricOffset *surface = dynamic_cast<axlSurfaceParametricOffset *>(data))
135  d->data = surface;
136 }
137 
138 dtkAbstractDataConverter *createaxlSurfaceParametricOffsetConverter(void)
139 {
141 }
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
void setShader(const QString &shader)
Class axlSurfaceParametricOffset defines offset of axlAbstractSurfaceParametric.
void normalize(void)
Definition: axlPoint.cpp:410
dtkAbstractDataConverter * createaxlSurfaceParametricOffsetConverter(void)
void push_back_face(const Face &face)
Definition: axlMesh.cpp:735
void setOpacity(const double &opacity)
void setColor(double r, double g, double b)
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