Example #1
0
	void CGameMap::ShowFog(){
		CRect mapRect(0,0,sizeX-1,sizeY-1);
		CPoint gridPoint(CConvert::GetGridPointByScreenPoint(CPoint(-64*6,-32*6)));
		//gridPoint = CConvert::GetGridPointByScreenPoint(CPoint(-64*6,-32*6));
		for(int y=0;y<SIZE_Y/32+17;y++){//17為最佳化的值
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x+=1;
				gridPoint.y-=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint)){
					if(mapTile[gridPoint.y][gridPoint.x].VisionCount()==0 && mapTile[gridPoint.y][gridPoint.x].IsExplored()){
						fog.SetTopLeft(screenPoint.x-fog.Width()/2,screenPoint.y);
						fog.ShowBitmap();
					}
				}
			}
			gridPoint.x+=1;
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x-=1;
				gridPoint.y+=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint)){
					if(mapTile[gridPoint.y][gridPoint.x].VisionCount()==0 && mapTile[gridPoint.y][gridPoint.x].IsExplored()){
						fog.SetTopLeft(screenPoint.x-fog.Width()/2,screenPoint.y);
						fog.ShowBitmap();
					}
				}
			}
			gridPoint.y+=1;
		}
	}
OpticalFlowTransitionModel::OpticalFlowTransitionModel(
		shared_ptr<TransitionModel> fallback, double scatter, Size gridSize, bool circle, Size windowSize, int maxLevel) :
				fallback(fallback),
				templatePoints(),
				gridSize(gridSize),
				windowSize(windowSize),
				maxLevel(maxLevel),
				previousPyramid(),
				currentPyramid(),
				points(),
				forwardPoints(),
				backwardPoints(),
				forwardStatus(),
				backwardStatus(),
				error(),
				squaredDistances(),
				correctFlowCount(0),
				scatter(scatter),
				generator(boost::mt19937(time(0)), boost::normal_distribution<>()) {
	float gridY = 1 / static_cast<float>(gridSize.height);
	float gridX = 1 / static_cast<float>(gridSize.width);
	Point2f gridPoint(-0.5f + 0.5 * gridX, -0.5f + 0.5 * gridY);
	for (int y = 0; y < gridSize.height; ++y) {
		for (int x = 0; x < gridSize.width; ++x) {
			float r = 1.f / 2.f;
			if (!circle || gridPoint.x * gridPoint.x + gridPoint.y * gridPoint.y < r * r)
				templatePoints.push_back(gridPoint);
			gridPoint.x += gridX;
		}
		gridPoint.x = -0.5f + gridX / 2;
		gridPoint.y += gridY;
	}
}
	inline void frommxArray(const mxArray *ParamArray) {
		/*
		 * This function expects the ParamArray to be a MATLAB structure with 
		 * at-least the following fields
		 * 
		 *   a - single - scalar
		 *   b - single - scalar
		 *   c - single - scalar
		 *   d - single - scalar
		 *   
		 *   GridXSpec - single - vector of length 3
		 *   GridYSpec - single - vector of length 3
		 *   
		 *   GridXSpec = [GridXBegin, GridXStep, GridXEnd]
		 *   GridYSpec = [GridYBegin, GridYStep, GridYEnd]
		 *
		 *   onemsbyTstep - uint32_t - scalar
		 *
		 *   InitialPointSet - should be a valid 'PointVector' struct representing
		 *                     the region of points from which to search ahead.
		 */
		getInputfromStruct<float>(ParamArray, "a", this->a, getInputOps(2, "is_required", "required_size", 1));
		getInputfromStruct<float>(ParamArray, "b", this->b, getInputOps(2, "is_required", "required_size", 1));
		getInputfromStruct<float>(ParamArray, "c", this->c, getInputOps(2, "is_required", "required_size", 1));
		getInputfromStruct<float>(ParamArray, "d", this->d, getInputOps(2, "is_required", "required_size", 1));

		uint32_t onemsbyTstep;
		getInputfromStruct<uint32_t>(ParamArray, "onemsbyTstep", onemsbyTstep, getInputOps(2, "is_required", "required_size", 1));

		MexVector<float> GridXSpec;
		MexVector<float> GridYSpec;

		getInputfromStruct<float>(ParamArray, "GridXSpec", GridXSpec, getInputOps(2, "is_required", "required_size", 3));
		getInputfromStruct<float>(ParamArray, "GridYSpec", GridYSpec, getInputOps(2, "is_required", "required_size", 3));

		float eps = 1E-10; // epsilon used for floating point comparisons
		uint32_t XGridMax, YGridMax;
		XGridMax = uint32_t((GridXSpec[2] - GridXSpec[0])/GridXSpec[1] + 2*eps) + 1;// largest n such that (n-1)*GridXSpec[1] + GridXSpec[0] <= GridXSpec[2]
		YGridMax = uint32_t((GridYSpec[2] - GridYSpec[0])/GridYSpec[1] + 2*eps) + 1;// largest n such that (n-1)*GridYSpec[1] + GridYSpec[0] <= GridYSpec[2]

		this->PrivateTransform.scaleX = GridXSpec[1];
		this->PrivateTransform.scaleY = GridYSpec[1];
		this->PrivateTransform.shiftX = GridXSpec[0];
		this->PrivateTransform.shiftY = GridYSpec[0];

		this->XRange = {0, XGridMax};
		this->YRange = {0, YGridMax};

		this->timeStep = 1.0f / onemsbyTstep;

		// Calculate the Grid Y Coordinate for 30.0V
		auto GridY30V = this->Transform.toGridCoords(SinglePoint(0, 30.0f)).y;
		GridY30V = (GridY30V >= YGridMax)? YGridMax : GridY30V;
		for(uint32_t i=0; i < XGridMax; ++i) {
			Point gridPoint(i, uint32_t(GridY30V+0.5f));
			PrivateInitialPointSet.insert(gridPoint);
		}
	}
