Exemplo n.º 1
0
int isPointInTriangle(Point pt, Point v1, Point v2, Point v3)
{
  if (isOnLine(pt, v1, v2)) return 0;
  if (isOnLine(pt, v2, v3)) return 0;
  if (isOnLine(pt, v3, v1)) return 0;
  
  int b1, b2, b3;

  b1 = (cross(pt, v1, v2) < 0.0f)?1:0;
  b2 = (cross(pt, v2, v3) < 0.0f)?1:0;
  b3 = (cross(pt, v3, v1) < 0.0f)?1:0;
  
  return ((b1 == b2) && (b2 == b3))?1:0;
}
bool inLineWithGoal()
{
    if(isOnLine() == true && SensorValue[irseeker] == 4)
    {
        return true;
    }
    else
    {
        return false;
    }
}
Exemplo n.º 3
0
void FollowLine() //Needs better logic just this for tests
{
		if(isOnLine())
		{
			MoveForward(0.05,autospeed);
		}
		else
		{
			while(!isOnLine())
			{
					TurnToIR();
					if(facingIR() && !isOnLine())
					{
						TurnLeft(0.05,autospeed);
					}
					MoveForward(0.05,autospeed);
					LineDown();
			}
		}
}
void turnToLine(int motorSpeed, int maxAngle)
{
	bool turningRight = false;
	if(happy_angle < maxAngle)
	{
		turningRight = true;
	}
	if(turningRight == true)
	{
		while(happy_angle < maxAngle && isOnLine() == false)
		{
			motor[leftmotor] =  motorSpeed;
			motor[rightmotor] = -motorSpeed;
		}
	}
	else //Turning left
	{
		while(happy_angle > maxAngle && isOnLine() == false)
		{
			motor[leftmotor] = -motorSpeed;
			motor[rightmotor] = motorSpeed;
		}
	}
}
int LostInJingAnTemple::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QMainWindow::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: on_actionImportData_triggered(); break;
        case 1: on_actionConvert_To_Weighted_Graph_triggered(); break;
        case 2: on_actionFindShortestPath_triggered(); break;
        case 3: on_actionExportData_triggered(); break;
        case 4: on_actionAbout_triggered(); break;
        case 5: { float _r = distanceBetweenTwoPoints((*reinterpret_cast< Point(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])));
            if (_a[0]) *reinterpret_cast< float*>(_a[0]) = _r; }  break;
        case 6: { bool _r = onTheBuildingEdge((*reinterpret_cast< Building(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 7: { bool _r = isTheBuildingEdge((*reinterpret_cast< Building(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 8: { bool _r = crossTheBuilding((*reinterpret_cast< Building(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 9: { bool _r = crossTheBuildings((*reinterpret_cast< vector<Building>(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 10: { bool _r = crossLines((*reinterpret_cast< Point(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])),(*reinterpret_cast< Point(*)>(_a[4])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 11: { bool _r = samePosition((*reinterpret_cast< Point(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 12: { bool _r = isPointInsideBuilding((*reinterpret_cast< Building(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 13: { bool _r = isLineInsideBuilding((*reinterpret_cast< Building(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 14: { bool _r = isLineFullInsideBuilding((*reinterpret_cast< Building(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 15: { bool _r = isTwoLinesParalleled((*reinterpret_cast< Point(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])),(*reinterpret_cast< Point(*)>(_a[4])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        case 16: { bool _r = isOnLine((*reinterpret_cast< Point(*)>(_a[1])),(*reinterpret_cast< Point(*)>(_a[2])),(*reinterpret_cast< Point(*)>(_a[3])));
            if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; }  break;
        default: ;
        }
        _id -= 17;
    }
    return _id;
}
Exemplo n.º 6
0
unsigned char cxSimpleSyntheticVolume::evaluate(const cx::Vector3D &p) const
{
    float x = p[0];
    float y = p[1];
    float z = p[2];

    // Let's make a block in the middle of the volume
    if(x > mBounds(0)/3 && x < 2*mBounds(0)/3
       && y > mBounds(1)/3 && y < 2*mBounds(1)/3
       && z > mBounds(2)/3 && z < 2*mBounds(2)/3)
    {
        return 255;
    }

    // A set of thin lines with traversing in each of the directions

    // Z direction
    if(isOnLine(x, y-2.0f, 0.5f, 5, 2))
    {
        return 255;
    }

    if(isOnLine(x, y-3.0f, 0.25f, 5, 2))
    {
        return 255;
    }

    if(isOnLine(x, y-4.0f, 0.125f, 5, 2))
    {
        return 255;
    }
    if(isOnLine(x, y-5.0f, 0.0625f, 5, 2))
    {
        return 255;
    }

    // Y direction
    if(isOnLine(x, z-2.0f, 0.5f, 5, 1))
    {
        return 255;
    }

    if(isOnLine(x, z-3.0f, 0.25f, 5, 1))
    {
        return 255;
    }

    if(isOnLine(x, z-4.0f, 0.125f, 5, 1))
    {
        return 255;
    }
    if(isOnLine(x, z-5.0f, 0.0625f, 5, 1))
    {
        return 255;
    }

    // X direction
    if(isOnLine(z, y-2.0f, 0.5f, 5, 0))
    {
        return 255;
    }

    if(isOnLine(z, y-3.0f, 0.25f, 5, 0))
    {
        return 255;
    }

    if(isOnLine(z, y-4.0f, 0.125f, 5, 0))
    {
        return 255;
    }
    if(isOnLine(z, y-5.0f, 0.0625f, 5, 0))
    {
        return 255;
    }


    // Return nonzero if value is inside region
    else if(x > 0 && x < mBounds(0)
            && y > 0 && y < mBounds(1)
            && z > 0 && z < mBounds(2))
    {
        return 10;
    }
    return 0;
}
void Triangulation2D_Delaunay::InsertPoint(Point* newPoint) {
	if(_triangles.empty()) {
		// 1er point
		if(_points.empty()) {
			_points.push_back(newPoint);
		}
		// 2em point
		else if(_points.size() == 1) {
			_points.push_back(newPoint);
			_edges.push_back(new Line(_points[0], newPoint));
		}
		// 3+em point
		else {
			_points.push_back(newPoint);
			// Si le point est colinéaire aux autres
			if(isOnLine(_edges[0], newPoint)) {
				// Si le point est à l'extremité "basse" des points colinéaires
				Point* minPoint = getMinCoordinates(_points);
				Point* maxPoint = getMaxCoordinates(_points);

				if(newPoint->getX() < minPoint->getX() || (newPoint->getX() == minPoint->getX() && newPoint->getY() < minPoint->getY())) {
					_edges.push_back(new Line(newPoint, nullptr));
				}
				// Si le point est à l'extremité "haute" des points colinéaires
				else if(newPoint->getX() > maxPoint->getX() || (newPoint->getX() == maxPoint->getX() && newPoint->getY() > maxPoint->getY())) {
					_edges.push_back(new Line(nullptr, newPoint));
				}
				// Si le point est en plein milieu
				// On update l'ancienne arete et on ajoute une nouvelle arête
				else {
					Point* pointBefore = getMiddleCoordinates(_points, newPoint);
					for(auto edge : _edges) {
						if(edge->getStartPoint() == pointBefore) {
							_edges.push_back(new Line(newPoint, edge->getEndPoint()));
							edge->setEndPoint(newPoint);
							break;
						}
					}

				}

				delete minPoint;
				delete maxPoint;
			}
			// Si le point n'est pas colinéaire
			// (on passera ici qu'une fois normalement)
			else {
				for(auto point : _points) {
					Line* tempLine = new Line(point, newPoint);
					_edges.push_back(tempLine);
					point->setLine(tempLine);
				}

				for(auto edge : _edges) {
					Line* tempLineA = edge->getStartPoint()->getLine();
					Line* tempLineB = edge->getEndPoint()->getLine();
					// Peut etre à l'envers
					_triangles.push_back(new Triangle(edge, tempLineA, tempLineB));
					// ou 
					//_triangles.push_back(new Triangle(edge, tempLineB, tempLineA));
					// en fonction de la position de newPoint ?
				}
			}
		}
	}
	// Y'a deja des triangles
	else {
		_points.push_back(newPoint);
		// Si le point est dans un triangle
		bool inTriangle = false;
		Triangle* triangleContainingPoint = nullptr;
		std::vector<Line*> edges;

		std::vector<Triangle*>::iterator it;
		for(it = _triangles.begin(); it != _triangles.end(); it++) {
			Triangle* triangle = *it;
			if(PointInTriangle(*newPoint, *triangle->getPointA(), *triangle->getPointB(), *triangle->getPointC())) {
				inTriangle = true;
				triangleContainingPoint = triangle;
				break;
			}
		}
		if(inTriangle) {
			_triangles.erase(it);
			edges.push_back(triangleContainingPoint->LineA());
			edges.push_back(triangleContainingPoint->LineB());
			edges.push_back(triangleContainingPoint->LineC());
		}
		else {
			//TODO: déterminer la liste des aretes vues par le point
			// Avec l'enveloppe c'est plus opti
			for(auto edge : _edges) {
				Point normal(-(edge->getEndPoint()->getY() - (edge->getStartPoint()->getY())), edge->getEndPoint()->getX() - (edge->getStartPoint())->getX());
				Point edgee(newPoint->getX() - edge->getEndPoint()->getX(), newPoint->getY() - edge->getEndPoint()->getY());
				double dot = dotProduct(normal, edgee);
				if(dot < 0) {
					edges.push_back(edge);
				}
			}
		}

		while(!edges.empty()) {
			Line* a = edges.back();
			edges.pop_back();

			bool pointInCircle = false;
			std::vector<Triangle*>::iterator it2;
			for(it2 = _triangles.begin(); it2 != _triangles.end(); it2++) {
				Triangle* triangle2 = *it2;
				if(inCircle(triangle2->getPointA(), triangle2->getPointB(), triangle2->getPointC(), newPoint)) {
					pointInCircle = true;
					break;
				}
			}

			// Si l'arete a un triangle incident t dont le cercle circonscrit contient newPoint, suprimer le triangle t et l'arete a et ajouter les 2 autres aretes du triangle à la liste
			if(pointInCircle) {
				std::cout << "je passe jamais !" << std::endl;
				Triangle* triangle = *it;
				edges.erase(edges.begin());
				if(triangle->LineA() != a) {
					edges.push_back(triangle->LineA());
				}
				if(triangle->LineB() != a) {
					edges.push_back(triangle->LineB());
				}
				if(triangle->LineC() != a) {
					edges.push_back(triangle->LineC());
				}
				_triangles.erase(it);
			}
			else {
				// creer aretes start - new et end - new et le triangle a a1 a2 (ou a2 a1 a)
				Line* a1 = new Line(a->getStartPoint(), newPoint);
				Line* a2 = new Line(a->getEndPoint(), newPoint);
				_edges.push_back(a1);
				_edges.push_back(a2);
				_triangles.push_back(new Triangle(a, a1, a2));
			}
		}
	}
}