示例#1
0
文件: cartesian.c 项目: ClavinSBU/gts
static GtsEdge * new_edge (GtsVertex * v1, GtsVertex * v2)
{
  GtsSegment * s = gts_vertices_are_connected (v1, v2);
  return s == NULL ? 
    gts_edge_new (GTS_EDGE_CLASS (gts_constraint_class ()), v1, v2) :
    GTS_EDGE (s);
}
示例#2
0
文件: edge.c 项目: MicBosi/GTS
/**
 * gts_edge_belongs_to_tetrahedron:
 * @e: a #GtsEdge.
 *
 * Returns: %TRUE if @e is used by faces forming a tetrahedron, %FALSE
 * otherwise.
 */
gboolean gts_edge_belongs_to_tetrahedron (GtsEdge * e)
{
    GSList * i;
    GtsVertex * v1, * v2;

    g_return_val_if_fail (e != NULL, FALSE);

    v1 = GTS_SEGMENT (e)->v1;
    v2 = GTS_SEGMENT (e)->v2;
    i = e->triangles;
    while (i) {
        GtsEdge * e1, * e2;
        GtsVertex * vt1;
        GSList * j = i->next;
        triangle_vertices_edges (i->data, e, &vt1, &e1, &e2);
        while (j) {
            GtsSegment * s5;
            GtsEdge * e3, * e4;
            GtsVertex * vt2;

            triangle_vertices_edges (j->data, e, &vt2, &e3, &e4);
            s5 = gts_vertices_are_connected (vt1, vt2);
            if (GTS_IS_EDGE (s5) &&
                    gts_triangle_use_edges (e1, e3, GTS_EDGE (s5)) &&
                    gts_triangle_use_edges (e2, e4, GTS_EDGE (s5)))
                return TRUE;
            j = j->next;
        }
        i = i->next;
    }

    return FALSE;
}
示例#3
0
static PyObject*
is_connected(PygtsVertex *self, PyObject *args)
{
  PyObject *v_;
  PygtsVertex *v;

  SELF_CHECK

  /* Parse the args */  
  if(! PyArg_ParseTuple(args, "O", &v_) ) {
    return NULL;
  }

  /* Convert to PygtsObjects */
  if(!pygts_vertex_check(v_)) {
    PyErr_SetString(PyExc_TypeError,"expected a Vertex");
    return NULL;
  }
  v = PYGTS_VERTEX(v_);

  if( gts_vertices_are_connected(PYGTS_VERTEX_AS_GTS_VERTEX(self),
				 PYGTS_VERTEX_AS_GTS_VERTEX(v)) != NULL ) {
    Py_INCREF(Py_True);
    return Py_True;
  }
  else {
    Py_INCREF(Py_False);
    return Py_False;
  }
}
示例#4
0
文件: edge.c 项目: MicBosi/GTS
/**
 * gts_edge_swap:
 * @e: a #GtsEdge.
 * @s: a #GtsSurface.
 *
 * Performs an "edge swap" on the two triangles sharing @e and
 * belonging to @s.
 */
void gts_edge_swap (GtsEdge * e, GtsSurface * s)
{
    GtsTriangle * t1 = NULL, * t2 = NULL, * t;
    GtsFace * f;
    GSList * i;
    GtsVertex * v1, * v2, * v3, * v4, * v5, * v6;
    GtsEdge * e1, * e2, * e3, * e4;
    GtsSegment * v3v6;

    g_return_if_fail (e != NULL);
    g_return_if_fail (s != NULL);

    i = e->triangles;
    while (i) {
        if (GTS_IS_FACE (i->data) && gts_face_has_parent_surface (i->data, s)) {
            if (!t1)
                t1 = i->data;
            else if (!t2)
                t2 = i->data;
            else
                g_return_if_fail (gts_edge_face_number (e, s) == 2);
        }
        i = i->next;
    }
    g_assert (t1 && t2);

    gts_triangle_vertices_edges (t1, e, &v1, &v2, &v3, &e, &e1, &e2);
    gts_triangle_vertices_edges (t2, e, &v4, &v5, &v6, &e, &e3, &e4);
    g_assert (v2 == v4 && v1 == v5);

    v3v6 = gts_vertices_are_connected (v3, v6);
    if (!GTS_IS_EDGE (v3v6))
        v3v6 = GTS_SEGMENT (gts_edge_new (s->edge_class, v3, v6));
    f = gts_face_new (s->face_class, e1, GTS_EDGE (v3v6), e4);
    if ((t = gts_triangle_is_duplicate (GTS_TRIANGLE (f))) &&
            GTS_IS_FACE (t)) {
        gts_object_destroy (GTS_OBJECT (f));
        f = GTS_FACE (t);
    }
    gts_surface_add_face (s, f);

    f = gts_face_new (s->face_class, GTS_EDGE (v3v6), e2, e3);
    if ((t = gts_triangle_is_duplicate (GTS_TRIANGLE (f))) &&
            GTS_IS_FACE (t)) {
        gts_object_destroy (GTS_OBJECT (f));
        f = GTS_FACE (t);
    }
    gts_surface_add_face (s, f);

    gts_surface_remove_face (s, GTS_FACE (t1));
    gts_surface_remove_face (s, GTS_FACE (t2));
}