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