コード例 #1
0
ファイル: pathcorrector.cpp プロジェクト: AirVan21/tools
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;
}
コード例 #2
0
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;
}
コード例 #3
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;
}
コード例 #4
0
bool GLWidget::isLeftTurn(const QPointF &lineSeg1, const QPointF &lineSeg2)
{
    return getScalarProduct(lineSeg1, lineSeg2) < 0;
}