⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bloomenthal.h

📁 快速fft变换的c实现
💻 H
字号:
// Bloomenthal.h: Bloomenthal's polygonizer 
//
//////////////////////////////////////////////////////////////////////

/*
#if !defined(AFX_BLOOMENTHAL_H__AAB677A8_023A_4833_83BC_FB97144ECC3B__INCLUDED_)
#define AFX_BLOOMENTHAL_H__AAB677A8_023A_4833_83BC_FB97144ECC3B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
  */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
//#include <sys/types.h>

#include "ImplicitFunc.h"
#include "Mesh.h"

/*
 * C code from the article
 * "An Implicit Surface Polygonizer"
 * by Jules Bloomenthal, jbloom@beauty.gmu.edu
 * in "Graphics Gems IV", Academic Press, 1994
 */

/* implicit.c
 *     an implicit surface polygonizer, translated from Mesa
 *     applications should call polygonize()
 *
 * to compile a test program for ASCII output:
 *     cc implicit.c -o implicit -lm
 *
 * to compile a test program for display on an SGI workstation:
 *     cc -DSGIGFX implicit.c -o implicit -lgl_s -lm
 *
 * Authored by Jules Bloomenthal, Xerox PARC.
 * Copyright (c) Xerox Corporation, 1991.  All rights reserved.
 * Permission is granted to reproduce, use and distribute this code for
 * any and all purposes, provided that this notice appears in all copies. */

namespace BLOOMENTHAL{

#define TET	0  /* use tetrahedral decomposition */
#define NOTET	1  /* no tetrahedral decomposition  */

#define RES	10 /* # converge iterations    */

#define L	0  /* left direction:	-x, -i */
#define R	1  /* right direction:	+x, +i */
#define B	2  /* bottom direction: -y, -j */
#define T	3  /* top direction:	+y, +j */
#define N	4  /* near direction:	-z, -k */
#define F	5  /* far direction:	+z, +k */
#define LBN	0  /* left bottom near corner  */
#define LBF	1  /* left bottom far corner   */
#define LTN	2  /* left top near corner     */
#define LTF	3  /* left top far corner      */
#define RBN	4  /* right bottom near corner */
#define RBF	5  /* right bottom far corner  */
#define RTN	6  /* right top near corner    */
#define RTF	7  /* right top far corner     */

/* the LBN corner of cube (i, j, k), corresponds with location
 * (start.x+(i-.5)*size, start.y+(j-.5)*size, start.z+(k-.5)*size) */

#define RAND()	    ((rand()&32767)/32767.)    /* random number between 0 and 1 */
#define HASHBIT	    (5)
#define HASHSIZE    (size_t)(1<<(3*HASHBIT))   /* hash table size (32768) */
#define MASK	    ((1<<HASHBIT)-1)
#define HASH(i,j,k) ((((((i)&MASK)<<HASHBIT)|((j)&MASK))<<HASHBIT)|((k)&MASK))
#define BIT(i, bit) (((i)>>(bit))&1)
#define FLIP(i,bit) ((i)^1<<(bit)) /* flip the given bit of i */

#define LB	0  /* left bottom edge	*/
#define LT	1  /* left top edge	*/
#define LN	2  /* left near edge	*/
#define LF	3  /* left far edge	*/
#define RB	4  /* right bottom edge */
#define RT	5  /* right top edge	*/
#define RN	6  /* right near edge	*/
#define RF	7  /* right far edge	*/
#define BN	8  /* bottom near edge	*/
#define BF	9  /* bottom far edge	*/
#define TN	10 /* top near edge	*/
#define TF	11 /* top far edge	*/

//void *calloc();
//char *mycalloc();

#define FILEOUT false
#define TRIFILE "tri.tmp"
#define VERFILE "ver.tmp"
#define MESHFILE "mesh.ply2"

class Bloomenthal  
{

typedef struct point {		   /* a three-dimensional point */
    double x, y, z;		   /* its coordinates */
} POINT1;

typedef struct test {		   /* test the function for a signed value */
    POINT1 p;			   /* location of test */
    double value;		   /* function value at p */
    int ok;			   /* if value is of correct sign */
} TEST;

typedef struct vertex {		   /* surface vertex */
    POINT1 position;//, normal;	   /* position and surface normal */
} VERTEX;

typedef struct vertices {	   /* list of vertices in polygonization */
    int count, max;		   /* # vertices, max # allowed */
    VERTEX *ptr;		   /* dynamically allocated */
} VERTICES;

typedef struct corner {		   /* corner of a cube */
    int i, j, k;		   /* (i, j, k) is index within lattice */
    double x, y, z, value;	   /* location and function value */
} CORNER;

typedef struct cube {		   /* partitioning cell (cube) */
    int i, j, k;		   /* lattice location of cube */
    CORNER *corners[8];		   /* eight corners */
} CUBE;

typedef struct cubes {		   /* linked list of cubes acting as stack */
    CUBE cube;			   /* a single cube */
    struct cubes *next;		   /* remaining elements */
} CUBES;

typedef struct centerlist {	   /* list of cube locations */
    int i, j, k;		   /* cube location */
    struct centerlist *next;	   /* remaining elements */
} CENTERLIST;

typedef struct cornerlist {	   /* list of corners */
    int i, j, k;		   /* corner id */
    double value;		   /* corner value */
    struct cornerlist *next;	   /* remaining elements */
} CORNERLIST;

typedef struct edgelist {	   /* list of edges */
    int i1, j1, k1, i2, j2, k2;	   /* edge corner ids */
    int vid;			   /* vertex id */
    struct edgelist *next;	   /* remaining elements */
} EDGELIST;

typedef struct intlist {	   /* list of integers */
    int i;			   /* an integer */
    struct intlist *next;	   /* remaining elements */
} INTLIST;

typedef struct trilist {
	int i1, i2, i3;
	struct trilist *next;
} TRILIST;

typedef struct intlists {	   /* list of list of integers */
    INTLIST *list;		   /* a list of integers */
    struct intlists *next;	   /* remaining elements */
} INTLISTS;

typedef struct process {	   /* parameters, function, storage */
    //double (*function)(double x, double y, double z);	   /* implicit surface function */
    //int (*triproc)(int i1, int i2, int i3, VERTICES vertices);		   /* triangle output function */
    double size, delta;		   /* cube size, normal delta */
    //int bounds;			   /* cube range within lattice */
	float boundsX1, boundsX2;
	float boundsY1, boundsY2;
	float boundsZ1, boundsZ2;
	POINT1 start;		   /* start point on surface */
    CUBES *cubes;		   /* active cubes */
    VERTICES vertices;		   /* surface vertices */
    CENTERLIST **centers;	   /* cube center hash table */
    CORNERLIST **corners;	   /* corner value hash table */
    EDGELIST **edges;		   /* edge and vertex id hash table */
} PROCESS;

public:
	ImplicitFunc *func;
	//INTLISTS *cubetable[256];

