Exemple #1
0
INLINE Real metric_edge_length(
    Few<Vector<dim>, 2> p, Few<Matrix<dim, dim>, 2> ms) {
  auto v = p[1] - p[0];
  auto l_a = metric_length(ms[0], v);
  auto l_b = metric_length(ms[1], v);
  return edge_length(l_a, l_b);
}
typename viennagrid::result_of::coord<typename PointAccessorT::value_type>::type aspect_ratio_impl(PointAccessorT const point_accessor, ElementT const & element, NumericLimitsT)
{
    typedef typename PointAccessorT::value_type               PointType;
    typedef typename viennagrid::result_of::coord<PointType>::type               NumericType;
    typedef typename viennagrid::result_of::const_line_range<ElementT>::type          LinesOnElementRangeType;
    typedef typename viennagrid::result_of::iterator<LinesOnElementRangeType>::type   LinesOnElementRangeIterator;

    PointType circum_center = viennagrid::circumcenter(point_accessor, element);
    NumericType circum_radius = viennagrid::norm_2( point_accessor(viennagrid::vertices(element)[0]) - circum_center );

    LinesOnElementRangeType lines(element);

    NumericType min_length = 2 * circum_radius;
    std::vector<NumericType> edge_length( lines.size() );
//       unsigned int index = 0;
    for (LinesOnElementRangeIterator lit = lines.begin(); lit != lines.end(); ++lit)
    {
        PointType line = point_accessor( viennagrid::vertices(*lit)[0] ) -
                         point_accessor( viennagrid::vertices(*lit)[1] );

        NumericType length = viennagrid::norm_2( line );
        if (length < min_length)
            min_length = length;
    }

    return circum_radius / min_length;
}
Exemple #3
0
HalfEdge * element_max_edge( const Element *el, gdouble *length )
{
    g_return_val_if_fail( el != NULL, NULL );

    HalfEdge *he_iter = el->adjacent_halfedge;
    HalfEdge *max_he = he_iter;
    gdouble max_length = edge_length( he_iter->edge );

    for ( he_iter = he_iter->next; he_iter != el->adjacent_halfedge; he_iter = he_iter->next )
    {
        gdouble l = edge_length( he_iter->edge );
        if ( l > max_length )
        {
            max_length = l;
            max_he = he_iter;
        }
    }

    if ( length != NULL )
        *length = max_length;

    return max_he;
}
Exemple #4
0
vec4 control_polygon_length(in samplerBuffer	data,
			    in int		offset,
			    in int 		u,
			    in int		v)
{
	int i, j;
	vec4 output = vec4(0.0);
	vec4 first, second;
	mat4 mvp = projection_matrix * view_matrix * model_matrix;

//	2------3
//	|      |
//      |      |
//      0------1

	/*For Edge 01*/
	for ( i = 1; i < u; ++i ) {
		output[0] += edge_length(texelFetch(data, offset + i).xyz, texelFetch(data, offset + i - 1).xyz);
	}

	/*For Edge 13*/
	for ( i = 2 * u - 1; i < u * v; i += u ) {
		output[1] += edge_length(texelFetch(data, offset + i).xyz, texelFetch(data, offset + i - u).xyz);
	}

	/*For Edge 23*/
	for ( i = u * v - u + 1; i < u * v; ++i ) {
		output[2] += edge_length(texelFetch(data, offset + i).xyz, texelFetch(data, offset + i - 1).xyz);
	}

	/*For Edge 02*/
	for ( i = u; i <= u * v - u; i += u ) {
		output[3] += edge_length(texelFetch(data, offset + i).xyz, texelFetch(data, offset + i - u).xyz);
	}
/**/
	return output;
}
void UpdateDesiredMeshDensity::computeExistingLengths()
{
  QSet<int> all_bcs = GuiMainWindow::pointer()->getAllBoundaryCodes();
  QSet<int> fixed_bcs = all_bcs - m_BoundaryCodes;
  QVector<double> edge_length(m_Grid->GetNumberOfPoints(), 1e99);
  QVector<int> edge_count(m_Grid->GetNumberOfPoints(), 0);
  m_Fixed.fill(false, m_Grid->GetNumberOfPoints());
  EG_VTKDCC(vtkIntArray, cell_code, m_Grid, "cell_code");
  for (vtkIdType id_cell = 0; id_cell < m_Grid->GetNumberOfCells(); ++id_cell) {
    if (isSurface(id_cell, m_Grid)) {
      if (fixed_bcs.contains(cell_code->GetValue(id_cell))) {
        vtkIdType N_pts, *pts;
        m_Grid->GetCellPoints(id_cell, N_pts, pts);
        QVector<vec3_t> x(N_pts);
        for (int i = 0; i < N_pts; ++i) {
          m_Grid->GetPoint(pts[i], x[i].data());
          m_Fixed[pts[i]] = true;
        }
        for (int i = 0; i < N_pts; ++i) {
          int j = i + 1;
          if (j >= N_pts) {
            j = 0;
          }
          double L = (x[i] - x[j]).abs();
          edge_length[pts[i]] = min(edge_length[pts[i]], L);
          edge_length[pts[j]] = min(edge_length[pts[j]], L);
          ++edge_count[pts[i]];
          ++edge_count[pts[j]];
        }
      }
    }
  }
  EG_VTKDCN(vtkDoubleArray, characteristic_length_desired,   m_Grid, "node_meshdensity_desired");
  for (vtkIdType id_node = 0; id_node < m_Grid->GetNumberOfPoints(); ++id_node) {
    if (edge_count[id_node] > 0) {
      if (edge_length[id_node] > 1e98) {
        EG_BUG;
      }
      characteristic_length_desired->SetValue(id_node, edge_length[id_node]);
    }
  }
}
Exemple #6
0
void Boundary::fix_contours (bool silent) {
    assert_boundary (*this);
    if (!silent)
        std::cerr << "fix_contours";
    int deg_edges = 0;
    int deg_spikes = 0;
    std::vector <int> deg_con_indices;
    Boundary::contour_iterator cit = contours_begin ();
    Boundary::contour_iterator cit_end = contours_end ();
    Boundary::edge_iterator eit, eit_end;
    while (cit != cit_end) {
        bool fixed_something = false;
        eit = edges_begin (cit);
        eit_end = edges_end (cit);
        // remove spikes with exterior angle = pi
        while (eit != eit_end) {
            edge_iterator eit_next = eit;
            ++eit_next;

            vec_t d = edge_vertex1 (eit_next);
            d -= edge_vertex0 (eit);

            if (d.norm () < VERTEX_MERGE_TOLERANCE) {
                if (is_self_referential (eit)) {
                    // further processing is dangerous
                    goto deg_contour;
                }
                // remove spike.  the norm-zero edge created by this
                // operation is removed later
                eit = remove_vertex1 (eit);
                ++deg_spikes;
                --eit;
                // remove_vertex1 could have removed our end
                eit_end = edges_end (cit);
                fixed_something = true;
            } else {
                eit = eit_next;
            }
        }
        eit = edges_begin (cit);
        // remove norm-zero edges
        while (eit != eit_end) {
            double len = edge_length (eit);
            if (len < VERTEX_MERGE_TOLERANCE) {
                if (is_self_referential (eit)) {
                    // further processing is dangerous
                    goto deg_contour;
                }
                ++deg_edges;
                eit = remove_vertex1 (eit);
                // remove_vertex1 could have removed our end
                eit_end = edges_end (cit);
                fixed_something = true;
            } else {
                ++eit;
            }
        }

        if (!fixed_something)
            ++cit;
        continue;

    deg_contour:
        // current contour has been reduced to or was a single-vertex
        // contour.  we mark it for later removal.
        deg_con_indices.push_back (cit - contours_begin ());
        ++cit;
    }
    int deg_contours = (int)deg_con_indices.size ();
    // remove degenerate contours
    {
        std::vector <int>::reverse_iterator it;
        it = deg_con_indices.rbegin ();
        for (; it != deg_con_indices.rend (); ++it) {
            erase_contour_by_index (*it);
        }
    }

    // final "status report"
    if (!silent) {
        std::cerr << "\n"
                  << std::setw (4) << deg_contours << " deg. contours (removed)\n"
                  << std::setw (4) << deg_spikes << " deg. spikes (removed)\n"
                  << std::setw (4) << deg_edges << " deg. edges (removed)\n";
    }
    assert_boundary (*this);
}
Exemple #7
0
INLINE Real iso_edge_length(Few<Vector<dim>, 2> p, Few<Real, 2> hs) {
  auto real_l = norm(p[1] - p[0]);
  auto l_a = real_l / hs[0];
  auto l_b = real_l / hs[0];
  return edge_length(l_a, l_b);
}