double PathCorrector::getCos(QPoint const & pnt1, QPoint const & pnt2, QPoint const & pnt3) { QPoint vector1(pnt2.x() - pnt1.x(), pnt2.y() - pnt1.y()); QPoint vector2(pnt3.x() - pnt2.x(), pnt3.y() - pnt2.y()); double length1 = (pnt1 - pnt2).manhattanLength(); double length2 = (pnt2 - pnt3).manhattanLength(); if(length1 > 0 && length2 > 0) return (double) getScalarProduct(vector1, vector2) / (length1 * length2); return 1; }
bool GLWidget::isLeftTurn(std::vector<QPointF> &points) { const QPointF &p1 = points[points.size() - 3]; const QPointF &p2 = points[points.size() - 2]; const QPointF &p3 = points[points.size() - 1]; const QPointF p2p1 = QPointF(p2.x() - p1.x(), p2.y() - p1.y()); const QPointF p3p1 = QPointF(p3.x() - p1.x(), p3.y() - p1.y()); // Für Graham-Scan: // <= statt <, um kolineare Punkte zu überspringen return getScalarProduct(p2p1, p3p1) <= 0; }
bool GLWidget::isHorizontalSegment(const QPointF &p1, const QPointF &p2) { // Punkt, der auf der Waagrechten von Punkt p1 liegt. const QPointF pHorizontal = QPointF(p1.x() + 10, p1.y()); // Repräsentiert ein horizontales Segment vom Punkt p1 const QPointF lineSegHorizontal = QPointF(pHorizontal.x() - p1.x(), pHorizontal.y() - p1.y()); const QPointF p2p1 = QPointF(p2.x() - p1.x(), p2.y() - p1.y()); const double scalarProduct = getScalarProduct(lineSegHorizontal, p2p1); const double magnitudeSeg1 = qSqrt(lineSegHorizontal.x() * lineSegHorizontal.x() + lineSegHorizontal.y() * lineSegHorizontal.y()); const double magnitudeSeg2 = qSqrt(p2p1.x() * p2p1.x() + p2p1.y() * p2p1.y()); const double degree = qAcos( scalarProduct / (magnitudeSeg1 * magnitudeSeg2) ) * 180 / M_PI; return degree < 45 || degree > 135; }
bool GLWidget::isLeftTurn(const QPointF &lineSeg1, const QPointF &lineSeg2) { return getScalarProduct(lineSeg1, lineSeg2) < 0; }