Example #4
0
 /** calculate the time point denoted by this SMPTE timecode,
  *  by summing up the timecode's components */
 TimeValue 
 Smpte::evaluate (SmpteTC const& tc, QuantR quantiser)
 {
   uint frameRate = tc.getFps();
   int64_t gridPoint(tc.frames);
   gridPoint += int64_t(tc.secs)  * frameRate;
   gridPoint += int64_t(tc.mins)  * frameRate * 60;
   gridPoint += int64_t(tc.hours) * frameRate * 60 * 60;
   return quantiser.timeOf (tc.sgn * gridPoint);
 }
Example #5
0
	void CGameMap::ShowMapTile(){
		CPoint gridPoint(CConvert::GetGridPointByScreenPoint(CPoint(-64*6,-32*6)));
		//取得整個地圖的範圍,用於判斷是否再地圖內
		CRect mapRect(0,0,sizeX-1,sizeY-1);
		
		for(int y=0;y<SIZE_Y/32+17;y++){//17為最佳化的值
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x+=1;
				gridPoint.y-=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint) && this->mapTile[gridPoint.y][gridPoint.x].IsExplored()){
					
					this->mapTile[gridPoint.y][gridPoint.x].OnShow();
				}
			}
			gridPoint.x+=1;
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x-=1;
				gridPoint.y+=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint) && this->mapTile[gridPoint.y][gridPoint.x].IsExplored()){
					this->mapTile[gridPoint.y][gridPoint.x].OnShow();
				}
			}
			gridPoint.y+=1;
		}

		gridPoint = CConvert::GetGridPointByScreenPoint(CPoint(-64*6,-32*6));
		for(int y=0;y<SIZE_Y/32+17;y++){//17為最佳化的值
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x+=1;
				gridPoint.y-=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint) && this->mapTile[gridPoint.y][gridPoint.x].IsExplored()){
					
					//this->mapTile[gridPoint.y][gridPoint.x].OnShow();
				}
			}
			gridPoint.x+=1;
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x-=1;
				gridPoint.y+=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint) && this->mapTile[gridPoint.y][gridPoint.x].IsExplored()){
					//this->mapTile[gridPoint.y][gridPoint.x].OnShow();
				}
			}
			gridPoint.y+=1;
		}



	}
OpticalFlowTransitionModel::OpticalFlowTransitionModel(shared_ptr<TransitionModel> fallback,
		double positionDeviation, double sizeDeviation, Size gridSize, bool circle, Size windowSize, int maxLevel) :
				fallback(fallback),
				templatePoints(),
				gridSize(gridSize),
				windowSize(windowSize),
				maxLevel(maxLevel),
				previousPyramid(),
				currentPyramid(),
				points(),
				forwardPoints(),
				backwardPoints(),
				forwardStatus(),
				backwardStatus(),
				error(),
				squaredDistances(),
				correctFlowCount(0),
				positionDeviation(positionDeviation),
				sizeDeviation(sizeDeviation),
				generator(boost::mt19937(time(0)), boost::normal_distribution<>()) {
//	float gridY = 1 / static_cast<float>(gridSize.height);
//	float gridX = 1 / static_cast<float>(gridSize.width);
//	Point2f gridPoint(-0.5f + 0.5 * gridX, -0.5f + 0.5 * gridY);
//	for (int y = 0; y < gridSize.height; ++y) {
//		for (int x = 0; x < gridSize.width; ++x) {
//			float r = 1.f / 2.f;
//			if (!circle || gridPoint.x * gridPoint.x + gridPoint.y * gridPoint.y < r * r)
//				templatePoints.push_back(gridPoint);
//			gridPoint.x += gridX;
//		}
//		gridPoint.x = -0.5f + gridX / 2;
//		gridPoint.y += gridY;
//	}

	// TODO die variante erscheint bissl besser (größerer abstand der punkte zum rand)
	// braucht aber evtl. bissl mehr scatter nötig
	float gridY = 1.f / static_cast<float>(gridSize.height + 2);
	float gridX = 1.f / static_cast<float>(gridSize.width + 2);
	float r = 0.5f - 0.5f * (gridX + gridY);
	Point2f gridPoint(-0.5f + 0.5 * gridX + gridX, -0.5f + 0.5 * gridY + gridY);
	for (int y = 0; y < gridSize.height; ++y) {
		for (int x = 0; x < gridSize.width; ++x) {
			if (!circle || gridPoint.x * gridPoint.x + gridPoint.y * gridPoint.y < r * r)
				templatePoints.push_back(gridPoint);
			gridPoint.x += gridX;
		}
		gridPoint.x = -0.5f + gridX / 2 + gridX;
		gridPoint.y += gridY;
	}
}
Example #7
0
	void CGameMap::ShowSprites(){
		CRect mapRect(0,0,sizeX-1,sizeY-1);
		CPoint gridPoint(CConvert::GetGridPointByScreenPoint(CPoint(-64*6,-32*6)));
		//gridPoint = CConvert::GetGridPointByScreenPoint(CPoint(-64*6,-32*6));
		for(int y=0;y<SIZE_Y/32+17;y++){//17為最佳化的值
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x+=1;
				gridPoint.y-=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint)){
					if(!mapTile[gridPoint.y][gridPoint.x].IsExplored()){
						continue;
					}
					if(mapTile[gridPoint.y][gridPoint.x].VisionCount()==0){//視野外只顯示房子
						set<CSprite*>::iterator it;
						for(it = mapTile[gridPoint.y][gridPoint.x].Sprites().begin();it!= mapTile[gridPoint.y][gridPoint.x].Sprites().end();it++){
							if((*it)->IsBuilding() || (*it)->IsResource()){
								(*it)->OnShow();
							}
						}
					}else{//再視野內
						this->mapTile[gridPoint.y][gridPoint.x].OnShowSprites();
					}
				}
			}
			gridPoint.x+=1;
			for(int x=0;x<SIZE_X/64+12;x++){
				gridPoint.x-=1;
				gridPoint.y+=1;
				CPoint screenPoint(CConvert::GetScreenPointByGridPoint(gridPoint));
				if(mapRect.PtInRect(gridPoint)){
					if(!mapTile[gridPoint.y][gridPoint.x].IsExplored()){
						continue;
					}
					if(mapTile[gridPoint.y][gridPoint.x].VisionCount()==0){//視野外只顯示房子
						set<CSprite*>::iterator it;
						for(it = mapTile[gridPoint.y][gridPoint.x].Sprites().begin();it!= mapTile[gridPoint.y][gridPoint.x].Sprites().end();it++){
							if((*it)->IsBuilding()){
								(*it)->OnShow();
							}
						}
					}else{//再視野內
						this->mapTile[gridPoint.y][gridPoint.x].OnShowSprites();
					}
				}
			}
			gridPoint.y+=1;
		}
	}
Example #8
0
	bool CGameMap::CanPutHere(CPoint mapPoint){
		CPoint gridPoint(CConvert::GetGridPointByMapPoint(mapPoint));
		return CGameMap::GetMapTile(gridPoint)->Sprites().empty();
	}
void USObstacleGridProvider::addUsMeasurement(bool actuatorChanged, float m, SensorData::UsActuatorMode mappedActuatorMode, unsigned int timeStamp,
        const FilteredSensorData& theFilteredSensorData, const FrameInfo& theFrameInfo,
        const OdometryData& theOdometryData)
{
    ASSERT(mappedActuatorMode >= 0);
    ASSERT(mappedActuatorMode < 4);

    bool isNew = timeStamp == theFilteredSensorData.usTimeStamp;
    if(timeStamp > bufferedMeasurements[mappedActuatorMode].timeStamp)
    {
        if(actuatorChanged || m < bufferedMeasurements[mappedActuatorMode].value)
            bufferedMeasurements[mappedActuatorMode].value = m;
        bufferedMeasurements[mappedActuatorMode].timeStamp = timeStamp;
    }

    if(m < parameters.minValidUSDist)
        return;
    switch(mappedActuatorMode)
    {
    case SensorData::leftToLeft:
        for(std::vector<UsMeasurement>::iterator it = postponedLeftToRightMeasurements.begin(); it != postponedLeftToRightMeasurements.end();)
        {
            if(timeStamp - it->timeStamp > 1000) // postponed measurement is to old
                it = postponedLeftToRightMeasurements.erase(it);
            else if(abs(m - it->value) < 200)
            {
                addUsMeasurement(false, it->value, SensorData::leftToRight, it->timeStamp, theFilteredSensorData,theFrameInfo,theOdometryData);
                it = postponedLeftToRightMeasurements.erase(it);
            }
            else
                ++it;
        }
        break;
    case SensorData::rightToRight:
        for(std::vector<UsMeasurement>::iterator it = postponedRightToLeftMeasurements.begin(); it != postponedRightToLeftMeasurements.end();)
        {
            if(timeStamp - it->timeStamp > 1000) // postponed measurement is to old
                it = postponedRightToLeftMeasurements.erase(it);
            else if(abs(m - it->value) < 200)
            {
                addUsMeasurement(false, it->value, SensorData::rightToLeft, it->timeStamp, theFilteredSensorData,theFrameInfo,theOdometryData);
                it = postponedRightToLeftMeasurements.erase(it);
            }
            else
                ++it;
        }
        break;
    case SensorData::leftToRight:
        if(isNew && (timeStamp - bufferedMeasurements[SensorData::leftToLeft].timeStamp > 1000 || abs(bufferedMeasurements[SensorData::leftToLeft].value - m) > 200))
        {
            postponedLeftToRightMeasurements.push_back(UsMeasurement(m, timeStamp));
            return; // Don't fill cells, as leftToRight measurements are only valid if left Sensor measured something
        }
        break;
    case SensorData::rightToLeft:
        if(isNew && (timeStamp - bufferedMeasurements[SensorData::rightToRight].timeStamp > 1000 || abs(bufferedMeasurements[SensorData::rightToRight].value - m) > 200))
        {
            postponedRightToLeftMeasurements.push_back(UsMeasurement(m, timeStamp));
            return; // Don't fill cells, as rightToLeft measurements are only valid if right Sensor measured something
        }
        break;
    default:
        ASSERT(false);
        break;
    }

    // Compute and draw relevant area:
    if(m > parameters.maxValidUSDist)
        m = static_cast<float>(parameters.maxValidUSDist);
    Vector2<> measurement(m, 0.0f);
    Vector2<> base, leftOfCone(measurement), rightOfCone(measurement);
    switch(mappedActuatorMode)
    {
    case SensorData::leftToLeft: // left transmitter, left sensor => left
        base = parameters.usLeftPose.translation;
        leftOfCone.rotate(parameters.usOuterOpeningAngle);
        rightOfCone.rotate(parameters.usInnerOpeningAngle);
        leftOfCone = parameters.usLeftPose * leftOfCone;
        rightOfCone = parameters.usLeftPose * rightOfCone;
        break;

    case SensorData::rightToRight: // right transmitter, right sensor => right
        base = parameters.usRightPose.translation;
        leftOfCone.rotate(-parameters.usInnerOpeningAngle);
        rightOfCone.rotate(-parameters.usOuterOpeningAngle);
        leftOfCone = parameters.usRightPose * leftOfCone;
        rightOfCone = parameters.usRightPose * rightOfCone;
        break;

    case SensorData::leftToRight: // left transmitter, right sensor => center left
        base = parameters.usCenterPose.translation;
        leftOfCone.rotate(parameters.usCenterOpeningAngle);
        rightOfCone.rotate(parameters.usCenterOpeningAngle * 0.25f);
        leftOfCone = parameters.usCenterPose * leftOfCone;
        rightOfCone = parameters.usCenterPose * rightOfCone;
        break;

    case SensorData::rightToLeft: // right transmitter, left sensor => center right
        base = parameters.usCenterPose.translation;
        leftOfCone.rotate(-parameters.usCenterOpeningAngle * 0.25f);
        rightOfCone.rotate(-parameters.usCenterOpeningAngle);
        leftOfCone = parameters.usCenterPose * leftOfCone;
        rightOfCone = parameters.usCenterPose * rightOfCone;
        break;

    default:
        ASSERT(false);
        break;
    }

    // Draw current (positive) measurement:
    if(m < parameters.maxValidUSDist)
    {
        /*LINE("module:USObstacleGridProvider:us", base.x, base.y, leftOfCone.x, leftOfCone.y,
             30, Drawings::ps_solid, ColorRGBA(255, 0, 0));
        LINE("module:USObstacleGridProvider:us", base.x, base.y, rightOfCone.x, rightOfCone.y,
             30, Drawings::ps_solid, ColorRGBA(255, 0, 0));
        LINE("module:USObstacleGridProvider:us", rightOfCone.x, rightOfCone.y, leftOfCone.x, leftOfCone.y,
             30, Drawings::ps_solid, ColorRGBA(255, 0, 0));*/
    }

    // Compute additional cones:
    // *Free is used for clearing cells between the robot and the obstacle
    // *Far is used to add a second obstacle line to the grid (should help in case of high walk speeds and imprecision)
    Vector2<> leftOfConeFree(leftOfCone - base);
    Vector2<> rightOfConeFree(rightOfCone - base);
    Vector2<> leftOfConeFar(leftOfCone - base);
    Vector2<> rightOfConeFar(rightOfCone - base);
    float cellDiameter = sqrt(static_cast<float>(USObstacleGrid::CELL_SIZE * USObstacleGrid::CELL_SIZE + USObstacleGrid::CELL_SIZE * USObstacleGrid::CELL_SIZE));
    leftOfConeFree.normalize(leftOfConeFree.abs() - cellDiameter);
    rightOfConeFree.normalize(rightOfConeFree.abs() - cellDiameter);
    leftOfConeFar.normalize(leftOfConeFar.abs() + cellDiameter);
    rightOfConeFar.normalize(rightOfConeFar.abs() + cellDiameter);
    leftOfConeFree += base;
    rightOfConeFree += base;
    leftOfConeFar += base;
    rightOfConeFar += base;
    // Transfer cones to grid coordinate system:
    const Vector2<int> leftOfConeCells =
        worldToGrid(Vector2<int>(static_cast<int>(leftOfCone.x), static_cast<int>(leftOfCone.y)), theOdometryData);
    const Vector2<int> leftOfConeCellsFree =
        worldToGrid(Vector2<int>(static_cast<int>(leftOfConeFree.x), static_cast<int>(leftOfConeFree.y)), theOdometryData);
    const Vector2<int> leftOfConeCellsFar =
        worldToGrid(Vector2<int>(static_cast<int>(leftOfConeFar.x), static_cast<int>(leftOfConeFar.y)), theOdometryData);
    const Vector2<int> rightOfConeCells =
        worldToGrid(Vector2<int>(static_cast<int>(rightOfCone.x), static_cast<int>(rightOfCone.y)), theOdometryData);
    const Vector2<int> rightOfConeCellsFree =
        worldToGrid(Vector2<int>(static_cast<int>(rightOfConeFree.x), static_cast<int>(rightOfConeFree.y)), theOdometryData);
    const Vector2<int> rightOfConeCellsFar =
        worldToGrid(Vector2<int>(static_cast<int>(rightOfConeFar.x), static_cast<int>(rightOfConeFar.y)), theOdometryData);

    // Free empty space until obstacle:
    polyPoints.clear();
    // Origin (sensor position):
    Vector2<int> p1(static_cast<int>(base.x), static_cast<int>(base.y));
    p1 = worldToGrid(p1, theOdometryData);
    polyPoints.push_back(p1);
    // Left corner of "cone":
    polyPoints.push_back(Point(leftOfConeCellsFree, Point::NO_OBSTACLE));
    // Right corner of "cone":
    const Vector2<> ll(rightOfConeFree);
    float f1 = ll.abs(),
          f2 = f1 ? leftOfConeFree.abs() / f1 : 0;
    Vector2<> gridPoint(ll);
    gridPoint *= f2;
    const Vector2<int> gridPointInt(static_cast<int>(gridPoint.x), static_cast<int>(gridPoint.y));
    polyPoints.push_back(Point(worldToGrid(gridPointInt, theOdometryData), polyPoints.back().flags));
    polyPoints.push_back(Point(rightOfConeCellsFree, Point::NO_OBSTACLE));
    // Sensor position again:
    polyPoints.push_back(p1);
    // Clip and fill:
    for(int j = 0; j < (int) polyPoints.size(); ++j)
        clipPointP2(p1, polyPoints[j]);
    fillScanBoundary(theFrameInfo);

    // Enter obstacle to grid:
    // If the sensor measures a high value, cells are cleared but
    // no obstacles are entered
    if(m != parameters.maxValidUSDist)
    {
        line(leftOfConeCells, rightOfConeCells, theFrameInfo);
        line(leftOfConeCellsFar, rightOfConeCellsFar, theFrameInfo);
    }
}
Example #10
0
	CPoint CConvert::GetGridPointByScreenPoint(CPoint sp){//輸入螢幕點得到格子座標**********
		CPoint mapPoint(GetMapPointByScreenPoint(sp));//螢幕轉成地圖座標
		CPoint gridPoint(GetGridPointByMapPoint(mapPoint));//地圖座標轉成格子座標
		return gridPoint;
	}