示例#1
0
void
SignalHandle::updatePos(SignalRoadItem *signalRoadItem, const QPointF &position, double sStartHint, double sEndHint)
{
    RSystemElementRoad *road = signalRoadItem->getRoad();

    // Calculate road coordinate //
    //
    double s = road->getSFromGlobalPoint(position, sStartHint, sEndHint);

    // Set Item Pose //
    //
    setPos(road->getGlobalPoint(s, 0.0));
    setRotation(road->getGlobalHeading(s));

    // Line that spans the whole road //
    //
    QPainterPath path;
    path.moveTo(0.0, road->getMinWidth(s));
    path.lineTo(0.0, road->getMaxWidth(s));
    path.addPath(*pathTemplate_);
    setPath(path);
}
示例#2
0
void
JunctionElementItem::createPath()
{
    RSystemElementRoad *road = trackElement_->getParentRoad();

    // Initialization //
    //
    double sStart = trackElement_->getSStart() + 0.001; // 1mm gap
    double sEnd = trackElement_->getSEnd() - 0.001; // 1mm gap
    if (sEnd < sStart)
        sEnd = sStart;

    //	double pointsPerMeter = 1.0; // BAD: hard coded!
    double pointsPerMeter = getProjectGraph()->getProjectWidget()->getLODSettings()->TopViewEditorPointsPerMeter;
    int pointCount = int(ceil((sEnd - sStart) * pointsPerMeter)); // TODO curvature...
    if (pointCount <= 1)
    {
        pointCount = 2; // should be at least 2 to get a quad
    }
    QVector<QPointF> points(2 * pointCount + 1);
    double segmentLength = (sEnd - sStart) / (pointCount - 1);

    // Right side //
    //
    for (int i = 0; i < pointCount; ++i)
    {
        double s = sStart + i * segmentLength; // [sStart, sEnd]
        if (road)
        {
            points[i] = trackElement_->getPoint(s, road->getMinWidth(s));
        }
        else
        {

            points[i] = trackElement_->getPoint(s, 0.0);
        }
        //		qDebug() << s << " " << points[i] << " " << road->getMinWidth(s);
        if (i > 0 && (points[i] - points[i - 1]).manhattanLength() > 30)
        {
            //			QPointF tmp = trackElement_->getPoint(s, road->getMinWidth(s));
            //			qDebug() << "*************";
        }
    }

    // Left side //
    //
    for (int i = 0; i < pointCount; ++i)
    {
        double s = sEnd - i * segmentLength; // [sEnd, sStart]
        if (s < 0.0)
            s = 0.0; // can happen due to numerical inaccuracy (around -1.0e-15)
        points[i + pointCount] = trackElement_->getPoint(s, road->getMaxWidth(s));
    }

    // End point //
    //
    points[2 * pointCount] = trackElement_->getPoint(sStart, road->getMinWidth(sStart));

    // Psycho-Path //
    //
    QPainterPath path;
    path.addPolygon(QPolygonF(points));

    setPath(path);
}