void PolygonLine :: computeIntersectionPoints(const FloatArray &iXStart, const FloatArray &iXEnd, std :: vector< FloatArray > &oIntersectionPoints) const { const double detTol = 1.0e-15; int numSeg = this->giveNrVertices() - 1; for(int segIndex = 1; segIndex <= numSeg; segIndex++) { const FloatArray &xStart = this->giveVertex(segIndex); const FloatArray &xEnd = this->giveVertex(segIndex+1); const FloatArray t1 = {xEnd(0) - xStart(0), xEnd(1) - xStart(1)}; const FloatArray t2 = {iXEnd(0) - iXStart(0), iXEnd(1) - iXStart(1)}; double xi1 = 0.0, xi2 = 0.0; int maxIter = 1; for(int iter = 0; iter < maxIter; iter++) { FloatArray temp = {iXStart(0) + xi2*t2(0) - xStart(0) - xi1*t1(0), iXStart(1) + xi2*t2(1) - xStart(1) - xi1*t1(1)}; FloatArray res = {-t1.dotProduct(temp), t2.dotProduct(temp)}; //printf("iter: %d res: %e\n", iter, res.computeNorm() ); FloatMatrix K(2,2); K(0,0) = t1.dotProduct(t1); K(0,1) = -t1.dotProduct(t2); K(1,0) = -t1.dotProduct(t2); K(1,1) = t2.dotProduct(t2); double detK = K.giveDeterminant(); if(detK < detTol) { return; } FloatMatrix KInv; KInv.beInverseOf(K); FloatArray dxi; dxi.beProductOf(KInv, res); xi1 -= dxi(0); xi2 -= dxi(1); } // printf("xi1: %e xi2: %e\n", xi1, xi2); if(xi1 >= 0.0 && xi1 <= 1.0 && xi2 >= 0.0 && xi2 <= 1.0) { FloatArray pos = xStart; pos.add(xi1, t1); oIntersectionPoints.push_back(pos); } } }
void SetCursorEvent::execute() { auto item = parentContainer_->findVisualizationOf(node_); if (!item) item = parentContainer_; auto parent = item->parent(); switch(placement_) { case CursorOnTop: item->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, QPoint(item->width() / 2, 0)); break; case CursorOnBottom: item->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, QPoint(item->width() / 2, item->yEnd())); break; case CursorOnLeft: item->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, QPoint(0, item->height() / 2)); break; case CursorOnRight: item->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, QPoint(item->xEnd(), item->height() / 2)); break; case CursorOnCenter: item->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, QPoint(item->width() / 2,item->height() / 2)); break; case CursorAboveOf: parent->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, item->pos().toPoint() + QPoint(item->width() / 2, 0)); break; case CursorBelowOf: parent->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, item->pos().toPoint() + QPoint(item->width() / 2, item->height()-1)); break; case CursorLeftOf: parent->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, item->pos().toPoint() + QPoint(0, item->height() / 2)); break; case CursorRightOf: parent->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, item->pos().toPoint() + QPoint(item->width() - 1, item->height() / 2)); break; default: item->moveCursor(Visualization::Item::CursorMoveDirection::MoveOnPosition, QPoint(0, 0)); break; } }