/************************************************************************************ * Copyright (C) 2008 by Politehnica University of Bucharest and Rutgers University * All rights reserved. * Refer to LICENSE for terms and conditions of use. ***********************************************************************************/ package vnsim.vehicular.simulator; import vnsim.map.object.Globals; public class CalmPersonality implements Personality { private double coef1, coef2, coef3, coef4, coef5, coef6, coef7, coef8, coef9, coef10, coef11, coef12; public CalmPersonality() { coef1=0.0; coef2=1.0-Math.random()*2; coef3=0.1-Math.random()*0.2; coef4=5.0-Math.random()*10; coef5=0.1-Math.random()*0.2; coef6=1.0-Math.random()*2; coef7=1.0-Math.random()*2; coef8=1.0-Math.random()*2; coef9=5.0-Math.random()*10; coef10=0.1-Math.random()*0.2; coef11=0.5-Math.random(); coef12=0.5-Math.random(); } public double getSafetyDistance(double speed) { if(speed<10) return (0.18+coef1)*speed+(8.0+coef2); return (1.1/1.8)*speed+coef4; } public double getInfluenceDistance(double speed) { return (1.8+coef3)*speed+(50.0+coef4); } public double getDesiredDistance(double speed){ if(speed<10) { return 5.0; } return (0.5+coef5)*speed+(10.0+coef6); } public double getAccelerationFreeDriving() { return (6.0+coef7); } public double getAccelerationMaximumBrake() { return (-20.0+coef8); } public double getWantedSpeed(int roadIndex) { vnsim.map.object.Road r=Globals.map.roads.get(roadIndex); switch(r.getRoadinfo()[1]) { case 49: return 90+coef9; case 50: return 80+coef9; case 51: return 70+coef9; case 52: return 60+coef9; default: return 40+coef9; } } public double getLaneChangeSafetyDistance(double mySpeed, double folSpeed) { double dif=folSpeed-mySpeed; if(dif<0) return 4.0; if(dif<2 && mySpeed < 10) return 4.0; return dif*(0.6+coef10) + (10.0+coef11); } public double getLaneChangeSafetyDistanceInFront(double mySpeed, double precSpeed) { double dif=mySpeed-precSpeed; if(dif<0) return 4.0; if(dif<5) return 6.0; return dif*0.4+8.0; } public double getWantedSpeedInfluenced(double distanceFromIntersection, double requiredSpeed) { // params = [km] [km/h] ; ret = [km/h] //return requiredSpeed+distanceFromIntersection*1000/5.0; double distMeters=distanceFromIntersection*1000; if(distMeters>90) return 100; return requiredSpeed+(-1.0/90.0*distMeters*distMeters+19/9*distMeters); } public double getReactionTimeFreeDriving() { return (1.6+coef12); } public boolean estimateRoadChangePossible(double mySpeed, double otherSpeed, double myDist, double otherDist) { //params = [km/h] [km] if(otherSpeed<10) { if(otherDist > 0.03 && myDist < 0.03) return true; return false; } if(mySpeed>otherSpeed) { if(otherDist > 0.04 && myDist < 0.03) return true; } if(otherDist > 0.05 && myDist < 0.02) return true; return false; } }