	int gntris;	     /* global needed by application */
	VERTICES gvertices;  /* global needed by application */
	TRILIST *tris;

	FILE* tri_file;
	FILE* ver_file;

public:
	double function(double x, double y, double z);
	void converge (POINT1 *p1, POINT1 *p2, double v, POINT1 *p);
	void vnormal (POINT1 *point, PROCESS *p, POINT1 *v);
	void addtovertices (VERTICES *vertices, VERTEX v);
	int vertid (CORNER *c1, CORNER *c2, PROCESS *p);
	int getedge (EDGELIST *table[], int i1, int j1, int k1, int i2, int j2, int k2);
	void setedge (EDGELIST *table[], int i1, int j1, int k1, int i2, int j2, int k2, int vid);
	int setcenter(CENTERLIST *table[], int i, int j, int k);
	char * mycalloc (int nitems, int nbytes);
	void makecubetable ();
	int otherface (int edge, int face);
	int nextcwedge (int edge, int face);
	int docube  (CUBE* cube, PROCESS* p);
	int dotet (CUBE* cube, int c1, int c2, int c3, int c4, PROCESS* p);
	TEST find1(int sign, PROCESS* p, double x, double y, double z);
	CORNER * setcorner1(PROCESS* p, int i, int j, int k);
	void testface (int i, int j, int k, CUBE* old, int face, int c1, int c2, int c3, int c4, PROCESS* p);
	char* polygonize (Mesh *mesh, double size, float bounds[6], double x, double y, double z, int mode);
	int triproc (int i1, int i2, int i3, VERTICES vertices);
	double blob (double x, double y, double z);
	double sphere (double x, double y, double z);
	double torus (double x, double y, double z);
	Bloomenthal();
	virtual ~Bloomenthal();
};
}

//#endif // !defined(AFX_BLOOMENTHAL_H__AAB677A8_023A_4833_83BC_FB97144ECC3B__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -