string endX( string str ) { if( str.empty() ) return str; string iter = str.substr( 1 ); string token = str.substr( 0, 1 ); return ( token.compare( 0, 1, "x" ) == 0 ) ? ( endX( iter ) + token ) : ( token + endX( iter ) ); }
void ChFun::function1D(double* out, const double* xValues, const size_t nData)const { const double start = startX(); const double end = endX(); for(size_t i = 0; i < nData; ++i) { const double x = xValues[i]; if ( x < start ) continue; if ( x > end ) break; out[i] = valueB( x ); } }
void ChFun::setAttribute(const std::string& attName,const IFunction::Attribute& att) { IFunction1D::setAttribute( attName, att ); if ( attName == "n" ) { reset( att.asInt() ); } else if ( attName == "StartX" ) { set( n(), att.asDouble(), endX() ); } else if ( attName == "EndX" ) { set( n(), startX(), att.asDouble() ); } }
void Canvas::mouseReleaseEvent(QMouseEvent *) { if(currentShape()->type() != LineSegment::LineSegmentType::Type && !currentScene->shapes.isEmpty()) { AbstractShape * item = currentShape(); currentScene->edge()->setPen(currentPen); QRectF tmp = item->boundingRect(); currentScene->edge()->draw(tmp.topLeft().x(), tmp.topLeft().y(), tmp.bottomRight().x(), tmp.bottomRight().y()); currentScene->edge()->show(); currentScene->update(); edgeLocker = false; } isMoved = false; if(enableFill) { enableFill = false; currentScene->currentShape()->setPen(currentPen); if(currentShape()->type() == Triangle::TriangleType::Type && ((Triangle *)currentShape())->normalizeFlag) { currentScene->currentShape()->normalize(startX(), startY(), startX() - rect().topLeft().x()); } else { currentScene->currentShape()->draw(startX(), startY(), endX(), endY()); } currentScene->update(); } else _normalize = NormalizeNone; if(buttonPressed) { _direction = None; _normalize = NormalizeNone; isMoved = false; shapeDrawn = true; buttonPressed = false; shapeSet = false; enableResize = true; } }
/** * Returns the intersection of this 3D area with another 3D area. If there is * no intersection, an invalid 3D area will be returned. * * @param otherArea the area to intersect this 3D area with * @return the 3D area that is the intersection */ Area3D Area3D::intersect(const Area3D &otherArea) const { Area3D result; // Check validity because of comparison operators. if (isValid() && otherArea.isValid()) { Displacement startX(std::max(getStartX(), otherArea.getStartX())); Displacement startY(std::max(getStartY(), otherArea.getStartY())); Displacement startZ(std::max(getStartZ(), otherArea.getStartZ())); Displacement endX(std::min(getEndX(), otherArea.getEndX())); Displacement endY(std::min(getEndY(), otherArea.getEndY())); Displacement endZ(std::min(getEndZ(), otherArea.getEndZ())); if (startX <= endX && startY <= endY && startZ <= endZ) result = Area3D(startX, startY, startZ, endX, endY, endZ); } return result; }
void Canvas::mouseMoveEvent(QMouseEvent *event) { if(!enableFill) { if(!isMoved) { AbstractShape * item = currentShape(); QPointF p = event->pos(); QRectF r = item->boundingRect(); QPointF tl = mapFromScene(r.topLeft()); QPointF br = mapFromScene(r.bottomRight()); QPointF tr = mapFromScene(r.topRight()); QPointF bl = mapFromScene(r.bottomLeft()); checkIfProperRect(tl, br, tr, bl); if(enableResize && shapeDrawn) { //checkIfProperRect(tl, br); if(item != nullptr && item->type() != AbstractShape::AbstractType::Type + 1) { if(belongToFirstCorners(p, tl, br)) { setCursor(Qt::SizeBDiagCursor); } /*else if(belongToSecondCorners(p, tl, br)) { setCursor(Qt::SizeFDiagCursor); }*/ else if(((p.x() <= tl.x() && p.x() > tl.x() - 3) && p.y() > tl.y() - 3 && p.y() < br.y()) || ((p.x() > br.x() - 3 && p.x() <= br.x()) && p.y() > tl.y() - 3 && p.y() < br.y())) { setCursor(Qt::SizeHorCursor); } else if(((p.y() > br.y() - 3 && p.y() <= br.y()) && p.x() > tl.x() - 3 && p.x() < br.x()) || (p.y() <= tl.y() && p.y() > tl.y() - 3) && p.x() > tl.x() - 3 && p.x() < br.x()) { setCursor(Qt::SizeVerCursor); } else if(p.x() >= tl.x() && p.x() <= br.x() && p.y() >= tl.y() && p.y() <= br.y()) { setCursor(Qt::SizeAllCursor); } else { setCursor(Qt::CrossCursor); } if(event->buttons() & Qt::LeftButton) { QPointF tl = mapFromScene(r.topLeft()); QPointF br = mapFromScene(r.bottomRight()); QPointF point = mapToScene(event->pos()); switch(_direction) { case Left : { if(sceneLocker(point)) { if(tl.x() > br.x()) { _endX = point.x(); } else { _startX = point.x(); } } break; } case Right : { if(sceneLocker(point)) { if(tl.x() > br.x()) { _startX = point.x(); } else { _endX = point.x(); } } break; } case Top: { if(sceneLocker(point)) { if(tl.y() > br.y()) { _endY = point.y(); } else { _startY = point.y(); } } break; } case Bottom : { if(sceneLocker(point)) { if(tl.y() > br.y()) { _startY = point.y(); } else { _endY = point.y(); } } break; } } item->draw(startX(), startY(), endX(), endY()); currentScene->edge()->draw(startX(), startY(), endX(), endY()); currentScene->update(); switch(_normalize) { case NormalizeLeft: { _startX = point.x(); _startY = point.y(); item->normalize(point.x(), point.y(), point.x() - rect().topLeft().x()); QRectF tmp = item->boundingRect(); currentScene->edge()->draw(tmp.topLeft().x(), tmp.topLeft().y(), tmp.bottomRight().x(), tmp.bottomRight().y()); _startX = tmp.topLeft().x(); _startY = tmp.topLeft().y(); _endX = tmp.bottomRight().x(); _endY = tmp.bottomRight().y(); if(item->type() == Triangle::TriangleType::Type) { ((Triangle*)item)->normalizeFlag = true; _startX = point.x(); _startY = point.y(); } break; } } } } } QPointF point = mapToScene(event->pos()); if(event->buttons() & Qt::LeftButton && _direction == None && _normalize == NormalizeNone) { preventOverBoundingOnDraw(point, _endX, _endY); if(shapeSet) { currentScene->currentShape()->setPen(currentPen); currentScene->currentShape()->draw(startX(), startY(), endX(), endY()); currentScene->update(); edgeLocker = true; } } } else if((event->buttons() & Qt::LeftButton) && isMoved && currentScene->currentShape()->type() != LineSegment::LineSegmentType::Type && (!currentScene->shapes.isEmpty() || !currentScene->lines.isEmpty())) { QRectF r = currentShape()->boundingRect(); QPoint tmp = QPoint(event->pos().x() - coordinatesIterationMove.x(), event->pos().y() - coordinatesIterationMove.y()); preventOverBoundingOnMove(r, tmp); currentScene->currentShape()->setPen(currentPen); if(currentShape()->type() == Triangle::TriangleType::Type && ((Triangle *)currentShape())->normalizeFlag) { currentScene->currentShape()->normalize(startX(), startY(), startX() - rect().topLeft().x()); } else { currentScene->currentShape()->draw(startX(), startY(), endX(), endY()); } if(!linesEnds.isEmpty()) { for(auto i: linePointIndexes) { preventOverBoundingOnDraw(linesEnds[linePointIndexes.indexOf(i)], linesEnds[linePointIndexes.indexOf(i)].rx(), linesEnds[linePointIndexes.indexOf(i)].ry()); linesEnds[linePointIndexes.indexOf(i)] += tmp; currentScene->lines.at(i)->draw(linesStarts[linePointIndexes.indexOf(i)].x(), linesStarts[linePointIndexes.indexOf(i)].y(), linesEnds[linePointIndexes.indexOf(i)].x(), linesEnds[linePointIndexes.indexOf(i)].y()); } } currentScene->edge()->hide(); currentScene->update(); coordinatesIterationMove = event->pos(); } } else { AbstractShape * tmp = currentShape(); if(tmp->isUnderMouse()) { setCursor(Qt::PointingHandCursor); } else { setCursor(Qt::CrossCursor); } } }
void Canvas::updateScene() { currentShape()->setPen(currentPen); currentShape()->draw(startX(), startY(), endX(), endY()); currentScene->update(); }
void ChFun::reset(size_t n) { set( n, startX(), endX() ); }
void MarbleGraphicsGridLayout::updatePositions( MarbleGraphicsItem *parent ) { // Initialize with 0.0 QVector<double> maxWidth( d->m_columns, 0.0 ); QVector<double> maxHeight( d->m_rows, 0.0 ); // Determining the cell sizes for ( int row = 0; row < d->m_rows; row++ ) { for ( int column = 0; column < d->m_columns; column++ ) { if ( d->m_items[row][column] == 0 ) { continue; } QSizeF size = d->m_items[row][column]->size(); double width = size.width(); double height = size.height(); if ( width > maxWidth[column] ) { maxWidth[column] = width; } if ( height > maxHeight[row] ) { maxHeight[row] = height; } } } QVector<double> startX( d->m_columns ); QVector<double> endX( d->m_columns ); QVector<double> startY( d->m_rows ); QVector<double> endY( d->m_rows ); QRectF contentRect = parent->contentRect(); for ( int i = 0; i < d->m_columns; i++ ) { if ( i == 0 ) { startX[0] = contentRect.left(); } else if ( maxWidth[i] == 0 ) { startX[i] = endX[i-1]; } else { startX[i] = endX[i-1] + d->m_spacing; } endX[i] = startX[i] + maxWidth[i]; } for ( int i = 0; i < d->m_rows; i++ ) { if ( i == 0 ) { startY[0] = contentRect.left(); } else if ( maxHeight[i] == 0 ) { startY[i] = endY[i-1]; } else { startY[i] = endY[i-1] + d->m_spacing; } endY[i] = startY[i] + maxHeight[i]; } // Setting the positions for ( int row = 0; row < d->m_rows; row++ ) { for ( int column = 0; column < d->m_columns; column++ ) { if ( d->m_items[row][column] == 0 ) { continue; } double xPos, yPos; Qt::Alignment align = alignment( d->m_items[row][column] ); if ( align & Qt::AlignRight ) { xPos = endX[column] - d->m_items[row][column]->size().width(); } else if ( align & Qt::AlignHCenter ) { xPos = startX[column] + ( maxWidth[column] - d->m_items[row][column]->size().width() ) / 2.0; } else { xPos = startX[column]; } if ( align & Qt::AlignBottom ) { yPos = endY[row] - d->m_items[row][column]->size().height(); } else if ( align & Qt::AlignVCenter ) { yPos = startY[row] + ( maxHeight[row] - d->m_items[row][column]->size().height() ) / 2.0; } else { yPos = startY[row]; } d->m_items[row][column]->setPosition( QPointF( xPos, yPos ) ); } } parent->setContentSize( QSizeF( endX[d->m_columns - 1] - contentRect.left(), endY[d->m_rows - 1] - contentRect.top() ) ); }