/** * \return True if the given point is inside this triangle. * * \param ip the point * * \param treatAsQuadrant If \c treatAsQuadrant is true, the triangle is * treated as an open quadrant * or segment with its center at the first corner. In this case, the point is * inside, if it is on the plane that is limited by the two rays * corner[0] -> corner[1] and corner[0] -> corner[2]. * */ bool RTriangle::isPointInTriangle(const RVector& ip, bool treatAsQuadrant) const { RVector normal = getNormal(); RVector f; if (std::fabs(normal.x) > std::fabs(normal.y) && std::fabs(normal.x) > std::fabs(normal.z)) { // drop x component for inside test: f = RVector(0, 1, 1); } else if (std::fabs(normal.y) > std::fabs(normal.z)) { // drop y component for inside test: f = RVector(1, 0, 1); } else { // drop z component for inside test: f = RVector(1, 1, 0); } RVector p = ip.getMultipliedComponents(f); RVector a = corner[0].getMultipliedComponents(f); RVector b = corner[1].getMultipliedComponents(f); RVector c = corner[2].getMultipliedComponents(f); RVector v0 = c - a; RVector v1 = b - a; RVector v2 = p - a; double dot00 = RVector::getDotProduct(v0, v0); double dot01 = RVector::getDotProduct(v0, v1); double dot02 = RVector::getDotProduct(v0, v2); double dot11 = RVector::getDotProduct(v1, v1); double dot12 = RVector::getDotProduct(v1, v2); double invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01); double u = (dot11 * dot02 - dot01 * dot12) * invDenom; double v = (dot00 * dot12 - dot01 * dot02) * invDenom; return (u > 0.0 && v > 0.0 && (treatAsQuadrant || u + v < 1.0)); }
/** * Updates the grid information, in particular the grid spacing and * grid region to the current view port. */ void ROrthoGrid::update(bool force) { if (!force && viewBox==view.getBox()) { return; } viewBox = view.getBox(); int viewportNumber = view.getViewportNumber(); RDocument* doc = view.getDocument(); if (doc == NULL) { qWarning() << "ROrthoGrid::update: document is NULL"; return; } RGraphicsScene* scene = view.getScene(); if (scene==NULL) { qWarning() << "ROrthoGrid::update: scene is NULL"; return; } RS::ProjectionRenderingHint hint = scene->getProjectionRenderingHint(); // for 3d views, we have no convenient way to calculate the grid dimensions: if (hint == RS::RenderThreeD) { gridBox = RBox(RVector(-1000, -1000), RVector(1000, 1000)); spacing = RVector(10.0, 10.0); return; } QString key; key = QString("Grid/IsometricGrid0%1").arg(viewportNumber); isometric = doc->getVariable(key, false, true).toBool(); RS::Unit unit = doc->getUnit(); RS::LinearFormat linearFormat = doc->getLinearFormat(); // default values for missing configurations and 'auto' settings: minSpacing.valid = true; minMetaSpacing.valid = true; if (isFractionalFormat(linearFormat) && !RUnit::isMetric(unit)) { //minSpacing.x = minSpacing.y = RNANDOUBLE; //minMetaSpacing.x = minMetaSpacing.y = RNANDOUBLE; minSpacing.x = minSpacing.y = RUnit::convert(1.0, RS::Inch, unit) / 1024; minMetaSpacing.x = minMetaSpacing.y = RUnit::convert(1.0, RS::Inch, unit) / 1024; } else { minSpacing.x = minSpacing.y = 1.0e-6; minMetaSpacing.x = minMetaSpacing.y = RNANDOUBLE; //minSpacing.x = minSpacing.y = RNANDOUBLE; //minMetaSpacing.x = minMetaSpacing.y = 1.0e-6; } key = QString("Grid/GridSpacingX0%1").arg(viewportNumber); QVariant strSx = doc->getVariable(key, QVariant(), true); key = QString("Grid/GridSpacingY0%1").arg(viewportNumber); QVariant strSy = doc->getVariable(key, QVariant(), true); spacing.valid = true; bool autoX = !strSx.isValid() || strSx.toString()=="auto"; bool autoY = !strSy.isValid() || strSy.toString()=="auto"; // grid spacing x: if (!autoX) { // fixed: double d = RMath::eval(strSx.toString()); if (!RMath::hasError() && d>RS::PointTolerance) { minSpacing.x = spacing.x = d; } } // grid spacing y: if (!autoY) { double d = RMath::eval(strSy.toString()); if (!RMath::hasError() && d>RS::PointTolerance) { minSpacing.y = spacing.y = d; } } // meta grid: key = QString("Grid/MetaGridSpacingX0%1").arg(viewportNumber); QVariant strMsx = doc->getVariable(key, QVariant(), true); key = QString("Grid/MetaGridSpacingY0%1").arg(viewportNumber); QVariant strMsy = doc->getVariable(key, QVariant(), true); metaSpacing.valid = true; bool metaAutoX = !strMsx.isValid() || strMsx.toString()=="auto"; bool metaAutoY = !strMsy.isValid() || strMsy.toString()=="auto"; // meta grid spacing x: if (!metaAutoX) { // fixed: double d = RMath::eval(strMsx.toString()); if (d>RS::PointTolerance) { minMetaSpacing.x = metaSpacing.x = d; } } // meta grid spacing y: if (!metaAutoY) { // fixed: double d = RMath::eval(strMsy.toString()); if (d>RS::PointTolerance) { minMetaSpacing.y = metaSpacing.y = d; } } // auto scale grid: QList<RVector> s = getIdealSpacing(minPixelSpacing, minSpacing, minMetaSpacing); if (RSettings::getAutoScaleGrid()) { autoSpacing = spacing = s.at(0); } if (RSettings::getAutoScaleMetaGrid()) { autoMetaSpacing = metaSpacing = s.at(1); } // switch grid off below given pixel limit: if (view.mapDistanceToView(spacing.x) < minPixelSpacing) { spacing = RVector::invalid; } if (view.mapDistanceToView(metaSpacing.x) < minPixelSpacing) { metaSpacing = RVector::invalid; } if (view.mapDistanceToView(spacing.y) < minPixelSpacing) { spacing = RVector::invalid; } if (view.mapDistanceToView(metaSpacing.y) < minPixelSpacing) { metaSpacing = RVector::invalid; } // qDebug() << "spacing: " << spacing; // qDebug() << "minSpacing: " << minSpacing; // qDebug() << "metaSpacing: " << metaSpacing; // if (scaleGrid) { // QList<RVector> s = ROrthoGrid::getIdealSpacing(view, minPixelSpacing, minSpacing); // spacing = s.at(0); // metaSpacing = s.at(1); // } else { // spacing = minSpacing; // } RVector minGridPoint; RVector maxGridPoint; spacing.z = 1; if (isometric) { spacing.x = spacing.y * 2.0 * sin(M_PI/3.0); metaSpacing.x = metaSpacing.y * 2.0 * sin(M_PI/3.0); spacing = spacing / 2; //metaSpacing = metaSpacing / 2; } minGridPoint = viewBox.getCorner1(); minGridPoint = minGridPoint.getDividedComponents(spacing).getFloor(); minGridPoint = minGridPoint.getMultipliedComponents(spacing); maxGridPoint = viewBox.getCorner2(); maxGridPoint = maxGridPoint.getDividedComponents(spacing).getCeil(); maxGridPoint = maxGridPoint.getMultipliedComponents(spacing); minGridPoint.z = viewBox.getCorner1().z; maxGridPoint.z = viewBox.getCorner2().z; gridBox = RBox(minGridPoint, maxGridPoint); minGridPoint = viewBox.getCorner1(); minGridPoint = minGridPoint.getDividedComponents(metaSpacing).getFloor(); minGridPoint = minGridPoint.getMultipliedComponents(metaSpacing); maxGridPoint = viewBox.getCorner2(); maxGridPoint = maxGridPoint.getDividedComponents(metaSpacing).getCeil(); maxGridPoint = maxGridPoint.getMultipliedComponents(metaSpacing); minGridPoint.z = viewBox.getCorner1().z; maxGridPoint.z = viewBox.getCorner2().z; metaGridBox = RBox(minGridPoint, maxGridPoint); if (isometric) { QString i1 = RUnit::getLabel(spacing.x / cos(M_PI/6), *doc, true, true); QString i2 = RUnit::getLabel(metaSpacing.x / cos(M_PI/6) / 2, *doc, true, true); infoText = QString("%1 < %2").arg(i1).arg(i2); } else { QString i1 = RUnit::getLabel(spacing.x, *doc, true, true); QString i2 = RUnit::getLabel(metaSpacing.x, *doc, true, true); infoText = QString("%1 < %2").arg(i1).arg(i2); } }