polyhedron.hpp 25.2 KB
Newer Older
Pierre Kraemer's avatar
Pierre Kraemer committed
1 2 3
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
4
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
Pierre Kraemer's avatar
Pierre Kraemer committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
*                                                                              *
* This library is free software; you can redistribute it and/or modify it      *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your     *
* option) any later version.                                                   *
*                                                                              *
* This library is distributed in the hope that it will be useful, but WITHOUT  *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License  *
* for more details.                                                            *
*                                                                              *
* You should have received a copy of the GNU Lesser General Public License     *
* along with this library; if not, write to the Free Software Foundation,      *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.           *
*                                                                              *
20
* Web site: http://cgogn.unistra.fr/                                           *
Pierre Kraemer's avatar
Pierre Kraemer committed
21 22 23 24 25 26 27 28 29 30 31 32 33
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

namespace CGoGN
{

namespace Algo
{

namespace Modelisation
{

34 35 36 37 38 39 40 41 42 43 44 45 46
/**
 * create a n-sided pyramid
 */
template <typename PFP>
Dart createPyramid(typename PFP::MAP& map, unsigned int n)
{
	Dart dres = Dart::nil();
	std::vector<Dart> m_tableVertDarts;
	m_tableVertDarts.reserve(n);

	// creation of triangles around circunference and storing vertices
	for (unsigned int i = 0; i < n; ++i)
	{
47
		Dart d = map.newFace(3, false);
48 49 50 51 52 53 54 55 56 57
		m_tableVertDarts.push_back(d);
	}

	// sewing the triangles
	for (unsigned int i = 0; i < n-1; ++i)
	{
		Dart d = m_tableVertDarts[i];
		d = map.phi_1(d);
		Dart e = m_tableVertDarts[i+1];
		e = map.phi1(e);
58
		map.sewFaces(d, e, false);
59 60
	}
	//sewing the last with the first
61
	map.sewFaces(map.phi1(m_tableVertDarts[0]), map.phi_1(m_tableVertDarts[n-1]), false);
62 63

	//sewing the bottom face
64
	Dart d1 = map.newFace(n, false);
65 66 67
	dres = d1;
	for(unsigned int i = 0; i < n ; ++i)
	{
68
		map.sewFaces(m_tableVertDarts[i], d1, false);
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
		d1 = map.phi1(d1);
	}

	//return a dart from the base
	return dres;
}

/**
 * create a n-sided prism
 */
template <typename PFP>
Dart createPrism(typename PFP::MAP& map, unsigned int n)
{
	Dart dres = Dart::nil();
	unsigned int nb = n*2;
	std::vector<Dart> m_tableVertDarts;
	m_tableVertDarts.reserve(nb);

	// creation of quads around circunference and storing vertices
	for (unsigned int i = 0; i < n; ++i)
	{
90
		Dart d = map.newFace(4, false);
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
		m_tableVertDarts.push_back(d);
	}

	// storing a dart from the vertex pointed by phi1(phi1(d))
	for (unsigned int i = 0; i < n; ++i)
	{
		m_tableVertDarts.push_back(map.phi1(map.phi1(m_tableVertDarts[i])));
	}

	// sewing the quads
	for (unsigned int i = 0; i < n-1; ++i)
	{
		Dart d = m_tableVertDarts[i];
		d = map.phi_1(d);
		Dart e = m_tableVertDarts[i+1];
		e = map.phi1(e);
107
		map.sewFaces(d, e, false);
108 109
	}
	//sewing the last with the first
110
	map.sewFaces(map.phi1(m_tableVertDarts[0]), map.phi_1(m_tableVertDarts[n-1]), false);
111 112

	//sewing the top & bottom faces
113 114
	Dart d1 = map.newFace(n, false);
	Dart d2 = map.newFace(n, false);
115 116 117
	dres = d1;
	for(unsigned int i = 0; i < n ; ++i)
	{
118 119
		map.sewFaces(m_tableVertDarts[i], d1, false);
		map.sewFaces(m_tableVertDarts[n+i], d2, false);
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
		d1 = map.phi1(d1);
		d2 = map.phi_1(d2);
	}

	//return a dart from the base
	return dres;
}

/**
 * create a n-sided diamond
 */
template <typename PFP>
Dart createDiamond(typename PFP::MAP& map, unsigned int nbSides)
{
	Dart res = Dart::nil();

	Dart firstP = createPyramid<PFP>(map,nbSides);
	Dart secondP = createPyramid<PFP>(map,nbSides);

	res = map.phi2(firstP);

	map.sewVolumes(firstP, secondP);
142
	//map.mergeVolumes(firstP);
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

	return res;
}



/**
 * create a 3-sided prism
 */
template <typename PFP>
Dart createTriangularPrism(typename PFP::MAP& map)
{
	return createPrism<PFP>(map, 3);
}

/**
 * create a hexahedron
 */
template <typename PFP>
Dart createHexahedron(typename PFP::MAP& map)
{
	return createPrism<PFP>(map, 4);
}

/**
 * create a tetrahedron
 */
template <typename PFP>
Dart createTetrahedron(typename PFP::MAP& map)
{
	return createPyramid<PFP>(map, 3);
}

/**
 * create a 4-sided pyramid
 */
template <typename PFP>
Dart createQuadrangularPyramid(typename PFP::MAP& map)
{
	return createPyramid<PFP>(map, 4);
}

/**
 * create an octahedron (i.e. 4-sided diamond)
 */
template <typename PFP>
Dart createOctahedron(typename PFP::MAP& map)
{
	return createDiamond<PFP>(map,4);
}





untereiner's avatar
untereiner committed
198
template <typename PFP>
Sylvain Thery's avatar
Sylvain Thery committed
199
void explodPolyhedron(typename PFP::MAP& map, Dart d,  VertexAttribute<typename PFP::VEC3>& position)
untereiner's avatar
untereiner committed
200 201 202 203 204 205
{
	map.unsewVertexUmbrella(d);
	unsigned int newFaceDegree = map.closeHole(map.phi1(d));

	if(newFaceDegree != 3)
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
206
		// chercher le brin ou demarrer
untereiner's avatar
untereiner committed
207 208 209 210 211 212

		std::multimap<Dart, int> edges ;
		typename std::multimap<Dart, int>::iterator it ;

		Dart d12 = map.phi2(map.phi1(d));
		Dart fit = d12;
Pierre Kraemer's avatar
Pierre Kraemer committed
213
		unsigned int i;
untereiner's avatar
untereiner committed
214 215 216 217 218 219

		do
		{
			i = map.faceDegree(map.phi2(fit));
			std::cout << "edge(" << fit << "," << i << ")" << std::endl;
			edges.insert(std::make_pair(fit, i));
Pierre Kraemer's avatar
Pierre Kraemer committed
220
			fit = map.phi1(fit);
untereiner's avatar
untereiner committed
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
		}
		while(fit != d12);

		do
		{
			//44 44
			if(edges.find(fit)->second == 4 && edges.find(map.phi1(fit))->second == 4
				&& !map.sameFace(map.phi2(fit), map.phi2(map.phi1(fit))))
			{
				map.splitFace(fit, map.phi1(map.phi1(fit)));
				fit = map.phi2(map.phi_1(fit));
				int i = map.faceDegree(fit);
				edges.insert(std::make_pair(fit, i));

//				Dart fit2 = map.phi2(fit) ;
//				typename PFP::VEC3 p1 = position[fit] ;
//				typename PFP::VEC3 p2 = position[fit2] ;
//
//				map.cutEdge(fit) ;
//				position[map.phi1(fit)] = typename PFP::REAL(0.5) * (p1 + p2);


				std::cout << "flip cas quad quad " << std::endl;
			}

			//3 3
			if(edges.find(fit)->second == 3 && edges.find(map.phi1(fit))->second == 3
				&& !map.sameFace(map.phi2(fit), map.phi2(map.phi1(fit))))
			{
				map.splitFace(fit, map.phi1(fit));
				fit = map.phi2(map.phi_1(fit));
				int i = map.faceDegree(fit);
				edges.insert(std::make_pair(fit, i));

				std::cout << "flip cas tri tri" << std::endl;
			}

			//3 44 ou 44 3
			if( ((edges.find(fit)->second == 4 && edges.find(map.phi1(fit))->second == 3)
				|| (edges.find(fit)->second == 3 && edges.find(map.phi1(fit))->second == 4))
					&& !map.sameFace(map.phi2(fit), map.phi2(map.phi1(fit))))
			{
				map.splitFace(fit, map.phi1(map.phi1(fit)));
				fit = map.phi2(map.phi_1(fit));
				int i = map.faceDegree(fit);
				edges.insert(std::make_pair(fit, i));

				std::cout << "flip cas quad tri" << std::endl;
			}

			fit = map.phi1(fit);
		}
		while(map.faceDegree(fit) > 4 && fit != d12);

	}
}

Pierre Kraemer's avatar
Pierre Kraemer committed
278
template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
279 280 281 282 283 284 285
Polyhedron<PFP>::Polyhedron(const Polyhedron<PFP>& p1, const Polyhedron<PFP>& p2) :
	m_map(p1.m_map),
	m_dart(p1.m_dart),
	m_kind(COMPOSED),
	m_nx(-1), m_ny(-1), m_nz(-1),
	m_top_closed(false), m_bottom_closed(false),
	m_positions(p1.m_positions)
Pierre Kraemer's avatar
Pierre Kraemer committed
286
{
287
	if (&(p1.m_map) != &(p2.m_map))
Pierre Kraemer's avatar
Pierre Kraemer committed
288
	{
289
		CGoGNerr << "Warning, can not merge to Polyhedrons of different maps"<< CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
290 291 292 293
	}

	m_tableVertDarts.reserve(p1.m_tableVertDarts.size() + p2.m_tableVertDarts.size()); // can be too much but ...

294
	VEC3 center(0);
Pierre Kraemer's avatar
Pierre Kraemer committed
295

Pierre Kraemer's avatar
Pierre Kraemer committed
296
	for(typename std::vector<Dart>::const_iterator di = p1.m_tableVertDarts.begin(); di != p1.m_tableVertDarts.end(); ++di)
Pierre Kraemer's avatar
Pierre Kraemer committed
297 298 299 300 301 302
	{
		m_tableVertDarts.push_back(*di);
		center += m_positions[*di];
	}

	// O(n2) pas terrible !!
Pierre Kraemer's avatar
Pierre Kraemer committed
303
	for(typename std::vector<Dart>::const_iterator di = p2.m_tableVertDarts.begin(); di != p2.m_tableVertDarts.end(); ++di)
Pierre Kraemer's avatar
Pierre Kraemer committed
304
	{
305
		unsigned int em = m_map.template getEmbedding<VERTEX>(*di);
Pierre Kraemer's avatar
Pierre Kraemer committed
306 307 308 309 310

		typename std::vector<Dart>::const_iterator dj=p1.m_tableVertDarts.begin();
		bool found = false;
		while ((dj !=p1.m_tableVertDarts.end()) && (!found))
		{
311
			unsigned int xm = m_map.template getEmbedding<VERTEX>(*dj);
Pierre Kraemer's avatar
Pierre Kraemer committed
312
			if (xm == em)
Pierre Kraemer's avatar
Pierre Kraemer committed
313 314 315 316 317 318 319 320 321 322 323 324 325 326
				found = true;
			else
				++dj;
		}
		if (!found)
		{
			m_tableVertDarts.push_back(*di);
			center += m_positions[*di];
		}
	}

	m_center = center / typename PFP::REAL(m_tableVertDarts.size());
}

327 328


Pierre Kraemer's avatar
Pierre Kraemer committed
329
template <typename PFP>
330
Dart Polyhedron<PFP>::grid_topo_open(unsigned int x, unsigned int y)
Pierre Kraemer's avatar
Pierre Kraemer committed
331 332 333 334 335 336 337 338 339 340 341 342 343
{
	if (m_kind != NONE) return m_dart;

	m_kind = GRID;
	m_nx = x;
	m_ny = y;
	// nb vertices
	int nb = (x+1)*(y+1);

	// vertice reservation
	m_tableVertDarts.reserve(nb);

	// creation of quads and storing vertices
Pierre Kraemer's avatar
Pierre Kraemer committed
344
	for (unsigned int i = 0; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
345
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
346
		for (unsigned int j = 1; j <= x; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
347
		{
348
			Dart d = m_map.newFace(4, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
349
			m_tableVertDarts.push_back(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
350
			if (j == x)
Pierre Kraemer's avatar
Pierre Kraemer committed
351 352 353
				m_tableVertDarts.push_back(m_map.phi1(d));
		}
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
354

Pierre Kraemer's avatar
Pierre Kraemer committed
355
	// store last row of vertices
Pierre Kraemer's avatar
Pierre Kraemer committed
356
	for (unsigned int i = 0; i < x; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
357 358 359 360 361 362
	{
		m_tableVertDarts.push_back( m_map.phi_1(m_tableVertDarts[(y-1)*(x+1) + i]) );	
	}
	m_tableVertDarts.push_back( m_map.phi1(m_tableVertDarts[(y-1)*(x+1) +x]) );	

	//sewing the quads
Pierre Kraemer's avatar
Pierre Kraemer committed
363
	for (unsigned int i = 0; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
364
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
365
		for (unsigned int j = 0; j < x; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
366
		{
Pierre Kraemer's avatar
Pierre Kraemer committed
367
			if (i > 0) // sew with preceeding row
Pierre Kraemer's avatar
Pierre Kraemer committed
368 369 370 371 372
			{
				int pos = i*(x+1)+j;
				Dart d = m_tableVertDarts[pos];
				Dart e = m_tableVertDarts[pos-(x+1)];
				e = m_map.phi1(m_map.phi1(e));
373
				m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
374
			}
Pierre Kraemer's avatar
Pierre Kraemer committed
375
			if (j > 0) // sew with preceeding column
Pierre Kraemer's avatar
Pierre Kraemer committed
376 377 378 379 380 381
			{
				int pos = i*(x+1)+j;
				Dart d = m_tableVertDarts[pos];
				d = m_map.phi_1(d);
				Dart e = m_tableVertDarts[pos-1];
				e = m_map.phi1(e);
382
				m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
383 384 385 386 387 388
			}
		}
	}

	// store & return reference dart
	m_dart = m_tableVertDarts[0]; // util ?
389

390 391 392 393 394 395 396 397 398 399
	return m_dart;
}

template <typename PFP>
Dart Polyhedron<PFP>::grid_topo(unsigned int x, unsigned int y)
{
	if (m_kind != NONE) return m_dart;

	m_dart = grid_topo_open(x,y);

400 401
	m_map.closeHole(m_dart) ;

Pierre Kraemer's avatar
Pierre Kraemer committed
402 403 404 405
	return m_dart;
}

template <typename PFP>
406
Dart Polyhedron<PFP>::cylinder_topo_open(unsigned int n, unsigned int z)
Pierre Kraemer's avatar
Pierre Kraemer committed
407 408 409 410 411 412 413
{
	if (m_kind != NONE) return m_dart;

	m_kind = CYLINDER;
	m_nx = n;
	m_nz = z;

414
	int nb = (n)*(z+1)+2;
Pierre Kraemer's avatar
Pierre Kraemer committed
415 416 417 418 419

	// vertice reservation
	m_tableVertDarts.reserve(nb);

	// creation of quads and storing vertices
Pierre Kraemer's avatar
Pierre Kraemer committed
420
	for (unsigned int i = 0; i < z; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
421
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
422
		for (unsigned int j = 0; j < n; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
423
		{
424
			Dart d = m_map.newFace(4, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
425 426 427
			m_tableVertDarts.push_back(d);
		}
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
428
	for (unsigned int i = 0; i < n; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
429 430 431 432 433
	{
		m_tableVertDarts.push_back( m_map.phi_1(m_tableVertDarts[(z-1)*n+i]) );	
	}

	//sewing the quads
Pierre Kraemer's avatar
Pierre Kraemer committed
434
	for (unsigned int i = 0; i < z; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
435
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
436
		for (unsigned int j = 0; j < n; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
437
		{
Pierre Kraemer's avatar
Pierre Kraemer committed
438
			if (i > 0) // sew with preceeding row
Pierre Kraemer's avatar
Pierre Kraemer committed
439 440 441 442 443
			{
				int pos = i*n+j;
				Dart d = m_tableVertDarts[pos];
				Dart e = m_tableVertDarts[pos-n];
				e = m_map.phi1(m_map.phi1(e));
444
				m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
445
			}
Pierre Kraemer's avatar
Pierre Kraemer committed
446
			if (j > 0) // sew with preceeding column
Pierre Kraemer's avatar
Pierre Kraemer committed
447 448 449 450 451 452
			{
				int pos = i*n+j;
				Dart d = m_tableVertDarts[pos];
				d = m_map.phi_1(d);
				Dart e = m_tableVertDarts[pos-1];
				e = m_map.phi1(e);
453
				m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
454 455 456 457 458 459 460 461
			}
			else 
			{
				int pos = i*n;
				Dart d = m_tableVertDarts[pos];
				d = m_map.phi_1(d);
				Dart e = m_tableVertDarts[pos+(n-1)];
				e = m_map.phi1(e);
462
				m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
463 464 465 466
			}
		}
	}

467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
	m_dart = m_tableVertDarts.front();
	return m_dart;
}


template <typename PFP>
Dart Polyhedron<PFP>::cylinder_topo(unsigned int n, unsigned int z, bool top_closed, bool bottom_closed)
{
	if (m_kind != NONE) return m_dart;

	m_dart = cylinder_topo_open(n, z);

	m_bottom_closed = bottom_closed;
	m_top_closed = top_closed;


Pierre Kraemer's avatar
Pierre Kraemer committed
483 484 485
	if (bottom_closed)
	{
		Dart d = m_tableVertDarts[0];
486
		if(m_map.closeHole(d, false))
Pierre Kraemer's avatar
Pierre Kraemer committed
487 488
		{
			d = m_map.phi2(d);
489
			if(m_map.faceDegree(d) > 3)
Pierre Kraemer's avatar
Pierre Kraemer committed
490
			{
491
				Algo::Modelisation::trianguleFace<PFP>(m_map, d);
Pierre Kraemer's avatar
Pierre Kraemer committed
492 493 494 495
				m_tableVertDarts.push_back(m_map.phi_1(d));
			}
		}
	}
496 497
	else
		m_map.closeHole(m_tableVertDarts[0]);
Pierre Kraemer's avatar
Pierre Kraemer committed
498 499 500 501

	if (top_closed)
	{
		Dart d =  m_map.phi_1(m_tableVertDarts[n*z]);
502
		if(m_map.closeHole(d, false))
Pierre Kraemer's avatar
Pierre Kraemer committed
503 504
		{
			d = m_map.phi2(d);
505
			if(m_map.faceDegree(d) > 3)
Pierre Kraemer's avatar
Pierre Kraemer committed
506
			{
507
				Algo::Modelisation::trianguleFace<PFP>(m_map, d);
Pierre Kraemer's avatar
Pierre Kraemer committed
508 509 510 511
				m_tableVertDarts.push_back(m_map.phi_1(d));
			}
		}
	}
512 513
	else
		m_map.closeHole(m_map.phi_1(m_tableVertDarts[n*z]));
Pierre Kraemer's avatar
Pierre Kraemer committed
514

515
//	m_dart = m_tableVertDarts.front();
Pierre Kraemer's avatar
Pierre Kraemer committed
516 517 518 519 520
	return m_dart;
}


template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
521
Dart Polyhedron<PFP>::cube_topo(unsigned int x, unsigned int y, unsigned int z)
Pierre Kraemer's avatar
Pierre Kraemer committed
522 523 524
{
	if (m_kind != NONE) return m_dart;

525
	m_dart = cylinder_topo_open(2*(x+y), z);
Pierre Kraemer's avatar
Pierre Kraemer committed
526 527 528 529 530 531 532 533 534 535
	m_kind = CUBE;
	m_nx = x;
	m_ny = y;
	m_nz = z;

	int nb = 2*(x+y)*(z+1) + 2*(x-1)*(y-1);
	m_tableVertDarts.reserve(nb);
	
	// we now have the 4 sides, just need to create store and sew top & bottom
	// the top
536
	Polyhedron<PFP> primTop(m_map, m_positions);
537
	primTop.grid_topo_open(x,y);
Pierre Kraemer's avatar
Pierre Kraemer committed
538 539 540
	std::vector<Dart>& tableTop = primTop.getVertexDarts();

	int index_side = 2*(x+y)*z;
Pierre Kraemer's avatar
Pierre Kraemer committed
541
	for(unsigned int i = 0; i < x; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
542 543 544
	{
		Dart d = m_map.phi_1(m_tableVertDarts[index_side++]);
		Dart e = tableTop[i];
545
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
546
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
547
	for(unsigned int i = 0; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
548 549 550
	{
		Dart d = m_map.phi_1(m_tableVertDarts[index_side++]);
		Dart e = tableTop[x+i*(x+1)];
551
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
552
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
553
	for(unsigned int i = 0; i < x; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
554 555 556 557
	{
		Dart d = m_map.phi_1(m_tableVertDarts[index_side++]);
		Dart e = tableTop[(x+1)*(y+1)-2 - i];
		e = m_map.phi_1(e);
558
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
559
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
560
	for(unsigned int i = 0; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
561 562 563 564
	{
		Dart d = m_map.phi_1(m_tableVertDarts[index_side++]);
		Dart e = tableTop[(y-1-i)*(x+1)];
		e = m_map.phi_1(e);
565
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
566 567 568
	}

	// the bottom
569
	Polyhedron<PFP> primBottom(m_map,m_positions);
570
	primBottom.grid_topo_open(x,y);
Pierre Kraemer's avatar
Pierre Kraemer committed
571 572 573
	std::vector<Dart>& tableBottom = primBottom.getVertexDarts();

	index_side = 3*(x+y)+(x-1);
Pierre Kraemer's avatar
Pierre Kraemer committed
574
	for(unsigned int i = 0; i < x; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
575 576 577
	{
		Dart d = m_tableVertDarts[(index_side--)%(2*(x+y))];
		Dart e = tableBottom[i];
578
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
579
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
580
	for(unsigned int i = 0; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
581 582 583
	{
		Dart d = m_tableVertDarts[(index_side--)%(2*(x+y))];
		Dart e = tableBottom[x+i*(x+1)];
584
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
585
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
586
	for(unsigned int i = 0; i < x; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
587 588 589 590
	{
		Dart d = m_tableVertDarts[(index_side--)%(2*(x+y))];
		Dart e = tableBottom[(x+1)*(y+1)-2 - i];
		e = m_map.phi_1(e);
591
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
592
	}
Pierre Kraemer's avatar
Pierre Kraemer committed
593
	for(unsigned int i = 0; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
594 595 596 597
	{
		Dart d = m_tableVertDarts[(index_side--)%(2*(x+y))];
		Dart e = tableBottom[(y-1-i)*(x+1)];
		e = m_map.phi_1(e);
598
		m_map.sewFaces(d, e, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
599 600 601 602
	}

	// and add new vertex in m_tableVertDarts
	//top  first
Pierre Kraemer's avatar
Pierre Kraemer committed
603
	for(unsigned int i = 1; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
604
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
605
		for(unsigned int j = 1; j < x; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
606 607 608 609
			m_tableVertDarts.push_back(tableTop[i*(x+1)+j]);
	}

	// then bottom
Pierre Kraemer's avatar
Pierre Kraemer committed
610
	for(unsigned int i = 1; i < y; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
611
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
612
		for(unsigned int j = 1; j < x; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
613 614 615 616 617 618 619
			m_tableVertDarts.push_back(tableBottom[i*(x+1)+j]);
	}

	return m_dart;
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
620
Dart Polyhedron<PFP>::tore_topo(unsigned int m, unsigned int n)
Pierre Kraemer's avatar
Pierre Kraemer committed
621 622 623 624
{
	if (m_kind != NONE) return m_dart;

	m_dart = cylinder_topo(n, m, false, false);
Pierre Kraemer's avatar
Pierre Kraemer committed
625 626
	m_nx = n;
	m_ny = m;
Pierre Kraemer's avatar
Pierre Kraemer committed
627 628
	m_kind = TORE;

Pierre Kraemer's avatar
Pierre Kraemer committed
629
	// just finish to sew
Pierre Kraemer's avatar
Pierre Kraemer committed
630
	for(unsigned int i = 0; i < n; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
631 632 633 634
	{
		Dart d = m_tableVertDarts[i];
		Dart e = m_tableVertDarts[(m*n)+i];
		e = m_map.phi_1(e);
635
		m_map.sewFaces(d, e);
Pierre Kraemer's avatar
Pierre Kraemer committed
636 637 638 639 640 641 642 643 644 645
	}

	// remove the last n vertex darts that are no more necessary (sewed with n first)
	// memory not freed (but will be when destroy the Polyhedron), not important ??
	m_tableVertDarts.resize(m*n); 

	return m_dart;
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
646
void Polyhedron<PFP>::embedGrid(float x, float y, float z)
Pierre Kraemer's avatar
Pierre Kraemer committed
647 648 649
{
	typedef typename PFP::VEC3 VEC3 ;

Pierre Kraemer's avatar
Pierre Kraemer committed
650 651
	if (m_kind != GRID)
	{
652
		CGoGNerr << "Warning try to embedGrid something that is not a grid"<<CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
653 654 655
		return;
	}

Pierre Kraemer's avatar
Pierre Kraemer committed
656 657
	float dx = x / float(m_nx);
	float dy = y / float(m_ny);
Pierre Kraemer's avatar
Pierre Kraemer committed
658

Pierre Kraemer's avatar
Pierre Kraemer committed
659
	for(unsigned int i = 0; i <= m_ny; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
660
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
661
		for(unsigned int j = 0; j <= m_nx;++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
662
		{
663
			m_positions[ m_tableVertDarts[i*(m_nx+1)+j] ] = VEC3(-x/2 + dx*float(j), -y/2 + dy*float(i), z);
Pierre Kraemer's avatar
Pierre Kraemer committed
664 665 666 667 668
		}
	}
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
669
void Polyhedron<PFP>::embedCylinder(float bottom_radius, float top_radius, float height)
Pierre Kraemer's avatar
Pierre Kraemer committed
670 671 672
{
	typedef typename PFP::VEC3 VEC3 ;

Pierre Kraemer's avatar
Pierre Kraemer committed
673 674
	if (m_kind != CYLINDER)
	{
675
		CGoGNerr << "Warning try to embedCylinder something that is not a cylnder"<<CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
676 677 678 679 680 681
		return;
	}

	float alpha = float(2.0*M_PI/m_nx);
	float dz = height/float(m_nz);

Pierre Kraemer's avatar
Pierre Kraemer committed
682
	for(unsigned int i = 0; i <= m_nz; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
683 684 685
	{
		float a = float(i)/float(m_nz);
		float radius = a*top_radius + (1.0f-a)*bottom_radius;
Pierre Kraemer's avatar
Pierre Kraemer committed
686
		for(unsigned int j = 0; j < m_nx; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
687 688 689 690
		{
	
			float x = radius*cos(alpha*float(j));
			float y = radius*sin(alpha*float(j));
691
			m_positions[ m_tableVertDarts[i*(m_nx)+j] ] = VEC3(x, y, -height/2 + dz*float(i));
Pierre Kraemer's avatar
Pierre Kraemer committed
692 693 694 695 696 697
		}
	}

	int indexUmbrella = m_nx*(m_nz+1);
	if (m_bottom_closed)
	{
698
		m_positions[ m_tableVertDarts[indexUmbrella++] ] = VEC3(0.0f, 0.0f, -height/2 );
Pierre Kraemer's avatar
Pierre Kraemer committed
699 700 701 702
	}

	if (m_top_closed)
	{
703
		m_positions[ m_tableVertDarts[indexUmbrella] ] = VEC3(0.0f, 0.0f, height/2 );
Pierre Kraemer's avatar
Pierre Kraemer committed
704 705 706 707
	}
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
708
void Polyhedron<PFP>::embedCone(float radius, float height)
Pierre Kraemer's avatar
Pierre Kraemer committed
709 710 711
{
	typedef typename PFP::VEC3 VEC3 ;

712
	if (!((m_kind == CYLINDER) && (m_top_closed)) )
Pierre Kraemer's avatar
Pierre Kraemer committed
713
	{
714
		CGoGNerr << "Warning try to embedCone something that is not a cone"<<CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
715 716 717 718
		return;
	}

	float alpha = float(2.0*M_PI/m_nx);
719 720
	float dz = height/float(m_nz+1);
	for( unsigned int i = 0; i <= m_nz; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
721
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
722
		for(unsigned int j = 0; j < m_nx; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
723
		{
724
			float rad = radius * float(m_nz+1-i)/float(m_nz+1);
Pierre Kraemer's avatar
Pierre Kraemer committed
725 726 727 728
			float h = -height/2 + dz*float(i);
			float x = rad*cos(alpha*float(j));
			float y = rad*sin(alpha*float(j));

729
			m_positions[ m_tableVertDarts[i*(m_nx)+j] ] = VEC3(x, y, h);
Pierre Kraemer's avatar
Pierre Kraemer committed
730 731 732
		}
	}

733
	int indexUmbrella = m_nx*(m_nz+1);
Pierre Kraemer's avatar
Pierre Kraemer committed
734 735
	if (m_bottom_closed)
	{
736
		m_positions[ m_tableVertDarts[indexUmbrella++] ] = VEC3(0.0f, 0.0f, -height/2 );
Pierre Kraemer's avatar
Pierre Kraemer committed
737 738 739
	}

	//  top always closed in cone 
740
	m_positions[ m_tableVertDarts[indexUmbrella] ] = VEC3(0.0f, 0.0f, height/2 );
Pierre Kraemer's avatar
Pierre Kraemer committed
741 742 743
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
744
void Polyhedron<PFP>::embedSphere(float radius)
Pierre Kraemer's avatar
Pierre Kraemer committed
745 746 747
{
	typedef typename PFP::VEC3 VEC3 ;

Pierre Kraemer's avatar
Pierre Kraemer committed
748 749
	if (!((m_kind == CYLINDER) && (m_top_closed) && (m_bottom_closed)))
	{
750
		CGoGNerr << "Warning try to embedSphere something that is not a sphere (closed cylinder)"<<CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
751 752 753 754 755 756
		return;
	}

	float alpha = float(2.0*M_PI/m_nx);
	float beta = float(M_PI/(m_nz+2));

Pierre Kraemer's avatar
Pierre Kraemer committed
757
	for(unsigned int i = 0; i <= m_nz; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
758
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
759
		for(unsigned int j = 0; j < m_nx; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
760 761 762 763 764 765
		{
			float h = float(radius * sin(-M_PI/2.0+(i+1)*beta));
			float rad = float(radius * cos(-M_PI/2.0+(i+1)*beta));

			float x = rad*cos(alpha*float(j));
			float y = rad*sin(alpha*float(j));
766 767

			m_positions[ m_tableVertDarts[i*(m_nx)+j] ] = VEC3(x, y, h );
Pierre Kraemer's avatar
Pierre Kraemer committed
768 769 770 771
		}
	}

	// bottom  pole
772
	m_positions[ m_tableVertDarts[m_nx*(m_nz+1)] ] = VEC3(0.0f, 0.0f, -radius);
Pierre Kraemer's avatar
Pierre Kraemer committed
773 774

	//  top pole
775 776
	m_positions[ m_tableVertDarts[m_nx*(m_nz+1)+1] ] = VEC3(0.0f, 0.0f, radius);

Pierre Kraemer's avatar
Pierre Kraemer committed
777 778 779
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
780
void Polyhedron<PFP>::embedTore(float big_radius, float small_radius)
Pierre Kraemer's avatar
Pierre Kraemer committed
781 782 783
{
	typedef typename PFP::VEC3 VEC3 ;

Pierre Kraemer's avatar
Pierre Kraemer committed
784 785
	if (m_kind != TORE)
	{
786
		CGoGNerr << "Warning try to embedTore something that is not a tore"<<CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
787 788 789 790 791 792
		return;
	}

	float alpha = float(2.0*M_PI/m_nx);
	float beta = float(2.0*M_PI/m_ny);

Pierre Kraemer's avatar
Pierre Kraemer committed
793
	for (unsigned int i = 0; i < m_nx; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
794
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
795
		for(unsigned int j = 0; j < m_ny; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
796 797 798 799 800
		{
			float z = small_radius*sin(beta*float(j));
			float r = big_radius + small_radius*cos(beta*float(j));
			float x = r*cos(alpha*float(i));
			float y = r*sin(alpha*float(i));
801
			m_positions[ m_tableVertDarts[j*(m_nx)+i] ] = VEC3(x, y, z);
Pierre Kraemer's avatar
Pierre Kraemer committed
802 803 804 805 806
		}
	}
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
807
void Polyhedron<PFP>::embedCube(float sx, float sy, float sz)
Pierre Kraemer's avatar
Pierre Kraemer committed
808 809 810
{
	typedef typename PFP::VEC3 VEC3 ;

Pierre Kraemer's avatar
Pierre Kraemer committed
811 812
	if (m_kind != CUBE)
	{
813
		CGoGNerr << "Warning try to embedCube something that is not a cube"<<CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
814 815 816 817 818 819 820 821 822
		return;
	}

	float dz = sz/float(m_nz);
	float dy = sy/float(m_ny);
	float dx = sx/float(m_nx);

	// first embedding the sides
	int index = 0;
Pierre Kraemer's avatar
Pierre Kraemer committed
823
	for (unsigned int k = 0; k <= m_nz; ++k)
Pierre Kraemer's avatar
Pierre Kraemer committed
824 825
	{
		float z = float(k)*dz - sz/2.0f;
Pierre Kraemer's avatar
Pierre Kraemer committed
826
		for (unsigned int i = 0; i < m_nx; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
827 828
		{
			float x = float(i)*dx - sx/2.0f;
829
			m_positions[ m_tableVertDarts[ index++ ] ] = VEC3(x, -sy/2.0f, z);
Pierre Kraemer's avatar
Pierre Kraemer committed
830
		}
Pierre Kraemer's avatar
Pierre Kraemer committed
831
		for (unsigned int i = 0; i < m_ny; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
832 833
		{
			float y = float(i)*dy - sy/2.0f;
834
			m_positions[ m_tableVertDarts[ index++ ] ] = VEC3(sx/2.0f, y, z);
Pierre Kraemer's avatar
Pierre Kraemer committed
835
		}
Pierre Kraemer's avatar
Pierre Kraemer committed
836
		for (unsigned int i = 0; i < m_nx; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
837 838
		{
			float x = sx/2.0f-float(i)*dx;
839
			m_positions[ m_tableVertDarts[ index++ ] ] = VEC3(x, sy/2.0f, z);
Pierre Kraemer's avatar
Pierre Kraemer committed
840
		}
Pierre Kraemer's avatar
Pierre Kraemer committed
841
		for (unsigned int i = 0; i < m_ny ;++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
842 843
		{
			float y = sy/2.0f - float(i)*dy;
844
			m_positions[ m_tableVertDarts[ index++ ] ] = VEC3(-sx/2.0f, y, z);
Pierre Kraemer's avatar
Pierre Kraemer committed
845 846 847 848
		}
	}

	// the top
Pierre Kraemer's avatar
Pierre Kraemer committed
849
	for(unsigned int i = 1; i  <m_ny; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
850
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
851
		for(unsigned int j = 1; j < m_nx; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
852 853
		{
			VEC3 pos(-sx/2.0f+float(j)*dx, -sy/2.0f+float(i)*dy, sz/2.0f);
854
			m_positions[ m_tableVertDarts[ index++ ] ] = pos;
Pierre Kraemer's avatar
Pierre Kraemer committed
855 856 857 858
		}
	}

	// the bottom
Pierre Kraemer's avatar
Pierre Kraemer committed
859
	for(unsigned int i = 1; i < m_ny; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
860
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
861
		for(unsigned int j = 1; j < m_nx; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
862 863
		{
			VEC3 pos(-sx/2.0f+float(j)*dx, sy/2.0f-float(i)*dy, -sz/2.0f);
864
			m_positions[ m_tableVertDarts[ index++ ] ] = pos;
Pierre Kraemer's avatar
Pierre Kraemer committed
865 866 867 868 869 870 871 872 873
		}
	}
}

template <typename PFP>
void Polyhedron<PFP>::computeCenter()
{
	typename PFP::VEC3 center(0);

Pierre Kraemer's avatar
Pierre Kraemer committed
874
	for(typename std::vector<Dart>::iterator di = m_tableVertDarts.begin(); di != m_tableVertDarts.end(); ++di)
Pierre Kraemer's avatar
Pierre Kraemer committed
875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890
	{
		center += m_positions[*di];
	}

	m_center = center / typename PFP::REAL(m_tableVertDarts.size());
}

template <typename PFP>
//void Polyhedron<PFP>::transform(float* matrice)
void Polyhedron<PFP>::transform(const Geom::Matrix44f& matrice)
{
//	Geom::Vec4f v1(matrice[0],matrice[4],matrice[8], matrice[12]);
//	Geom::Vec4f v2(matrice[1],matrice[5],matrice[9], matrice[13]);
//	Geom::Vec4f v3(matrice[2],matrice[6],matrice[10],matrice[14]);
//	Geom::Vec4f v4(matrice[3],matrice[7],matrice[11],matrice[15]);

Pierre Kraemer's avatar
Pierre Kraemer committed
891
	for(typename std::vector<Dart>::iterator di = m_tableVertDarts.begin(); di != m_tableVertDarts.end(); ++di)
Pierre Kraemer's avatar
Pierre Kraemer committed
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908
	{

		typename PFP::VEC3& pos = m_positions[*di];
//
//		Geom::Vec4f VA(pos[0],pos[1],pos[2],1.0f);
//
//		Geom::Vec4f VB((VA*v1),(VA*v2),(VA*v3),(VA*v4));
//		VEC3 newPos(VB[0]/VB[3],VB[1]/VB[3],VB[2]/VB[3]);
		
		pos = Geom::transform(pos, matrice);
	}
	// transform the center
	m_center = Geom::transform(m_center, matrice);

}

template <typename PFP>
909
void Polyhedron<PFP>::mark(CellMarker<VERTEX>& m)
Pierre Kraemer's avatar
Pierre Kraemer committed
910
{
Pierre Kraemer's avatar
Pierre Kraemer committed
911
	for(typename std::vector<Dart>::iterator di = m_tableVertDarts.begin(); di != m_tableVertDarts.end(); ++di)
Pierre Kraemer's avatar
Pierre Kraemer committed
912
	{
Sylvain Thery's avatar
Sylvain Thery committed
913
		m.mark(*di);
Pierre Kraemer's avatar
Pierre Kraemer committed
914 915 916 917
	}
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
918
void Polyhedron<PFP>::embedTwistedStrip(float radius_min,  float radius_max, float turns)
Pierre Kraemer's avatar
Pierre Kraemer committed
919 920 921 922 923 924 925 926 927
{
	typedef typename PFP::VEC3 VEC3 ;

	float alpha = float(2.0*M_PI/m_ny);
	float beta = turns/float(m_ny);

	float radius = (radius_max + radius_min)/2.0f;
	float rdiff = (radius_max - radius_min)/2.0f;

Pierre Kraemer's avatar
Pierre Kraemer committed
928
	for(unsigned int i = 0; i <= m_ny; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
929
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
930
		for(unsigned int j = 0; j <= m_nx; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
931 932 933 934
		{
			float rw = -rdiff + float(j)*2.0f*rdiff/float(m_nx);
			float r = radius + rw*cos(beta*float(i));
			VEC3 pos(r*cos(alpha*float(i)), r*sin(alpha*float(i)), rw*sin(beta*float(i)));
935
			m_positions[ m_tableVertDarts[ i*(m_nx+1)+j ] ] = pos;
Pierre Kraemer's avatar
Pierre Kraemer committed
936 937 938 939 940
		}
	}
}

template <typename PFP>
Pierre Kraemer's avatar
Pierre Kraemer committed
941
void Polyhedron<PFP>::embedHelicoid(float radius_min, float radius_max, float maxHeight, float nbTurn, int orient)
Pierre Kraemer's avatar
Pierre Kraemer committed
942 943 944 945 946 947 948 949 950
{
	typedef typename PFP::VEC3 VEC3 ;

	float alpha = float(2.0*M_PI/m_nx)*nbTurn;
	float hS = maxHeight/m_nx;

// 	float radius = (radius_max + radius_min)/2.0f;
// 	float rdiff = (radius_max - radius_min)/2.0f;

Pierre Kraemer's avatar
Pierre Kraemer committed
951
	for(unsigned int i = 0; i <= m_ny; ++i)
Pierre Kraemer's avatar
Pierre Kraemer committed
952
	{
Pierre Kraemer's avatar
Pierre Kraemer committed
953
		for(unsigned int j = 0; j <= m_nx; ++j)
Pierre Kraemer's avatar
Pierre Kraemer committed
954 955 956
		{
// 			float r = radius_max + radius_min*cos(beta*float(j));
			float r,x,y;
Thomas's avatar
Thomas committed
957 958 959 960
// 			if(i==1) {
// 				r = radius_max;
// 			}
// 			else {
Pierre Kraemer's avatar
Pierre Kraemer committed
961
				r = radius_min+(radius_max-radius_min)*float(i)/float(m_ny);
Thomas's avatar
Thomas committed
962 963 964
// 			}
			x = orient*r*sin(alpha*float(j));
			y = orient*r*cos(alpha*float(j));
Pierre Kraemer's avatar
Pierre Kraemer committed
965 966 967

			VEC3 pos(x, y, j*hS);
			Dart d = m_tableVertDarts[i*(m_nx+1)+j];
Pierre Kraemer's avatar
Pierre Kraemer committed
968
			m_positions[d] = pos;
Pierre Kraemer's avatar
Pierre Kraemer committed
969 970 971 972
		}
	}
}

Sylvain Thery's avatar
Sylvain Thery committed
973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
 template <typename PFP>
 void quads2TrianglesCC(typename PFP::MAP& the_map, Dart primd)
 {
 	DartMarker m(the_map);

 	// list of faces to process and processed(before pos iterator)
 	std::list<Dart> ld;
 	ld.push_back(primd);
 	// current position in list
 	typename std::list<Dart>::iterator pos = ld.begin();
 	do
 	{
 		Dart d = *pos;

 		// cut the face of first dart of list
 		Dart d1 = the_map.phi1(d);
 		Dart e = the_map.phi1(d1);
 		Dart e1 = the_map.phi1(e);
 		Dart f = the_map.phi1(e1);
 		if (f==d) // quad
 		{
 			the_map.splitFace(d,e);
 			// mark the face
 			m.markOrbit<FACE>(d);
 			m.markOrbit<FACE>(e);
 		}
 		else m.markOrbit<FACE>(d);

 		// and store neighbours faces in the list
 		d = the_map.phi2(d);
 		e = the_map.phi2(e);
 		d1 = the_map.phi1(the_map.phi2(d1));
 		e1 = the_map.phi1(the_map.phi2(e1));

 		if (!m.isMarked(d))
 			ld.push_back(d);
 		if (!m.isMarked(e))
 			ld.push_back(e);
 		if (!m.isMarked(d1))
 			ld.push_back(d1);
 		if ((f==d) && (!m.isMarked(e1)))
 			ld.push_back(e1);
 		pos++;
 	}while (pos!=ld.end()); // stop when no more face to process
 }
Pierre Kraemer's avatar
Pierre Kraemer committed
1018 1019 1020 1021

// template <typename PFP>
// Dart triangleFan_topo(typename PFP::MAP& the_map, int n)
// {
1022
// 	Dart d = the_map.newFace(3,false);
Pierre Kraemer's avatar
Pierre Kraemer committed
1023 1024 1025
// 	Dart e = the_map.phi1(d);
// 	for(int i=1;i<n;++i)
// 	{
1026
// 		Dart f = the_map.newFace(3,false);
1027
// 		the_map.sewFaces(the_map.phi_1(f),e);
Pierre Kraemer's avatar
Pierre Kraemer committed
1028 1029
// 		e = the_map.phi1(f);
// 	}
1030
// 	the_map.sewFaces(the_map.phi_1(d),e);
Pierre Kraemer's avatar
Pierre Kraemer committed
1031 1032 1033
// 	return d;
// }

Pierre Kraemer's avatar
Pierre Kraemer committed
1034
} // namespace Modelisation
Pierre Kraemer's avatar
Pierre Kraemer committed
1035

Pierre Kraemer's avatar
Pierre Kraemer committed
1036
} // namespace Algo
Pierre Kraemer's avatar
Pierre Kraemer committed
1037

Pierre Kraemer's avatar
Pierre Kraemer committed
1038
} // namespace CGoGN