You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.6 KiB
97 lines
2.6 KiB
// This file is part of libigl, a simple c++ geometry processing library.
|
|
//
|
|
// Copyright (C) 2019 Alec Jacobson <alecjacobson@gmail.com>
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public License
|
|
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
|
// obtain one at http://mozilla.org/MPL/2.0/.
|
|
#include "quad_grid.h"
|
|
#include "grid.h"
|
|
|
|
template<
|
|
typename DerivedV,
|
|
typename DerivedQ,
|
|
typename DerivedE>
|
|
IGL_INLINE void igl::quad_grid(
|
|
const int nx,
|
|
const int ny,
|
|
Eigen::PlainObjectBase<DerivedV> & V,
|
|
Eigen::PlainObjectBase<DerivedQ> & Q,
|
|
Eigen::PlainObjectBase<DerivedE> & E)
|
|
{
|
|
grid(Eigen::Vector2i(nx,ny),V);
|
|
return igl::quad_grid(nx,ny,Q,E);
|
|
}
|
|
|
|
template<
|
|
typename DerivedQ,
|
|
typename DerivedE>
|
|
IGL_INLINE void igl::quad_grid(
|
|
const int nx,
|
|
const int ny,
|
|
Eigen::PlainObjectBase<DerivedQ> & Q,
|
|
Eigen::PlainObjectBase<DerivedE> & E)
|
|
{
|
|
Eigen::MatrixXi I(nx,ny);
|
|
Q.resize( (nx-1)*(ny-1),4);
|
|
E.resize((nx-1)*ny + (ny-1)*nx,2);
|
|
{
|
|
int v = 0;
|
|
int q = 0;
|
|
int e = 0;
|
|
// Ordered to match igl::grid
|
|
for(int y = 0;y<ny;y++)
|
|
{
|
|
for(int x = 0;x<nx;x++)
|
|
{
|
|
//// Add a vertex
|
|
//V(v,0) = (-1.0) + double(x)/double(nx-1) * (1.0 - (-1.0));
|
|
//V(v,2) = (-1.0) + double(y)/double(ny-1) * (1.0 - (-1.0));
|
|
I(x,y) = v;
|
|
v++;
|
|
// Add a verical edge
|
|
if(y>0)
|
|
{
|
|
E(e,0) = I(x,y);
|
|
E(e,1) = I(x,y-1);
|
|
e++;
|
|
}
|
|
// Add a horizontal edge
|
|
if(x>0)
|
|
{
|
|
E(e,0) = I(x,y);
|
|
E(e,1) = I(x-1,y);
|
|
e++;
|
|
}
|
|
// Add two triangles
|
|
if(x>0 && y>0)
|
|
{
|
|
// -1,0----0,0
|
|
// | / |
|
|
// | / |
|
|
// | / |
|
|
// | / |
|
|
// -1,-1---0,-1
|
|
Q(q,0) = I(x-0,y-0);
|
|
Q(q,1) = I(x-1,y-0);
|
|
Q(q,2) = I(x-1,y-1);
|
|
Q(q,3) = I(x-0,y-1);
|
|
q++;
|
|
//F(f,2) = I(x-0,y-0);
|
|
//F(f,1) = I(x-1,y-0);
|
|
//F(f,0) = I(x-1,y-1);
|
|
//f++;
|
|
//F(f,2) = I(x-0,y-0);
|
|
//F(f,1) = I(x-1,y-1);
|
|
//F(f,0) = I(x-0,y-1);
|
|
//f++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifdef IGL_STATIC_LIBRARY
|
|
// Explicit template instantiation
|
|
template void igl::quad_grid<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(int, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
|
#endif
|
|
|