//====================================================================== void LOSManager::init(){ string shpFileName = "sdo_building.shp"; string dbfFileName = "sdo_building.dbf"; // ファイルを読み込んで建造物の形状データを作成 _readFiles(shpFileName, dbfFileName); // ルートとなる四分木 QuadTree* qt = new QuadTree(0,0); qt->set(_adfMinBounds[0], _adfMaxBounds[0], _adfMinBounds[1], _adfMaxBounds[1]); GeoManager::addTree(qt); // ポリゴンを四分木に登録 for (int i=0; i<_numPolygons; i++) { qt->pushQuadTree(GeoManager::polygon(i), i, 0, GeoManager::trees()); } }
//====================================================================== void LOSManager::calcVehicleLOS(vector<Vehicle*>* vehicles){ // これまでの車体用四分木を消去 GeoManager::deleteVTrees(); for (int i=0; i<MAX_VEHICLES*MAX_VEHICLES; i++) { _los[i] = 0; } QuadTree* vqt = new QuadTree(); vqt->set(_adfMinBounds[0], _adfMaxBounds[0], _adfMinBounds[1], _adfMaxBounds[1]); GeoManager::addVTree(vqt); vector<Vehicle*>::iterator itv; int id = 0; int numVehiclePolygons = 0; for (itv=vehicles->begin(); itv!=vehicles->end(); itv++) { int matesId = atoi((*itv)->id().c_str()); LOSVehicle* vehicle = GeoManager::vehicle(id); VehicleWall* vehicleBody = GeoManager::vehicleWall(id); _idMap.insert(map<int,int>::value_type(matesId, id)); vehicle->setAttribute(id, (*itv)->x(), (*itv)->y(), (*itv)->z(), (*itv)->bodyLength(), (*itv)->bodyWidth(), (*itv)->bodyHeight()); // 車体を直方体と見たときの8頂点 // 車体中心を原点とみなしたとき MyVector3D p,v1,v2,v3,v4,v5,v6,v7,v8; p.set((*itv)->x(), (*itv)->y(), (*itv)->z()); v1.set(-vehicle->length()*0.5, -vehicle->width()*0.5, 0); v2.set( vehicle->length()*0.5, -vehicle->width()*0.5, 0); v3.set( vehicle->length()*0.5, vehicle->width()*0.5, 0); v4.set(-vehicle->length()*0.5, vehicle->width()*0.5, 0); v5.set(-vehicle->length()*0.5, -vehicle->width()*0.5, vehicle->height()); v6.set( vehicle->length()*0.5, -vehicle->width()*0.5, vehicle->height()); v7.set( vehicle->length()*0.5, vehicle->width()*0.5, vehicle->height()); v8.set(-vehicle->length()*0.5, vehicle->width()*0.5, vehicle->height()); // 壁面の作成 vehicleBody->setPolygon(0,p+v1, p+v5, p+v2); vehicleBody->setPolygon(1,v2+p, v6+p, v5+p); vehicleBody->setPolygon(2,v2+p, v3+p, v6+p); vehicleBody->setPolygon(3,v3+p, v7+p, v6+p); vehicleBody->setPolygon(4,v3+p, v4+p, v7+p); vehicleBody->setPolygon(5,v4+p, v8+p, v7+p); vehicleBody->setPolygon(6,v4+p, v1+p, v8+p); vehicleBody->setPolygon(7,v1+p, v5+p, v8+p); vehicleBody->setPolygon(8,v5+p, v6+p, v7+p); vehicleBody->setPolygon(9,v5+p, v8+p, v7+p); for (int i=0; i<10; i++) { GeoManager::vehiclePolygon(numVehiclePolygons)->setTriangle (vehicleBody->wall(i).getVector(0), vehicleBody->wall(i).getVector(1), vehicleBody->wall(i).getVector(2)); vqt->pushQuadTree(GeoManager::vehiclePolygon(numVehiclePolygons), id*10+i, 0, GeoManager::vtrees()); numVehiclePolygons++; /* cout << "wall:" << i << endl; for (int j=0; j<3; j++) { cout << "vector:" << j << "-"; cout << vehicleBody->wall(i).getVector(j).getX() << "," << vehicleBody->wall(i).getVector(j).getY() << "," << vehicleBody->wall(i).getVector(j).getZ() << endl; } */ } id++; } _numVehicles = id; GeoManager::setNumVehicles(_numVehicles); GeoManager::setNumVehiclePolygons(numVehiclePolygons); //cout << "#vehicles = " << _numVehicles << endl; for (int t = 0; t<_numVehicles; t++) { for (int r=t+1; r<_numVehicles; r++) { LOSVehicle* vt = GeoManager::vehicle(t); LOSVehicle* vr = GeoManager::vehicle(r); #ifdef COLLISION_DEBUG cout << "TRANSMIT:" << vt->id() << " RECEIVE:" << vr->id() << endl; #endif //COLLISION_DEBUG // 線分の傾きとy切片求める double a,b; _calcStraightLine(vt, vr, &a, &b); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 建造物による遮蔽 // チェック用四分木を作成 ChkTree* cq = new ChkTree(); // ルートからノードの探索開始 GeoManager::root()->checkNode(vt->vec(), vr->vec(), 0, cq, a, b); // 衝突判定 int collisions = 0; double arrayT[_numWalls]; GeoManager::root()->countCollision(vt->vec(), vr->vec(), cq, &collisions, arrayT); delete cq; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 他車による遮蔽 ChkTree* vcq = new ChkTree(); vqt->checkNode(vt->vec(), vr->vec(), 0, vcq, a, b); vqt->countCollision(vt, vr, vcq, &collisions, arrayT); delete vcq; _los[t*MAX_VEHICLES + r] = collisions; _los[r*MAX_VEHICLES + t] = collisions; } } for (int t=0; t<_numVehicles; t++) { cout << "t=" << t << ":"; for (int r=0; r<_numVehicles; r++) { if (t==r) cout << " --"; else cout << " " << setw(2) << _los[t*MAX_VEHICLES+r]; } cout << endl; } }