Пример #1
0
/**
 * @brief Fills an array with the x,y coordinates for each Track segment.
 * @details This class method is intended to be called by the OpenMOC
 *          Python "plotter" module as a utility to assist in plotting
 *          segments. Although this method appears to require two arguments,
 *          in reality it only requires one due to SWIG and would be called
 *          from within Python as follows:
 *
 * @code
 *          num_segments = track_generator.getNumSegments()
 *          coords = track_generator.retrieveSegmentCoords(num_segments*5)
 * @endcode
 *
 * @param coords an array of coords of length 5 times the number of segments
 * @param num_segments the total number of Track segments
 */
void TrackGenerator::retrieveSegmentCoords(double* coords, int num_segments) {

  if (num_segments != 5*getNumSegments())
    log_printf(ERROR, "Unable to retrieve the Track segment coordinates since "
               "the TrackGenerator contains %d segments with %d coordinates "
               "but an array of length %d was input",
               getNumSegments(), 5*getNumSegments(), num_segments);

  segment* curr_segment = NULL;
  double x0, x1, y0, y1;
  double phi;
  segment* segments;

  int counter = 0;

  /* Loop over Track segments and populate array with their FSR ID and *
   * start/end points */
  for (int i=0; i < _num_azim; i++) {
    for (int j=0; j < _num_tracks[i]; j++) {

      x0 = _tracks[i][j].getStart()->getX();
      y0 = _tracks[i][j].getStart()->getY();
      phi = _tracks[i][j].getPhi();

      segments = _tracks[i][j].getSegments();

      for (int s=0; s < _tracks[i][j].getNumSegments(); s++) {
        curr_segment = &segments[s];

        coords[counter] = curr_segment->_region_id;

        coords[counter+1] = x0;
        coords[counter+2] = y0;

        x1 = x0 + cos(phi) * curr_segment->_length;
        y1 = y0 + sin(phi) * curr_segment->_length;

        coords[counter+3] = x1;
        coords[counter+4] = y1;

        x0 = x1;
        y0 = y1;

        counter += 5;
      }
    }
  }

    return;
}
Пример #2
0
SplineTimeBase::TimeStatus SplineTimeBase::seek(SplineIterator& it) const
{
	it.t = infinityMap(it.t);
	int numSegments = getNumSegments();
	//make sure we're always on a valid segment
	if(it.seg < 0)
		it.seg = 0;
	if(it.seg >= numSegments)
		it.seg = numSegments-1;
	while(it.t >= times[it.seg+1])
	{
		if(it.seg == numSegments-1)
			return After;
		it.seg++;
	}
	while(it.t < times[it.seg])
	{
		if(it.seg == 0)
			return Before;
		it.seg--;
	}

	assert(it.t >= times[it.seg] && it.t < times[it.seg+1]);
	return During;
}
MPI_Segment* MPI_ParticleStroke::allocateSegment( MPI_Point2D const &firstpoint, MPI_Point2D const &secondpoint )
{

    float newsegposstart = getNumSegments();
    float newsegposend = newsegposstart + 1.0;

    return new MPI_ParticleSegment( getWorkspace(), *this, firstpoint, secondpoint, getOneSpace(), newsegposstart, newsegposend, getTrainElementFactory() );

}
Пример #4
0
	VGint IPath::getParameteri( const VGint p ) const {
		switch (p) {
			case VG_PATH_FORMAT:
				return getFormat();
			case VG_PATH_DATATYPE:
				return getDataType();
			case VG_PATH_NUM_SEGMENTS:
				return getNumSegments();
			case VG_PATH_NUM_COORDS:
				return getNumCoords();
			default:
				IContext::instance().setError( VG_ILLEGAL_ARGUMENT_ERROR );
				return -1;	
				break;
		}
	}
Пример #5
0
void SplineCardinal<Point>::toHermite(SplineHermite<Point>& s) const
{
	//copy times
	s.copyTimeBase(*this);
	s.getPoint(0)=getPoint(0);
	int numSegments = getNumSegments();
	if(numSegments > 0) {
		s.getTangentOut(0)=(getPoint(1)-getPoint(0))*getTension(0);
		for(int i=1;i<numSegments;i++) {
			s.getPoint(i)=getPoint(i);
			s.getTangentIn(i)=s.getTangentOut(i)=(getPoint(i+1)-getPoint(i-1))*getTension(i);
		}
		s.getTangentIn(numSegments)=(getPoint(numSegments)-getPoint(numSegments-1))*getTension(numSegments);
	}
	s.getTangentIn(0) = Zero;
	s.getTangentOut(numSegments) = Zero;
}
Пример #6
0
//==============================================================================
std::size_t Spline::getNumWaypoints() const
{
  return getNumSegments() + 1;
}
Пример #7
0
void PolyBezierCurve::generateSamplePoints( const curvedef::MapEvaluators & evalMap,
											const int & rate )
{
	assert( !evalMap.empty() );

	mathdef::resize( m_samplePoints, rate * getNumSegments() + 1 );
	mathdef::setZero( m_samplePoints );
	
	// Evaluate the first point on the first curve, then
	// Loop through all segment to sample 1st sample to last sample.
	
	resetToFirstSegment();
	
	int samp_i = 0;		// Sample temp index
	int j;
	curvedef::Degree deg;
	VectorX2s segCtrlPts;
	while (m_iter != pointsEnd()) {
		deg = getSegmentDegree( m_currentSegment );
		const BezierEvaluator & evaluator = evalMap.find( deg )->second;
		
		assert( evaluator.isBasesComputed() );
		assert( deg > 0);
		
		segCtrlPts = m_controlPoints.block( m_iter.getCurrentRow(), 0, deg + 1, 2 );
		
		// Compute first end point if we are at first segment
		if (m_currentSegment == 0)
		{
			j = 0;
//			std::cout << "eval first t = " << computeParameterT(j, rate) << ": " << std::endl;
			setSamplePoint(samp_i, evaluator.eval(segCtrlPts, j));
//			std::cout << m_samplePoints.block(samp_i, 0, 1, 2) << std::endl;
			++samp_i;
		}
		
		j = 1;
		while (j <= rate)
		{
			// Sample segment point from index 1 to rate
//			std::cout << "eval t = " << computeParameterT(j, rate) << ": " << std::endl;
			setSamplePoint(samp_i, evaluator.eval(segCtrlPts, j));
//			std::cout << m_samplePoints.block(samp_i, 0, 1, 2) << std::endl;
			++samp_i;
			++j;
		}
		
		advanceSegment();
	}
	
//	
//	int segment = 0;	// Segment index
//	int samp_i = 0;		// Sample temp index
//	int ctrl_i = 0;		// Control point temp index
//	int j;
//	curvedef::Degree deg; int numPts;
//	VectorX2s segCtrlPts;
//	while (segment < getNumSegments())
//	{
//		deg = getSegmentDegree( segment );
//		const BezierEvaluator & evaluator = evalMap.find( deg )->second;
//		
//		assert( evaluator.isBasesComputed() );
//		assert( deg > 0);
//		
//		std::cout << "CONTROL POINTS:\n" << m_controlPoints << std::endl;
//		std::cout << "deg, ctrl_i, samp_i: " << deg << " " << ctrl_i << " " << samp_i << std::endl;
//		std::cout << m_controlPoints.block( ctrl_i, 0, deg + 1, 2) << std::endl;
//		
//		segCtrlPts = m_controlPoints.block( ctrl_i, 0, deg + 1, 2);
//		
//		// Compute first end point if we are at first segment
//		if (segment == 0)
//		{
//			j = 0;
//			std::cout << "eval first t = " << computeParameterT(j, rate) << ": " << std::endl;
//			setSamplePoint(samp_i, evaluator.eval(segCtrlPts, j));
//			std::cout << m_samplePoints.block(samp_i, 0, 1, 2) << std::endl;
//			++samp_i;
//		}
//		
//		j = 1;
//		while (j <= rate)
//		{
//			// Sample segment point from index 1 to rate
//			std::cout << "eval t = " << computeParameterT(j, rate) << ": " << std::endl;
//			setSamplePoint(samp_i, evaluator.eval(segCtrlPts, j));
//			std::cout << m_samplePoints.block(samp_i, 0, 1, 2) << std::endl;
//			++samp_i;
//			++j;
//		}
//		
//		ctrl_i += deg;
//		++segment;
//	}
	
}