/*************************************************************************** file : robottools.h created : Mon Feb 28 22:31:13 CET 2000 copyright : (C) 2000 by Eric Espie email : torcs@free.fr version : $Id: robottools.h,v 1.6 2003/11/23 20:21:11 torcs Exp $ ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ /** @file Robots Tools @author Eric Espie @version $Id: robottools.h,v 1.6 2003/11/23 20:21:11 torcs Exp $ */ #ifndef _ROBOTTOOLS_H_ #define _ROBOTTOOLS_H_ #include #include #define RELAXATION2(target, prev, rate) \ do { \ tdble __tmp__; \ __tmp__ = target; \ target = (prev) + (rate) * ((target) - (prev)) * 0.01; \ prev = __tmp__; \ } while (0) #define RELAXATION(target, prev, rate) \ do { \ target = (prev) + (rate) * ((target) - (prev)) * 0.01; \ prev = (target); \ } while (0) /* * Track Utilities */ /* for variable width segments */ extern tdble RtTrackGetWidth(tTrackSeg *seg, tdble toStart); /* * Convert a Local position (segment, toRight, toStart) * into a Global one (X, Y) * * The ToStart position refers to the current segment, * the function will not search for next segment if toStart * is greater than the segment length. * toStart represent an angle in radian for curves * and a length in meters for straights. * */ extern void RtTrackLocal2Global(tTrkLocPos *p, tdble *X, tdble *Y, int flag); /* * Convert a Global (segment, X, Y) position into a Local one (segment, toRight, toStart) * * The segment in the Global position is used to start the search of a good segment * in term of toStart value. * The segments are scanned in order to find a toStart value between 0 and the length * of the segment for straights or the arc of the curve. * * The sides parameters is to indicate wether to use the track sides (1) or not (0) in * the toRight computation. */ extern void RtTrackGlobal2Local(tTrackSeg *segment, tdble X, tdble Y, tTrkLocPos *p, int type); /* * Returns the absolute height in meters of the road * at the Local position p. * * If the point lies outside the track (and sides) * the height is computed using the tangent to the banking * of the segment (or side). + Point given .^ . | . | . | / | heigth / | ______/ v ^ ^^ ^ | || | track side */ extern tdble RtTrackHeightL(tTrkLocPos *p); /* * Returns the absolute height in meters of the road * at the Global position (segment, X, Y) */ extern tdble RtTrackHeightG(tTrackSeg *seg, tdble X, tdble Y); /* * Give the normal vector of the border of the track * including the sides. * * The side parameter is used to indicate the right (TR_RGT) * of the left (TR_LFT) side to consider. * * The Global position given (segment, X, Y) is used * to project the point on the border, it is not necessary * to give a point directly on the border itself. * * The vector is normalized. */ extern void RtTrackSideNormalG(tTrackSeg *seg, tdble X, tdble Y, int side, t3Dd *norm); /* * Used to get the tangent angle for a track position * The angle is given in radian. * * the angle 0 is parallel to the first segment start. */ extern tdble RtTrackSideTgAngleL(tTrkLocPos *p); /* * Used to get the normal vector of the road itself (pointing * upward). * * Local coordinates are used to locate the point where to * get the road normal vector. * * The vector is normalized. */ extern void RtTrackSurfaceNormalL(tTrkLocPos *p, t3Dd *norm); extern int RtDistToPit(struct CarElt *car, tTrack *track, tdble *dL, tdble *dW); extern tdble RtGetDistFromStart(tCarElt *car); extern tdble RtGetDistFromStart2(tTrkLocPos *p); /**************** * Telemetry * ****************/ /** Initialization of a telemetry session. @param ymin Minimum value for Y. @param ymax Maximum value for Y. @return None */ extern void RtTelemInit(tdble ymin, tdble ymax); /** Get the current segment */ tTrackSeg *RtTrackGetSeg(tTrkLocPos *p); /** Create a new telemetry channel. @param name Name of the channel. @param var Address of the variable to monitor. @param min Minimum value of this variable. @param max Maximum value of this variable. @return None */ extern void RtTelemNewChannel(const char * name, tdble * var, tdble min, tdble max); extern void RtTelemStartMonitoring(const char * filename); extern void RtTelemStopMonitoring(void); extern void RtTelemUpdate(double time); extern void RtTelemShutdown(void); #endif /* _ROBOTTOOLS_H_ */