go to www.geomview.org home page
 
Home

Overview
FAQ
Documentation

Download

Mailing List

Geomview For Windows?

Support
Users
Development

Bug Reporting
Contributing
Contact Us

Sponsors

 

Site Search

 

Advanced
Search

 
About the software@geom archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Closed REQ 5922]: Geomview question


  • To: software@geom.umn.edu
  • Subject: Re: [Closed REQ 5922]: Geomview question
  • From: daemon
  • Date: Sun, 28 Jul 1996 14:53:11 -0500 (CDT)

Also-Cc:

Glad you like it!

As for internal manipulations on PolyList or other objects, there isn't much,
aside from the pointlist(3) routines in include/pointlist.h.
To deal with connectivity information, you'd have to write your own
code that looked into the polylist data structure; see include/polylistP.h.

We don't have much internal documentation; generally you just need to
read the include-files.

Here's a program that does something like what you'd need.  It gives examples
of using the PolyList data structure, and of some other OOGL library routines.


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  Makefile adjacent.c
# Wrapped by slevy at euclid on Sun Jul 28 14:48:15 1996
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(347 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Set up for your site & machine type
XGEOM = /u/gcg/ngrap
XMACHTYPE = sgi
X
X# -DTEST => Compile the test program, too
XCFLAGS = -I${GEOM}/include -g  -DTEST
X
XLIBS = -L${GEOM}/lib/${MACHTYPE} \
X	-lstubdraw -lgeom -lpolylist -lbbox \
X	-lstub -lgeom -lbbox -lshade -l3d -lcolor -loogl -lm
X
Xadjacent:	adjacent.o
X	${CC} -o $@ ${CFLAGS} adjacent.o ${LIBS}
END_OF_FILE
if test 347 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'adjacent.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'adjacent.c'\"
else
echo shar: Extracting \"'adjacent.c'\" \(3855 characters\)
sed "s/^X//" >'adjacent.c' <<'END_OF_FILE'
X/* This could go in a header file... */
X#include "geom.h"
X
X/*
X * Construct table of adjacencies for a PolyList object
X * (loaded from an OFF file).  Returns NULL if given a non-PolyList.
X */
Xextern struct adjs *PLadjacencies(Geom *polylist);
X
X/* 
X * Return 1 if v0 is adjacent to v1, otherwise 0.
X */
Xextern int is_adj(struct adjs *, int v0, int v1);
X/* 
X * Define v0 as being adjacent to v1.
X * Return 1 if we already knew that, otherwise 0.
X */
Xextern int add_adj(struct adjs *, int v0, int v1);
X
X
X/* And here's the source, which reads the internals of PolyList objects */
X#include "polylistP.h"
X/* #include "adjacent.h" if you put the above in something like that */
X
X/*
X * We represent adjacencies with an array of "vvec"s -- variable-length
X * vectors, as described in ooglutil.h.  We have an array of vvecs;
X * the array is indexed by vertex number, and the i'th vvec contains a list
X * of vertex-numbers of other vertices adjacent (along some polylist edge)
X * to vertex i.
X */
Xstruct adjs {
X   Geom *pl;		/* The PolyList object, loaded via e.g. GeomFLoad() */
X   int nverts;		/* number of vertices */
X   vvec *adj;		/* array of variable-length vectors, each holding int's */
X};
X
X
X/* We assume adjacencies are symmetrical; to save space we only store
X * adjacencies(i,j) where i < j.
X */
X
X/* 
X * Return 1 if v0 is adjacent to v1, otherwise 0.
X */
Xint
Xis_adj(struct adjs *adj, int v0, int v1)
X{
X  int *vp, nadj, i;
X
X  if(adj == NULL || v0 < 0 || v0 > adj->nverts || v1 < 0 || v1 > adj->nverts)
X	return 0;
X  if(v0 > v1) {
X    i = v1;
X    v1 = v0;
X    v0 = i;
X  }
X  vp = VVEC(adj->adj[v0], int);
X  nadj = VVCOUNT(adj->adj[v0]);
X  for(i = 0; i < nadj; i++)
X    if(vp[i] == v1)
X	return 1;
X  return 0;
X}
X
X/* 
X * Define v0 as being adjacent to v1.
X * Return 1 if we already knew that, otherwise 0.
X */
Xint
Xadd_adj(struct adjs *adj, int v0, int v1)
X{
X  int *vp, nadj, i;
X
X  if(adj == NULL || v0 < 0 || v0 > adj->nverts || v1 < 0 || v1 > adj->nverts)
X	return 0;
X  if(v0 > v1) {
X    i = v1;
X    v1 = v0;
X    v0 = i;
X  }
X  vp = VVEC(adj->adj[v0], int);
X  nadj = VVCOUNT(adj->adj[v0]);
X  for(i = 0; i < nadj; i++)
X    if(vp[i] == v1)
X	return 1;
X  *VVAPPEND(adj->adj[v0], int) = v1;
X  return 0;
X}
X
Xstruct adjs *
XPLadjacencies(Geom *g)
X{
X  struct adjs *adj;
X  Poly *p;
X  int i, j;
X   /* Is this really a PolyList? */
X  if(g == NULL || strcmp(GeomName(g), "polylist") != 0)
X	return NULL;
X
X#define gpl ((PolyList *)g)
X
X  adj = OOGLNewE(struct adjs, "PL adjacencies");
X  adj->pl = g;
X  adj->nverts = gpl->n_verts;
X  adj->adj = OOGLNewNE(vvec, adj->nverts, "PL adjacencies vvecs");
X
X  /* Initialize each vvec as an array of int's, initial length 10 */
X  for(i = 0; i < gpl->n_verts; i++)
X	VVINIT(adj->adj[i], int, 10);
X
X  /* Loop over all polylist faces */
X  for(j = 0; j < gpl->n_polys; j++) {
X    Poly *p = &gpl->p[j];
X
X    /* Vertices in each face are saved as pointers into the "vl" array of
X     * all vertices of the polyhedron; subtract to get vertex number.
X     */
X    int prevvno = (p->v[p->n_vertices-1] - gpl->vl);
X    for(i = 0; i < p->n_vertices; i++) {
X	int vno = (p->v[i] - gpl->vl);
X	add_adj(adj, prevvno, vno);
X	prevvno = vno;
X    }
X  }
X  return adj;
X}
X	
X#ifdef TEST
X
X/* test program: loads an OFF file, accepts pairs of vertex numbers */
Xmain(int argc, char *argv[])
X{
X   Geom *g = GeomLoad(argv[1]);
X   struct adjs *adj = PLadjacencies(g);
X   int v0, v1;
X
X   if(g == NULL) {
X	fprintf(stderr, "%s: %s: Couldn't load\n", argv[0], argv[1]);
X	exit(1);
X   }
X   if(adj == NULL) {
X	fprintf(stderr, "%s: %s isn't an OFF file\n", argv[0], argv[1]);
X	exit(1);
X   }
X   printf("Enter pairs of vertex numbers (in the range 0..%d)\n",
X	adj->verts - 1);
X   for(;;) {
X     printf("v0 v1 : ");
X     if(scanf("%d %d", &v0, &v1) < 2)
X	break;
X     printf("vertices %d and %d are%s adjacent\n", v0, v1,
X		is_adj(adj, v0, v1) ? "" : " not");
X   }
X   exit(0);
X}
X#endif
END_OF_FILE
if test 3855 -ne `wc -c <'adjacent.c'`; then
    echo shar: \"'adjacent.c'\" unpacked with wrong size!
fi
# end of 'adjacent.c'
fi
echo shar: End of shell archive.
exit 0


 
Home | Overview | FAQ | Documentation | Support | Download | Mailing List
Windows? | Development | Bug Reporting | Contributing | Contact Us | Sponsors
 
site hosted by
SourceForge Logo