📄 showme.c
字号:
return 1;
}
*edgeptr = (int *) malloc(((*edges + 1) << 1) * sizeof(int));
if (*edgeptr == (int *) NULL) {
printf(" Out of memory.\n");
return 1;
}
*normptr = (REAL *) malloc(((*edges + 1) << 1) * sizeof(REAL));
if (*normptr == (REAL *) NULL) {
printf(" Out of memory.\n");
free(*edgeptr);
return 1;
}
index = 2;
smallerr = 1;
for (i = firstnumber; i < firstnumber + *edges; i++) {
stringptr = readline(inputline, infile, fname);
edgenumber = (int) strtol (stringptr, &stringptr, 0);
if ((edgenumber != i) && (smallerr)) {
printf(" Warning: Edges in %s are not numbered correctly.\n", fname);
printf(" (starting with edge %d).\n", i);
smallerr = 0;
}
stringptr = findfield(stringptr);
if (*stringptr == '\0') {
printf("Error: Edge %d is missing its endpoints in %s.\n", i, fname);
free(*edgeptr);
free(*normptr);
return 1;
}
(*edgeptr)[index] = (int) strtol (stringptr, &stringptr, 0) + 1 -
firstnumber;
if (((*edgeptr)[index] < 1) || ((*edgeptr)[index] > nodes)) {
printf("Error: Edge %d has invalid endpoint in %s.\n", i, fname);
return 1;
}
stringptr = findfield(stringptr);
if (*stringptr == '\0') {
printf("Error: Edge %d is missing an endpoint in %s.\n", i, fname);
free(*edgeptr);
free(*normptr);
return 1;
}
(*edgeptr)[index + 1] = (int) strtol (stringptr, &stringptr, 0);
if ((*edgeptr)[index + 1] == -1) {
stringptr = findfield(stringptr);
if (*stringptr == '\0') {
printf("Error: Edge %d is missing its direction in %s.\n", i, fname);
free(*edgeptr);
free(*normptr);
return 1;
}
(*normptr)[index] = (REAL) strtod(stringptr, &stringptr);
stringptr = findfield(stringptr);
if (*stringptr == '\0') {
printf("Error: Edge %d is missing a direction coordinate in %s.\n",
i, fname);
free(*edgeptr);
free(*normptr);
return 1;
}
(*normptr)[index + 1] = (REAL) strtod(stringptr, &stringptr);
} else {
(*edgeptr)[index + 1] += 1 - firstnumber;
if (((*edgeptr)[index + 1] < 1) || ((*edgeptr)[index + 1] > nodes)) {
printf("Error: Edge %d has invalid endpoint in %s.\n", i, fname);
return 1;
}
}
index += 2;
}
fclose(infile);
return 0;
}
int load_part(fname, dim, firstnumber, elems, nodeptr, eleptr, parts,
partition, partcenter, partshift)
char *fname;
int dim;
int firstnumber;
int elems;
REAL *nodeptr;
int *eleptr;
int *parts;
int **partition;
REAL **partcenter;
REAL **partshift;
{
FILE *infile;
char inputline[INPUTLINESIZE];
char *stringptr;
int partelems;
int index;
int elemnumber;
int i, j;
int smallerr;
int *partsize;
if (!quiet) {
printf("Opening %s.\n", fname);
}
infile = fopen(fname, "r");
if (infile == (FILE *) NULL) {
printf(" Error: Cannot access file %s.\n", fname);
return 1;
}
stringptr = readline(inputline, infile, fname);
partelems = (int) strtol (stringptr, &stringptr, 0);
if (partelems != elems) {
printf(
" Error: .ele and .part files do not agree on number of triangles.\n");
return 1;
}
stringptr = findfield(stringptr);
if (*stringptr == '\0') {
*parts = 1;
} else {
*parts = (int) strtol (stringptr, &stringptr, 0);
}
if (*parts < 1) {
printf(" Error: %s specifies %d subdomains.\n", fname, *parts);
return 1;
}
*partition = (int *) malloc((elems + 1) * sizeof(int));
if (*partition == (int *) NULL) {
printf(" Out of memory.\n");
return 1;
}
smallerr = 1;
for (i = firstnumber; i < firstnumber + partelems; i++) {
stringptr = readline(inputline, infile, fname);
elemnumber = (int) strtol (stringptr, &stringptr, 0);
if ((elemnumber != i) && (smallerr)) {
printf(" Warning: Triangles in %s are not numbered correctly.\n",
fname);
printf(" (starting with triangle %d).\n", i);
smallerr = 0;
}
stringptr = findfield(stringptr);
if (*stringptr == '\0') {
printf("Error: Triangle %d has no subdomain in %s.\n", i, fname);
free(*partition);
return 1;
}
(*partition)[i] = (int) strtol (stringptr, &stringptr, 0) - firstnumber;
if (((*partition)[i] >= *parts) || ((*partition)[i] < 0)) {
printf(" Error: Triangle %d of %s has an invalid subdomain.\n",
i, fname);
free(*partition);
return 1;
}
}
fclose(infile);
*partcenter = (REAL *) malloc(((*parts + 1) << 1) * sizeof(REAL));
if (*partcenter == (REAL *) NULL) {
printf("Error: Out of memory.\n");
free(*partition);
return 1;
}
*partshift = (REAL *) malloc((*parts << 1) * sizeof(REAL));
if (*partshift == (REAL *) NULL) {
printf("Error: Out of memory.\n");
free(*partition);
free(*partcenter);
return 1;
}
partsize = (int *) malloc((*parts + 1) * sizeof(int));
if (partsize == (int *) NULL) {
printf("Error: Out of memory.\n");
free(*partition);
free(*partcenter);
free(*partshift);
return 1;
}
index = 3;
for (i = 0; i <= *parts; i++) {
partsize[i] = 0;
(*partcenter)[i << 1] = 0.0;
(*partcenter)[(i << 1) + 1] = 0.0;
}
for (i = 1; i <= elems; i++) {
partsize[(*partition)[i]] += 3;
for (j = 0; j < 3; j++) {
(*partcenter)[(*partition)[i] << 1] +=
nodeptr[eleptr[index] * dim];
(*partcenter)[((*partition)[i] << 1) + 1] +=
nodeptr[eleptr[index++] * dim + 1];
}
}
for (i = 0; i < *parts; i++) {
(*partcenter)[i << 1] /= (REAL) partsize[i];
(*partcenter)[(i << 1) + 1] /= (REAL) partsize[i];
(*partcenter)[*parts << 1] += (*partcenter)[i << 1];
(*partcenter)[(*parts << 1) + 1] += (*partcenter)[(i << 1) + 1];
}
(*partcenter)[*parts << 1] /= (REAL) *parts;
(*partcenter)[(*parts << 1) + 1] /= (REAL) *parts;
free(partsize);
return 0;
}
int load_adj(fname, subdomains, ptr)
char *fname;
int *subdomains;
int **ptr;
{
FILE *infile;
char inputline[INPUTLINESIZE];
char *stringptr;
int i, j;
if (!quiet) {
printf("Opening %s.\n", fname);
}
infile = fopen(fname, "r");
if (infile == (FILE *) NULL) {
printf(" Error: Cannot access file %s.\n", fname);
return 1;
}
stringptr = readline(inputline, infile, fname);
*subdomains = (int) strtol (stringptr, &stringptr, 0);
if (*subdomains < 1) {
printf(" Error: %s contains %d subdomains.\n", fname, *subdomains);
return 1;
}
*ptr = (int *) malloc(*subdomains * *subdomains * sizeof(int));
if (*ptr == (int *) NULL) {
printf(" Out of memory.\n");
return 1;
}
for (i = 0; i < *subdomains; i++) {
for (j = 0; j < *subdomains; j++) {
stringptr = readline(inputline, infile, fname);
(*ptr)[i * *subdomains + j] = (int) strtol (stringptr, &stringptr, 0);
}
}
return 0;
}
void findpartshift(parts, explosion, partcenter, partshift)
int parts;
REAL explosion;
REAL *partcenter;
REAL *partshift;
{
int i;
for (i = 0; i < parts; i++) {
partshift[i << 1] = explosion *
(partcenter[i << 1] - partcenter[parts << 1]);
partshift[(i << 1) + 1] = explosion *
(partcenter[(i << 1) + 1] - partcenter[(parts << 1) + 1]);
}
}
int load_image(inc, image)
int inc;
int image;
{
int error;
switch (image) {
case NODE:
error = load_node(nodefilename[inc], &firstnumber[inc], &nodes[inc],
&node_dim[inc], &nodeptr[inc], &xlo[inc][NODE],
&ylo[inc][NODE], &xhi[inc][NODE], &yhi[inc][NODE]);
break;
case POLY:
error = load_poly(inc, polyfilename[inc], &firstnumber[inc],
&polynodes[inc], &poly_dim[inc], &polyedges[inc],
&polyholes[inc], &polynodeptr[inc], &polyedgeptr[inc],
&polyholeptr[inc],
&xlo[inc][POLY], &ylo[inc][POLY],
&xhi[inc][POLY], &yhi[inc][POLY]);
break;
case ELE:
error = load_ele(elefilename[inc], firstnumber[inc], nodes[inc],
&elems[inc], &ele_corners[inc], &eleptr[inc]);
xlo[inc][ELE] = xlo[inc][NODE];
ylo[inc][ELE] = ylo[inc][NODE];
xhi[inc][ELE] = xhi[inc][NODE];
yhi[inc][ELE] = yhi[inc][NODE];
break;
case EDGE:
error = load_edge(edgefilename[inc], firstnumber[inc], nodes[inc],
&edges[inc], &edgeptr[inc], &normptr[inc]);
xlo[inc][EDGE] = xlo[inc][NODE];
ylo[inc][EDGE] = ylo[inc][NODE];
xhi[inc][EDGE] = xhi[inc][NODE];
yhi[inc][EDGE] = yhi[inc][NODE];
break;
case PART:
error = load_part(partfilename[inc], node_dim[inc], firstnumber[inc],
elems[inc], nodeptr[inc], eleptr[inc],
&subdomains[inc], &partpart[inc], &partcenter[inc],
&partshift[inc]);
if (!error) {
findpartshift(subdomains[inc], explosion, partcenter[inc],
partshift[inc]);
}
xlo[inc][PART] = xlo[inc][NODE];
ylo[inc][PART] = ylo[inc][NODE];
xhi[inc][PART] = xhi[inc][NODE];
yhi[inc][PART] = yhi[inc][NODE];
break;
case ADJ:
error = load_adj(adjfilename[inc], &adjsubdomains[inc], &adjptr[inc]);
xlo[inc][ADJ] = xlo[inc][NODE];
ylo[inc][ADJ] = ylo[inc][NODE];
xhi[inc][ADJ] = xhi[inc][NODE];
yhi[inc][ADJ] = yhi[inc][NODE];
break;
case VORO:
error = load_node(vnodefilename[inc], &firstnumber[inc], &vnodes[inc],
&vnode_dim[inc], &vnodeptr[inc], &xlo[inc][VORO],
&ylo[inc][VORO], &xhi[inc][VORO], &yhi[inc][VORO]);
if (!error) {
error = load_edge(vedgefilename[inc], firstnumber[inc], vnodes[inc],
&vedges[inc], &vedgeptr[inc], &vnormptr[inc]);
}
break;
default:
error = 1;
}
if (!error) {
loaded[inc][image] = 1;
}
return error;
}
void choose_image(inc, image)
int inc;
int image;
{
if (!loaded[inc][image]) {
if ((image == ELE) || (image == EDGE) || (image == PART)
|| (image == ADJ)) {
if (!loaded[inc][NODE]) {
if (load_image(inc, NODE)) {
return;
}
}
}
if ((image == PART) || (image == ADJ)) {
if (!loaded[inc][ELE]) {
if (load_image(inc, ELE)) {
return;
}
}
}
if (image == ADJ) {
if (!loaded[inc][PART]) {
if (load_image(inc, PART)) {
return;
}
}
}
if (load_image(inc, image)) {
return;
}
}
current_inc = inc;
current_image = image;
}
Window make_button(name, x, y, width)
char *name;
int x;
int y;
int width;
{
XSetWindowAttributes attr;
XSizeHints hints;
Window button;
attr.background_pixel = black;
attr.border_pixel = white;
attr.backing_store = NotUseful;
attr.event_mask = ExposureMask | ButtonReleaseMask | ButtonPressMask;
attr.bit_gravity = SouthWestGravity;
attr.win_gravity = SouthWestGravity;
attr.save_under = False;
button = XCreateWindow(display, mainwindow, x, y, width, BUTTONHEIGHT - 4,
2, 0, InputOutput, CopyFromParent,
CWBackPixel | CWBorderPixel | CWEventMask |
CWBitGravity | CWWinGravity | CWBackingStore |
CWSaveUnder, &attr);
hints.width = width;
hints.height = BUTTONHEIGHT - 4;
hints.min_width = 0;
hints.min_height = BUTTONHEIGHT - 4;
hints.max_width = width;
hints.max_height = BUTTONHEIGHT - 4;
hints.width_inc = 1;
hints.height_inc = 1;
hints.flags = PMinSize | PMaxSize | PSize | PResizeInc;
XSetStandardProperties(display, button, name, "showme", None, (char **) NULL,
0, &hints);
return button;
}
void make_buttons(y)
int y;
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -