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; } }
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; }
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)); } } } }