📄 point.cc
字号:
/* $Id: point.cc,v 1.5 2006-08-21 15:02:00 jonathan Exp $ * Jonathan Ledlie, Harvard University. * Copyright 2006. All rights reserved. */#include "sim.h"#include "point.h"int DIMENSIONS = 5;bool USE_HEIGHT = false;// Do not set to be larger than 1 (see checkHeight())const double MIN_HEIGHT = 0.01;const double INITIAL_VECTOR_VALUE = 0.;Point::Point (int s) { stamp = s;}Point::Point () { v = new double[DIMENSIONS]; for (int i = 0; i < DIMENSIONS; i++) { v[i] = INITIAL_VECTOR_VALUE; } stamp = 0; height = INITIAL_VECTOR_VALUE;}Point* Point::getRandomPoint (double sideLength) { double vec[DIMENSIONS]; for (int d = 0; d < DIMENSIONS; d++) { double s = Rand() * sideLength; if (Rand() > .5) s *= -1.; vec[d] = s; } double height = 0.; if (USE_HEIGHT) { height = randPct(); } return new Point (vec, height);}Point::Point (const double *vec, double h) { v = new double[DIMENSIONS]; for (int i = 0; i < DIMENSIONS; i++) { v[i] = vec[i]; } stamp = 0; height = h;}void Point::clear () { for (int i = 0; i < DIMENSIONS; i++) { v[i] = INITIAL_VECTOR_VALUE; } stamp = 0; height = INITIAL_VECTOR_VALUE;}Point::Point (const Point *vec) { v = new double[DIMENSIONS]; for (int i = 0; i < DIMENSIONS; i++) { v[i] = vec->v[i]; } stamp = vec->stamp; height = vec->height;}Point::~Point () { delete [] v;}bool Point::operator<(const Point *rhs) const { return stamp < rhs->stamp;}Point* Point::getDirection (const Point *p) { double coordDistance = getEuclideanDistance(p); if (coordDistance == 0) return NULL; Point* unitVector = new Point(); for (int i = 0; i < DIMENSIONS; i++) { unitVector->v[i] = (p->v[i] - v[i]) / coordDistance; } unitVector->height = (height + p->height) / coordDistance; return unitVector;}double Point::getEuclideanDistance (const Point *b) { return getPlanarDistance(b) + height + b->height;}double Point::getAbsoluteDistance (const Point *b) { return getPlanarDistance(b) + fabs(height - b->height);}double Point::getPlanarDistance (const Point *b) { double sum = 0.; for (int i = 0; i < DIMENSIONS; i++) { sum += pow (v[i]-b->v[i],2.); } if (sum == 0.) return 0.; double dist = sqrt (sum); if (isnan(dist)) { cout << "sum " << sum << this << endl; } assert (!isnan(dist)); return dist;}double Point::length () { double sum = 0; for (int i = 0; i < DIMENSIONS; i++) { sum += pow (v[i],2.); } return sqrt (sum) + height;}void Point::bump () { for (int i = 0; i < DIMENSIONS; i++) { v[i] = randPct(); } if (USE_HEIGHT) height = randPct();}void Point::assign (const Point *vec) { for (int i = 0; i < DIMENSIONS; i++) { v[i] = vec->v[i]; } stamp = vec->stamp; height = vec->height;}bool Point::isInInitialState () { for (int i = 0; i < DIMENSIONS; i++) { if (v[i] != INITIAL_VECTOR_VALUE) return false; } if (height != INITIAL_VECTOR_VALUE) return false; return true;}void Point::scale (double s) { for (int i = 0; i < DIMENSIONS; i++) { v[i] = v[i] * s; } height *= s;}void Point::add (const Point *adjustment) { for (int i = 0; i < DIMENSIONS; i++) { v[i] = v[i] + adjustment->v[i]; } height += adjustment->height;}void Point::checkHeight () { while (USE_HEIGHT && height < MIN_HEIGHT) { height = randPct(); }}Point* Point::getRandomUnitVector () { Point* unitVector = new Point(); double length = 0.; for (int i = 0; i < DIMENSIONS; i++) { unitVector->v[i] = random(); length += unitVector->v[i] * unitVector->v[i]; } length = sqrt(length); for (int i = 0; i < DIMENSIONS; i++) { unitVector->v[i] /= length; } unitVector->height = 0; if (USE_HEIGHT) { unitVector->height = randPct(); } return unitVector;}ostream& operator << (ostream& os, Point *p) { os << "["; for (int i = 0; i < DIMENSIONS; i++) { os << p->v[i]; if (i < DIMENSIONS-1) os << " "; } if (USE_HEIGHT) os << " h " << p->height; os << "]"; return os;}void Point::print (FILE *fp) { for (int i = 0; i < DIMENSIONS; i++) { fprintf (fp, "%5.3f", v[i]); if (i < DIMENSIONS-1) fprintf (fp," "); } if (USE_HEIGHT) fprintf (fp," h %f", height);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -