Commit adea2157 authored by Jund Thomas's avatar Jund Thomas

ajout rendu path et test agents dans ville

parent 16f29ebc
......@@ -13,8 +13,11 @@ class Simulator ;
class Agent
{
public:
Agent(Simulator* sim, const VEC3& position, const VEC3& goals, Dart d) ;
Agent(Simulator* sim, const VEC3& position, const VEC3& goals) ;
void init(const VEC3& start, const VEC3& goal);
VEC3 getPosition() ;
void updateAgentNeighbors() ;
......
......@@ -51,6 +51,8 @@ public:
EnvMap() ;
void init(unsigned int config, REAL width, REAL height, REAL minSize, REAL maxSize) ;
void scale(float val);
void markPedWay() ;
unsigned int mapMemoryCost() ;
......
......@@ -46,7 +46,7 @@ static const float cosT[5] = { 1, 0.309017, -0.809017, -0.809017, 0.309017 } ;
static const float sinT[5] = { 0, 0.951057, 0.587785, -0.587785, -0.951057 } ;
inline void renderAgent(EnvMap& m, Agent* agent, bool showNeighborDist = false,
bool showObstacleDist = false, float c1=1.0f,float c2=0, float c3=0 )
bool showObstacleDist = false, bool renderPath = false, float c1=1.0f,float c2=0, float c3=0 )
{
#ifdef SPATIAL_HASHING
const VEC3& pos = agent->pos ;
......@@ -96,7 +96,7 @@ inline void renderAgent(EnvMap& m, Agent* agent, bool showNeighborDist = false,
// glPopMatrix();
//show goals
if (true)
if (renderPath)
{
glLineWidth(3.0f) ;
glBegin(GL_LINE_STRIP) ;
......
......@@ -40,13 +40,9 @@ std::vector<Dart> pathFindAStar(EnvMap& envMap, const typename PFP::TVEC3& posit
currentFace = (facesToTry.begin())->second ;
facesToTry.erase(facesToTry.begin()) ;
// Try to traverse adajacent faces of currentFace
Dart inCurrentFace = currentFace ;
do
Traversor2FFaE<typename PFP::MAP> tFFaE(map, currentFace);
for(Dart nextFace = tFFaE.begin() ; nextFace != tFFaE.end() ; nextFace = tFFaE.next())
{
Dart nextFace = map.alpha1(map.alpha1(inCurrentFace)) ;
while (nextFace != inCurrentFace)
{
if (!faceIsTraversed.isMarked(nextFace))
{
faceIsTraversed.mark(nextFace) ;
......@@ -60,10 +56,34 @@ std::vector<Dart> pathFindAStar(EnvMap& envMap, const typename PFP::TVEC3& posit
facesToTry.insert(std::make_pair(estimatedGlobalCost, nextFace)) ;
}
}
nextFace = map.alpha1(nextFace) ;
}
inCurrentFace = map.phi1(inCurrentFace) ;
} while (inCurrentFace != currentFace) ;
}
// // Try to traverse adjacent faces of currentFace
// Dart inCurrentFace = currentFace ;
// do
// {
// Dart nextFace = map.alpha1(map.alpha1(inCurrentFace)) ;
// while (nextFace != inCurrentFace)
// {
// if (!faceIsTraversed.isMarked(nextFace))
// {
// faceIsTraversed.mark(nextFace) ;
// if (!isObstacle.isMarked(nextFace))
// {
// float additionalCost = pathCost<PFP>(envMap, position, currentFace, nextFace) ;
// facePathCostToGoal[nextFace] = facePathCostToGoal[currentFace] + additionalCost ;
// faceNextFaceToGoal[nextFace] = currentFace ;
// float estimatedCostToGoal = pathCost<PFP>(envMap, position, nextFace, goal) ;
// float estimatedGlobalCost = facePathCostToGoal[nextFace] + estimatedCostToGoal ;
// facesToTry.insert(std::make_pair(estimatedGlobalCost, nextFace)) ;
// }
// }
// nextFace = map.alpha1(nextFace) ;
// }
// inCurrentFace = map.phi1(inCurrentFace) ;
// } while (inCurrentFace != currentFace) ;
} while (facesToTry.size() > 0 && !map.sameFace(start, currentFace)) ;
......@@ -80,7 +100,7 @@ std::vector<Dart> pathFindAStar(EnvMap& envMap, const typename PFP::TVEC3& posit
else
{
std::cout << "pathFindAStar: no path found !" << std::endl ;
exit(1) ;
// exit(1) ;
}
return path ;
}
......
......@@ -97,6 +97,7 @@ public:
void setupScenario(unsigned int nbMaxAgent) ;
void addAgent(const VEC3& start,const VEC3& goals);
void addAgent(const VEC3& start,const VEC3& goals, Dart d);
#ifndef SPATIAL_HASHING
void addPathToObstacle(MovingObstacle * mo, Dart dStart, Dart dGoal);
......
......@@ -105,6 +105,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="check_drawAgentsPath">
<property name="text">
<string>draw agents path</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="check_dart">
<property name="text">
......
......@@ -99,6 +99,7 @@ public:
bool drawAgentsNeighborDist ;
bool drawAgentsObstacleDist ;
bool drawAgentsPredictionTri ;
bool drawAgentsPath ;
bool drawObstPredictionTri ;
bool draw_dart;
unsigned int dartSlider;
......@@ -155,6 +156,11 @@ public slots:
drawAgentsObstacleDist = b ;
updateGL() ;
}
void slot_drawAgentsPath(bool b)
{
drawAgentsPath= b ;
updateGL() ;
}
void slot_drawMovingObstacles(bool b)
{
drawMovingObstacles = b ;
......
......@@ -13,6 +13,23 @@ float Agent::rangeSq_ = range_ * range_ ;
unsigned int Agent::cptAgent = 0 ;
Agent::Agent(Simulator* sim, const VEC3& start, const VEC3& goal, Dart d) :
#ifdef SPATIAL_HASHING
pos(position),
#else
part_(sim->envMap_.map, d, start, sim->envMap_.position),
#endif
curGoal_(0),
velocity_(0),
newVelocity_(0),
prefVelocity_(0),
meanDirection_(0),
sim_(sim),
alive(true)
{
init(start,goal);
}
Agent::Agent(Simulator* sim, const VEC3& start, const VEC3& goal) :
#ifdef SPATIAL_HASHING
pos(position),
......@@ -26,6 +43,11 @@ Agent::Agent(Simulator* sim, const VEC3& start, const VEC3& goal) :
meanDirection_(0),
sim_(sim),
alive(true)
{
init(start,goal);
}
void Agent::init(const VEC3& start, const VEC3& goal)
{
#ifdef SPATIAL_HASHING
sim->envMap_.addAgentInGrid(this) ;
......
......@@ -105,8 +105,8 @@ void EnvMap::init(unsigned int config, REAL width, REAL height, REAL minSize, RE
bb1.addPoint(bb2.min());
bb1.addPoint(bb2.max());
CityGenerator::planetify<PFP>(map, position, 100.0f, bb1);
CityGenerator::planetify<PFP>(mapScenary, positionScenary, 100.0f, bb1);
// CityGenerator::planetify<PFP>(map, position, 100.0f, bb1);
// CityGenerator::planetify<PFP>(mapScenary, positionScenary, 100.0f, bb1);
std::vector<Dart> v;
TraversorF<PFP::MAP> tF(mapScenary);
......@@ -174,13 +174,15 @@ void EnvMap::init(unsigned int config, REAL width, REAL height, REAL minSize, RE
Algo::Modelisation::EarTriangulation<PFP> et(mapScenary);
et.triangule();
Algo::Modelisation::EarTriangulation<PFP> et2(map);
et2.triangule();
// Algo::Modelisation::EarTriangulation<PFP> et2(map);
// et2.triangule();
//subdivision to create footpath
// SelectorDartNoBoundary<PFP::MAP> nb(map);
// Algo::Modelisation::TwoNPlusOneSubdivision<PFP,PFP::TVEC3, VEC3>(map,position,nb);
// markPedWay();
SelectorDartNoBoundary<PFP::MAP> nb(map);
Algo::Modelisation::TwoNPlusOneSubdivision<PFP,PFP::TVEC3, VEC3>(map,position,nb);
markPedWay();
scale(5.0f);
}
break;
}
......@@ -202,6 +204,18 @@ void EnvMap::init(unsigned int config, REAL width, REAL height, REAL minSize, RE
}
void EnvMap::scale(float val)
{
TraversorV<PFP::MAP> tV(map);
for(Dart d = tV.begin() ; d != tV.end() ; d = tV.next())
position[d] *= val;
TraversorV<PFP::MAP> tV2(mapScenary);
for(Dart d = tV2.begin() ; d != tV2.end() ; d = tV2.next())
positionScenary[d] *= val;
}
void EnvMap::markPedWay()
{
CellMarker<FACE> treat(map) ;
......@@ -365,7 +379,7 @@ Dart EnvMap::getBelongingCell(const PFP::VEC3& pos)
}
}
std::cout << "ERROR : pos not in map for getBelongingCell" << std::endl ;
std::cout << "ERROR : pos not in map for getBelongingCell " << pos << std::endl ;
return map.begin() ;
}
#endif
......
......@@ -14,7 +14,7 @@ Simulator::Simulator(unsigned int config, unsigned int minS) :
nb_dead(0)
{
minSize=minS;
multires=true;
multires=false;
detect_agent_collision=false;
srand(10) ;
nbStepsPerUnit_ = 1 / timeStep_ ;
......@@ -57,7 +57,9 @@ void Simulator::init(unsigned int config, float dimension, bool enablePathFindin
// importAgents("myAgents.pos") ;
// break ;
case 5:
envMap_.init(config, 1600.0f, 1200.0f, minSize, 400.0f) ; //cases fines
envMap_.init(config, 1600.0f, 1200.0f, minSize, 400.0f) ; //svg import
setupScenario(10000) ;
addPathsToAgents();
break;
default:
std::cout << "Unknown scenario !" << std::endl ;
......@@ -193,6 +195,11 @@ void Simulator::addAgent(const VEC3& start, const VEC3& goal)
agents_.push_back(new Agent(this, start, goal)) ;
}
void Simulator::addAgent(const VEC3& start, const VEC3& goal, Dart d)
{
agents_.push_back(new Agent(this, start, goal, d)) ;
}
void Simulator::setupCircleScenario(unsigned int nbAgents , unsigned int nbObstacles)
{
std::cout << " - Setup Circle Scenario : " << nbAgents << " agents" << std::endl ;
......@@ -368,20 +375,20 @@ void Simulator::setupCorridorScenario(unsigned int nbAgents, unsigned int nbObst
mo4= new MovingObstacle(this, i,vPos,goals,false);
//for generating a random path
unsigned int dartDistForPath = 50 ;
mo4->goals_.clear() ;
Dart dStart = mo4->registering_part->d;
Dart dStop = dStart ;
for (unsigned int j = 0 ; envMap_.buildingMark.isMarked(dStop) || j < dartDistForPath + rand() * 20 || envMap_.map.sameFace(dStop, dStart) ; ++j)
{
envMap_.map.next(dStop) ;
if (dStop == envMap_.map.end())
dStop = envMap_.map.begin() ;
}
addPathToObstacle(mo4, dStart, dStop);
addPathToObstacle(mo4, dStop, dStart);
// //for generating a random path
// unsigned int dartDistForPath = 50 ;
// mo4->goals_.clear() ;
// Dart dStart = mo4->registering_part->d;
// Dart dStop = dStart ;
// for (unsigned int j = 0 ; envMap_.buildingMark.isMarked(dStop) || j < dartDistForPath + rand() * 20 || envMap_.map.sameFace(dStop, dStart) ; ++j)
// {
// envMap_.map.next(dStop) ;
// if (dStop == envMap_.map.end())
// dStop = envMap_.map.begin() ;
// }
//
// addPathToObstacle(mo4, dStart, dStop);
// addPathToObstacle(mo4, dStop, dStart);
movingObstacles_.push_back(mo4);
}
......@@ -511,11 +518,11 @@ void Simulator::setupScenario(unsigned int nbMaxAgent)
* Add agents, specifying their start position, and store their goal on the
* opposite side of the environment.
*/
Dart d = envMap_.map.begin() ;
CellMarker<FACE> filled(envMap_.map) ;
TraversorF<PFP::MAP> tF(envMap_.map);
Dart d = tF.begin() ;
unsigned int nbx = 5 ;
unsigned int nby = 5 ;
unsigned int nbx = 1 ;
unsigned int nby = 1 ;
unsigned int bMax = nbx * nby > 0 ? nbMaxAgent / (nbx * nby) : nbMaxAgent ;
......@@ -524,23 +531,23 @@ void Simulator::setupScenario(unsigned int nbMaxAgent)
bool found = false ;
VEC3 pos ;
Dart dCell ;
while (!found && d != envMap_.map.end())
while (!found && d != tF.end())
{
if (!filled.isMarked(d)
&& !envMap_.buildingMark.isMarked(d) /*&& envMap_.pedWayMark.isMarked(d)*/)
if (!envMap_.buildingMark.isMarked(d)
// && envMap_.pedWayMark.isMarked(d)
)
{
filled.mark(d) ;
pos = Algo::Geometry::faceCentroid<PFP>(envMap_.map, d, envMap_.position) ;
pos[2] = 0 ;
dCell = d ;
found = true ;
}
envMap_.map.next(d) ;
d = tF.next() ;
}
if (found)
{
float ecart = 3.0f ;
float ecart = 0.0f ;
VEC3 posinit = VEC3(pos[0] - (float(nbx) / 2.0f * ecart),
pos[1] - (float(nby) / 2.0f * ecart), pos[2]) ;
for (unsigned int curx = 0 ; curx < nbx ; ++curx)
......@@ -548,7 +555,7 @@ void Simulator::setupScenario(unsigned int nbMaxAgent)
for (unsigned int cury = 0 ; cury < nby ; ++cury)
{
VEC3 posagent = posinit + VEC3(ecart * curx, ecart * cury, 0.0f) ;
addAgent(posagent, -1.0f * posagent) ;
addAgent(posagent, -1.0f * posagent, dCell) ;
}
}
}
......@@ -611,9 +618,13 @@ void Simulator::addPathsToAgents()
Dart dStart = agents_[i]->part_.d ;
Dart dStop = dStart ;
for (unsigned int j = 0 ; /*!envMap_.pedWayMark.isMarked(dStop) ||*/
envMap_.buildingMark.isMarked(dStop) || j < dartDistForPath + rand() * 20
|| envMap_.map.sameFace(dStop, dStart) ; ++j)
for (unsigned int j = 0 ;
/*!envMap_.pedWayMark.isMarked(dStop) || */
envMap_.buildingMark.isMarked(dStop)
|| j < dartDistForPath + rand() * 20
|| envMap_.map.sameFace(dStop, dStart)
|| envMap_.obstacleMark.isMarked(dStop)
; ++j)
{
envMap_.map.next(dStop) ;
if (dStop == envMap_.map.end()) dStop = envMap_.map.begin() ;
......@@ -638,9 +649,12 @@ void Simulator::addPathsToAgents()
Dart dStop2 = dStop ;
for (unsigned int j = 0 ; /*!envMap_.pedWayMark.isMarked(dStop) ||*/
envMap_.buildingMark.isMarked(dStop2) || j < dartDistForPath + rand() * 20
|| envMap_.map.sameFace(dStop, dStop2) || envMap_.map.sameFace(dStop2, dStart) ;
++j)
envMap_.buildingMark.isMarked(dStop2)
|| j < dartDistForPath + rand() * 20
|| envMap_.map.sameFace(dStop, dStop2)
|| envMap_.map.sameFace(dStop2, dStart)
|| envMap_.obstacleMark.isMarked(dStop)
; ++j)
{
envMap_.map.next(dStop2) ;
if (dStop2 == envMap_.map.end()) dStop2 = envMap_.map.begin() ;
......
......@@ -41,6 +41,7 @@ SocialAgents::SocialAgents(unsigned int config, unsigned int minSize, unsigned i
drawAgents(true),
drawAgentsNeighborDist(false),
drawAgentsObstacleDist(false),
drawAgentsPath(false),
drawAgentsPredictionTri(false),
drawObstPredictionTri(false),
draw_dart(false)
......@@ -74,6 +75,7 @@ void SocialAgents::initGUI()
setCallBack(dock.check_drawObstPredictionTri, SIGNAL(toggled(bool)), SLOT(slot_drawObstPredictionTri(bool))) ;
setCallBack(dock.check_drawAgentsNeighborDist, SIGNAL(toggled(bool)), SLOT(slot_drawAgentsNeighborDist(bool))) ;
setCallBack(dock.check_drawAgentsObstacleDist, SIGNAL(toggled(bool)), SLOT(slot_drawAgentsObstacleDist(bool))) ;
setCallBack(dock.check_drawAgentsPath, SIGNAL(toggled(bool)), SLOT(slot_drawAgentsPath(bool))) ;
setCallBack(dock.check_dart, SIGNAL(toggled(bool)), SLOT(slot_dart(bool))) ;
setCallBack(dock.check_slide, SIGNAL(valueChanged(int)), SLOT(slot_slide(int))) ;
}
......@@ -111,6 +113,11 @@ void SocialAgents::cb_redraw()
glVertex3f(0.0f, 0.0f, 1.0f) ;
glEnd() ;
// glPointSize(10.0f) ;
// glBegin(GL_POINTS);
// glVertex3f(1377.86975, 2158.54761, 0);
// glEnd();
//#ifdef SPATIAL_HASHING
// glPointSize(1.0f) ;
// glBegin(GL_POINTS) ;
......@@ -146,7 +153,7 @@ void SocialAgents::cb_redraw()
for (std::vector<Agent*>::iterator it = simulator.agents_.begin() ; it != simulator.agents_.end() ; ++it)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) ;
renderAgent(simulator.envMap_, *it, drawAgentsNeighborDist, drawAgentsObstacleDist,
renderAgent(simulator.envMap_, *it, drawAgentsNeighborDist, drawAgentsObstacleDist, drawAgentsPath,
(*it)->color1, (*it)->color2, (*it)->color3) ;
}
......@@ -400,13 +407,12 @@ void SocialAgents::cb_redraw()
if (drawObstacles)
{
DartMarker dmo(simulator.envMap_.map) ;
for (Dart d = simulator.envMap_.map.begin() ; d != simulator.envMap_.map.end() ; simulator.envMap_.map.next(d))
glColor3f(0.0f, 0.0f, 1.0f) ;
glLineWidth(3.0f) ;
TraversorE<PFP::MAP> tE(simulator.envMap_.map);
for (Dart d = tE.begin() ; d != tE.end() ; d = tE.next())
{
if (!dmo.isMarked(d))
{
glColor3f(0.0f, 0.0f, 1.0f) ;
glLineWidth(3.0f) ;
///show buildings
// if(simulator.envMap_.buildingMark.isMarked(d))
......@@ -414,8 +420,6 @@ void SocialAgents::cb_redraw()
// renderFace(simulator.envMap_,d);
// }
dmo.mark(d);
// if ((simulator.envMap_.obstvect[d].size()) != 0)
// {
// renderFace(simulator.envMap_, d) ;
......@@ -426,11 +430,10 @@ void SocialAgents::cb_redraw()
// renderDart(simulator.envMap_,d);
// }
if(simulator.envMap_.map.isBoundaryMarked(d))
if(simulator.envMap_.map.isBoundaryEdge(d))
{
renderDart(simulator.envMap_,d);
}
}
}
#ifdef SPATIAL_HASHING
......@@ -1299,7 +1302,8 @@ int main(int argc, char** argv)
sa.setGeometry(0, 0, 1800, 1200) ;
sa.initGUI() ;
sa.show() ;
if (argc > 1) sa.timer->start() ;
// if (argc > 1)
// sa.timer->start() ;
return app.exec() ;
}
......@@ -24,9 +24,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="263.3871"
inkscape:cy="369.89214"
inkscape:zoom="0.98994949"
inkscape:cx="347.26586"
inkscape:cy="440.50496"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
......@@ -37,9 +37,10 @@
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="false"
inkscape:snap-smooth-nodes="true"
inkscape:snap-global="true"
inkscape:object-paths="false" />
inkscape:object-paths="false"
inkscape:snap-nodes="true" />
<metadata
id="metadata7">
<rdf:RDF>
......@@ -58,38 +59,73 @@
id="layer1"
transform="translate(0,-252.36218)">
<path
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 0,721.42857 58.159369,3.8453 88.090631,28.83327 291.18662,-3.73465 229.70624,-214.65821"
id="path2987"
style="font-size:237.0789032px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
inkscape:connector-curvature="0"
id="path3787"
d="m 511.15466,576.29392 c -1.75375,6.06423 3.79438,23.5902 -3.30466,21.26393 -23.34686,-10.51632 -54.13876,-18.12053 -76.55429,-1.71833 -20.05484,18.81916 0.62619,47.66069 25.10391,45.85946 24.96731,4.38548 56.29803,10.97474 63.41533,39.46376 7.1547,24.08114 -4.65369,53.44973 -29.94595,60.58285 -29.17776,9.59034 -61.05515,4.55171 -89.26627,-5.93276 0,-8.02611 0,-16.05222 0,-24.07833 25.89443,14.41973 61.95585,24.99945 88.21361,6.1462 15.85838,-14.29352 8.17178,-43.79977 -13.16968,-47.86539 -24.64461,-7.71877 -56.74618,-6.41676 -71.17136,-31.85239 -13.21201,-25.9817 1.83654,-61.05607 30.76893,-67.36753 24.93234,-6.77973 51.77771,-2.34673 75.91043,5.49853 z" />
<path
style="font-size:237.0789032px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
d="m 290.0625,318.25 -66,172.84375 24.65625,0 15.75,-44.34375 77.90625,0 15.75,44.34375 24.3125,0 -24.375,-63.9375 -23.03125,0 0.0625,0.15625 -63.5625,0 31.71875,-86.03125 30.34375,81.9375 22.96875,0 -40,-104.96875 z m 66.5,104.96875 z m -22.96875,0 z"
transform="translate(0,252.36218)"
sodipodi:nodetypes="ccccc" />
id="path3785"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccc" />
<path
style="font-size:237.0789032px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
inkscape:connector-curvature="0"
id="path3006"
d="m 209.13371,583.93415 c 0,8.21905 0,16.43809 0,24.65714 -26.38173,-26.91119 -79.20276,-32.12164 -102.66571,1.06359 -16.010472,26.53962 -15.8604,61.95664 -3.19791,89.7945 17.98936,34.64408 68.37746,35.27802 96.77989,13.73216 13.07902,-16.38983 8.23311,4.14784 9.08373,13.48966 -9.72446,15.85327 -36.43754,19.253 -54.98656,20.13894 -37.31121,2.3626 -74.104688,-23.59676 -81.215523,-60.88854 -9.838223,-40.37755 0.824384,-92.58984 42.341423,-110.80688 29.98392,-12.71956 66.86597,-9.665 93.86066,8.81943 z" />
<path
sodipodi:nodetypes="cccccccccccccccccccc"
inkscape:connector-curvature="0"
id="path3801"
d="m 607.2457,570.62684 -66,172.84375 24.65625,0 15.75,-44.34375 77.90625,0 15.75,44.34375 24.3125,0 -24.375,-63.9375 -23.03125,0 0.0625,0.15625 -63.5625,0 31.71875,-86.03125 30.34375,81.9375 22.96875,0 -40,-104.96875 z m 66.5,104.96875 z m -22.96875,0 z"
style="font-size:237.0789032px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" />
<path
style="fill:none;stroke:#999999;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 713.16769,341.21479 c -75.17195,1.9518 -131.04865,15.54866 -173.97858,37.86195 -31.82908,16.54351 -56.54129,37.87847 -76.724,62.81129 -25.18431,31.11158 -43.316,67.82518 -59.42211,107.82179 -9.15657,22.73867 -17.65846,46.53845 -26.42937,70.9732 -8.35781,23.2839 -5.91959,48.33338 1.37645,74.03035 9.20967,32.43685 26.15958,65.90538 38.90637,98.15681 8.97219,22.70107 15.86196,44.79914 16.50429,65.50998 0.54432,17.55065 -3.39772,34.10512 -14.3607,49.18618 -11.04733,15.19709 -26.00682,27.96978 -43.46159,38.39791 -24.55323,14.66901 -54.04397,24.69877 -84.52836,30.31152 -37.68802,6.93909 -76.89479,7.12701 -110.16791,0.98376 -21.86664,-4.03725 -41.17056,-10.80889 -55.79653,-20.19571 C 57.405441,913.62725 57.405433,913.62726 57.405433,913.62726"
id="path3803"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cssssssssssssc" />
<path
style="color:#000000;fill:none;stroke:#000000;stroke-width:40;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 58.159369,725.27387 30.794724,-45.986 291.651787,-8.85539 -2.71457,-269.60141 1.5856,-197.34046 L 700,264.28571"
id="path2989"
style="color:#000000;fill:none;stroke:#999999;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 505.07627,148.45161 c 0,0 -48.44688,5.2578 -99.31321,20.12425 -32.55667,9.51518 -66.10449,22.9666 -88.57516,41.49505 -57.5787,47.47717 -66.67007,75.76144 -80.8122,129.29953 -14.14214,53.53808 -27.27413,209.10158 -28.28428,236.3757 -0.56426,15.23502 27.55372,34.5675 57.59261,50.77893 23.73749,12.81068 48.67451,23.67241 61.6054,29.02312 32.50852,13.4518 48.28902,38.05388 48.28902,38.05388"
id="path3805"
inkscape:connector-curvature="0"
transform="translate(0,252.36218)"
sodipodi:nodetypes="cccccc" />
sodipodi:nodetypes="cssssssc" />
<path
style="fill:none;stroke:#000000;stroke-width:40;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 0,402.63304 90.620126,-0.99867 287.271184,-0.8033 c 80.24707,-0.38299 337.63234,57.75207 337.63234,57.75207 L 800,396.23893 637.14286,348.81651"
id="path3780"
style="fill:none;stroke:#999999;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 208.09142,575.74614 416.89645,540.508"
id="path3824"
inkscape:connector-curvature="0"
transform="translate(0,252.36218)"
sodipodi:nodetypes="cccccc" />
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 88.954093,679.28787 0,491.86667 0,402.63304 0,301.57911 379.47691,203.49061"
id="path3779"
style="color:#000000;fill:none;stroke:#999999;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 713.16769,88.85261 c 0,56.8604 -0.96802,108.55955 -1.01015,155.56349 -0.44064,491.60179 -2.0203,469.72093 -2.0203,469.72093 L 375.57845,693.60207"
id="path3843"
inkscape:connector-curvature="0"
transform="translate(0,252.36218)"
sodipodi:nodetypes="ccccc" />
sodipodi:nodetypes="cscc" />
<path
style="fill:none;stroke:#999999;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 505.07627,148.45161 61.61931,164.65486 -50.50763,201.02036 -99.2915,26.38117"
id="path3851"
inkscape:connector-curvature="0"
transform="translate(0,252.36218)" />
<path
style="fill:none;stroke:#000000;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 140,465.71429 97.85714,97.85714"
id="path3781"
style="fill:none;stroke:#999999;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 566.69558,313.10647 712.15754,244.4161"
id="path3859"
inkscape:connector-curvature="0"
transform="translate(0,252.36218)" />
<path
style="color:#000000;fill:none;stroke:#999999;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="M 317.1879,210.07091 74.751288,181.78664 32.324881,430.28417 57.405433,661.26508"
id="path3867"
inkscape:connector-curvature="0"
transform="translate(0,252.36218)"
sodipodi:nodetypes="cccc" />
</g>
</svg>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment