📄 utils.c
字号:
/* ***************************************************** * * SaVi by Robert Thurman (thurman@geom.umn.edu) and * Patrick Worfolk (worfolk@alum.mit.edu). * * Copyright (c) 1997 by The Geometry Center. * This file is part of SaVi. SaVi is free software; * you can redistribute it and/or modify it only under * the terms given in the file COPYRIGHT which you should * have received along with this file. SaVi may be * obtained from: * http://savi.sourceforge.net/ * http://www.geom.uiuc.edu/locate/SaVi * ***************************************************** * * utils.c * * $Id: utils.c,v 1.7 2004/04/14 15:14:55 lloydwood Exp $ */#include <stdlib.h>#include <stdio.h>#include <math.h>/* for select */#include <unistd.h>#include <sys/time.h>#include "constants.h"#include "utils.h"/* * copyfile(stdout, "data.txt") * * Will copy the file data.txt to stdout. * Returns TRUE if successful, else FALSE. */unsigned intcopyfile(FILE * out_fp, const char filename[]){ FILE *in_fp; char buf[256]; if (!out_fp) return FALSE; if (NULL == (in_fp = fopen(filename, "r"))) return FALSE; while (fgets(buf, 256, in_fp)) { fprintf(out_fp, "%s", buf); } fflush(out_fp); fclose(in_fp); return TRUE;}/* * forward over comments and any newlines and white space * */voidforward_over_comments(FILE * fp){ int c = getc(fp); while ((c == '\n') || (c == ' ') || (c == '\t') || (c == '#')) { if (c == '#') { /* skip to end of line */ do { c = getc(fp); } while ((c != '\n') && (c != EOF)); } c = getc(fp); } ungetc(c, fp);}/* * identity * * Fills in a 4x4 matrix to be the identity matrix */voididentity(double m[4][4]){ unsigned int i, j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) m[i][j] = ((i == j) ? 1.0 : 0.0);}/* * Return the norm of a CartesianCoordinate vector */doublenorm(const CartesianCoordinates * px){ return (sqrt(px->x * px->x + px->y * px->y + px->z * px->z));}/* * Normalizes a CartesianCoordinate vector to unit length */voidnormalize(CartesianCoordinates * px){ double l = norm(px); if (l == 0.0) return; px->x /= l; px->y /= l; px->z /= l;}/* * Return the dot-product of two CartesianCoordinate vectors. */doubledot(const CartesianCoordinates * px, const CartesianCoordinates * py){ return (px->x * py->x + px->y * py->y + px->z * py->z);}/* * The vector cross-product of two CartesianCoordinate vectors */voidcross_product(CartesianCoordinates * pucv, const CartesianCoordinates * pu, const CartesianCoordinates * pv){ double pu_x = pu->x; double pu_y = pu->y; double pu_z = pu->z; double pv_x = pv->x; double pv_y = pv->y; double pv_z = pv->z; pucv->x = (pu_y * pv_z - pu_z * pv_y); pucv->y = (pu_z * pv_x - pu_x * pv_z); pucv->z = (pu_x * pv_y - pu_y * pv_x);}voidprint_vec(const char msg[], const CartesianCoordinates * pv){ fprintf(stderr, "%s = (%f,%f,%f)\n", msg, pv->x, pv->y, pv->z);}/* * Rotate a vector by angle theta about the z-axis. * * The rotation matrix is * * cos(theta) -sin(theta) 0 * sin(theta) cos(theta) 0 * 0 0 1 * */voidrotate_z(const CartesianCoordinates * v_old, const double theta, CartesianCoordinates * v_new){ double cos_theta = cos(theta); double sin_theta = sin(theta); double old_x = v_old->x; double old_y = v_old->y; v_new->x = cos_theta * old_x - sin_theta * old_y; v_new->y = sin_theta * old_x + cos_theta * old_y; v_new->z = v_old->z;}/* * error_format * * prints a string using formatting to stderr * - a newline is automatically appended */voiderror_format(const char format[], const char msg[]){ fprintf(stderr, "SaVi: "); fprintf(stderr, format, msg); fprintf(stderr, "\n");}/* * error_and_exit * * prints an error msg and exits program with value 1 */voiderror_and_exit(const char msg[]){ error_format("%s", msg); error_format("%s", "Error! Exiting."); exit(1);}/* * error * * prints a string as an error message */voiderror(const char msg[]){ error_format("%s", msg);}voidmillisleep(const unsigned int ms){ struct timeval tv; tv.tv_usec = (ms % 1000) * 1000; tv.tv_sec = ms / 1000; select(0, NULL, NULL, NULL, &tv);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -