Beispiel #1
0
 void drawStitchLengthes(const struct EmbStitchList_ * start, const struct EmbStitchList_ * stop = 0) {
     if (NULL == start || NULL == start->next) {
         return;
     }
     struct EmbStitchList_ * currentStitch = start->next;
     draw(start, start->next, distance(start, start->next));
     for (;NULL != currentStitch
          && NULL != currentStitch->next
          && stop != currentStitch->next
          && stop != currentStitch; currentStitch = currentStitch->next) {
         struct EmbStitchList_ * nextStitch = currentStitch->next;
         if (isNormal(currentStitch) && isNormal(nextStitch)) {
             draw(currentStitch, nextStitch, distance(currentStitch, nextStitch));
             continue;
         }
         if (TRIM == nextStitch->stitch.flags) {
             continue;
         }
         if (isNormal(currentStitch)) {
             for (size_t ii = 0; ii < 1; ++ii) {
                 nextStitch = nextStitch->next;
                 if (isNormal(nextStitch) && distance(currentStitch, nextStitch) < 20) {
                     draw(currentStitch, nextStitch, distance(currentStitch, nextStitch));
                     continue;
                 }
             }
         }
     }
 }
Beispiel #2
0
void lcdDisplaySensors(unsigned int fd,struct sGENERAL patient){

	//while(GPIORead(changeDisplay)!=HIGH){
		char Nokia_Temp[10],Nokia_BPM[10];	
	
		Sensors.BPM = (unsigned int)serialGetchar(fd);
		Sensors.Temp = ((float)serialGetchar(fd)*5/(1023))/0.01;			
		Sensors.BPMState = healthState(patient,Sensors.BPM);
		Sensors.TempState = isNormal(Sensors.Temp);
	
		snprintf(Nokia_Temp,10,"%.1f*C",Sensors.Temp);
		snprintf(Nokia_BPM,10,"%dBPM",Sensors.BPM);	
	
		LCDclear();

		printf("Temp:%.1f\n",Sensors.Temp);
		printf("BPM:%d\n",Sensors.BPM);
		LCDdrawstring(20,0,"SENSORES");
		LCDdrawstring(25,10,Nokia_Temp);
		LCDdrawstring(20,20,Sensors.TempState);
		LCDdrawstring(25,30,Nokia_BPM);
		LCDdrawstring(20,40,Sensors.BPMState);
	
		LCDdisplay();
	//}
}	
void MMD_Polynomial::getCoef( CDSRArray<CDSRComplex>& dest )
{
	dest.erase( 0, dest.size() );
	if( !isNormal() ) Normalize();
	for( long i = getTermCount() - 1; i >= 0 ; i-- )
		dest.push_back( term_coef[ i ].getComplex() );
}
void MMD_Polynomial::getValue( UniWord& result, const UniWord& x )
{
	long i;
	UniWord ret;
	if( !isNormal() ) Normalize();
	if( !getTermCount() ) return;
	ret = term_coef[ getTermCount() - 1 ];
	switch( getType() )
	{
	case DSRDATA_TYPE_INTEGER:
		for( i = getTermCount() - 2; i >= 0; i-- )
		{
			_dsrop_Mul_integer( ret, ret, x );
			_dsrop_Add_integer( ret, ret, term_coef[ i ] );
		}
		break;
	case DSRDATA_TYPE_REAL:
		for( i = getTermCount() - 2; i >= 0; i-- )
		{
			_dsrop_Mul_real( ret, ret, x );
			_dsrop_Add_real( ret, ret, term_coef[ i ] );
		}
		break;
	case DSRDATA_TYPE_COMPLEX:
		for( i = getTermCount() - 2; i >= 0; i-- )
		{
			_dsrop_Mul_complex( ret, ret, x );
			_dsrop_Add_complex( ret, ret, term_coef[ i ] );
		}
		break;
	default:
		break;
	}
	result = ret;
}
Beispiel #5
0
bool ImageInstance::getPixmap(QPixmap &pixmap)
{
    bool retval = true;

    if (rawType && (!rawImage))
        rawImage = new DicomImage(rawFile.toLocal8Bit().data());

    if (isNormal()) {
        if (rawType) {
            if (rawWidth < 1) rawWidth = 1;
            if (rawCenter != cachedRawCenter || rawWidth != cachedRawWidth) {
                cachedRawCenter = rawCenter;
                cachedRawWidth = rawWidth;
                rawImage->setWindow(rawCenter, rawWidth);
                retval = dcm2bmpHelper(*rawImage, cachedRawPixmap);
            }
            pixmap = cachedRawPixmap;
        } else {
            if (winWidth < 1) winWidth = 1;
            if (winCenter != cachedCenter || winWidth != cachedWidth) {
                cachedCenter = winCenter;
                cachedWidth = winWidth;
                dcmImage->setWindow(winCenter, winWidth);
                retval = dcm2bmpHelper(*dcmImage, cachedPixmap);
            }
            pixmap = cachedPixmap;
        }
    } else retval = false;

    return retval;
}
Beispiel #6
0
 void draw(const struct EmbStitchList_ * a, const struct EmbStitchList_ * b, const float intensity) {
     if (EM_NORMAL != a->stitch.flags && EM_NORMAL != b->stitch.flags) {
         return;
     }
     // The circles for the two stitches are only drawn if the flag is "EM_NORMAL",
     // thereby we avoid drawing circles for intermediate jumps, trims etc.
     if (isNormal(a)) {
         cv::circle(img, getPos(a), std::round(radius*scale), cv::Scalar(intensity), -1);
         cv::circle(mask, getPos(a), std::round(radius*scale), 255, 0);
     }
     if (isNormal(b)) {
         cv::circle(img, getPos(b), std::round(radius*scale), cv::Scalar(intensity), -1);
         cv::circle(mask, getPos(b), std::round(radius*scale), 255, -1);
     }
     cv::line(img, getPos(a), getPos(b), cv::Scalar(intensity), std::round(scale * lineWidth));
     cv::line(mask, getPos(a), getPos(b), 255, std::round(scale * lineWidth));
 }
void MMD_Polynomial::getCoef( CDSRArray<CDSRInteger>& dest )
{
	dest.erase( 0, dest.size() );
	if( !isNormal() ) Normalize();
	//for( long i = 0; i < getTermCount(); i++ )
	for( long i = getTermCount() - 1; i >= 0 ; i-- )
		dest.push_back( term_coef[ i ].getInteger() );
}
Beispiel #8
0
bool ImageInstance::getPixSpacing(double &spacingX, double &spacingY) const
{
    if (isNormal()) {
        spacingX = pixelSpacingX;
        spacingY = pixelSpacingY;
        return true;
    } else return false;
}
Beispiel #9
0
void cgLdStaticLoc(IRLS& env, const IRInstruction* inst) {
  auto const extra = inst->extra<LdStaticLoc>();
  auto const link = rds::bindStaticLocal(extra->func, extra->name);
  assertx(link.isNormal());
  auto const dst = dstLoc(env, inst, 0).reg();
  auto& v = vmain(env);

  v << lea{rvmtl()[link.handle() + rds::StaticLocalData::ref_offset()], dst};
}
Beispiel #10
0
void BinaryDigit::changeMode()
{
	if (isNormal()) {
		setMode(BinaryDigit::Checked);
		setIcon(QIcon(UNIT_IMG_FILE_CHKED));
		emit checked();
	} else {
		setMode(BinaryDigit::Normal);
		setIcon(QIcon(UNIT_IMG_FILE_NORMAL));
		emit normal();
	}
}
Beispiel #11
0
bool CDBTRule::isBigger(const std::vector<int>& cards_per, std::vector<int>& cards_now)
{
	if (cards_per.size() == 0)
		return true;
	if (!checkCards(cards_now) || cards_now.size() == 0)
		return false;
	auto per = getType(cards_per);
	auto now = getType(cards_now);
	//前一次最大或本次类型不对
	if (now.first == type_unknow || per.second == 54)
		return false;
	if (cards_per.size() == 0)
		return true;
	if (isNormal(per.first) && isNormal(now.first)){
		//必须类型数量一样
		if (per.first == now.first && cards_per.size() == cards_now.size())
			return now.second > per.second;
		return false;
	}
	if (!isNormal(per.first) && !isNormal(now.first)) {
		if ((per.first == type_boom && now.first == type_boom)
			|| (per.first == type_atom && now.first == type_atom)){
			//数量多的大
			if (cards_per.size() == cards_now.size())
				return now.second > per.second;
			return cards_now.size() > cards_per.size();
		}
		if (per.first == type_atom && now.first == type_boom)
			return false;
		return true;
	}
	if (!isNormal(per.first) && isNormal(now.first))
		return false;
	return true;
}
Beispiel #12
0
void cgInitStaticLoc(IRLS& env, const IRInstruction* inst) {
  auto const extra = inst->extra<InitStaticLoc>();
  auto const link = rds::bindStaticLocal(extra->func, extra->name);
  assertx(link.isNormal());
  auto& v = vmain(env);

  // Initialize the RefData by storing the new value into it's TypedValue and
  // incrementing the RefData reference count (which will set it to 1).
  auto mem = rvmtl()[link.handle() + rds::StaticLocalData::ref_offset()];
  storeTV(v, mem + RefData::tvOffset(), srcLoc(env, inst, 0), inst->src(0));
  emitStoreRefCount(v, OneReference, mem);
  v << storebi{uint8_t(HeaderKind::Ref), mem + (int)HeaderKindOffset};
  markRDSHandleInitialized(v, link.handle());

  static_assert(sizeof(HeaderKind) == 1, "");
}
Beispiel #13
0
bool CAButton::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    
    CCPoint point = pTouch->getLocation();
    point = this->convertToNodeSpace(point);
    
    do
    {
        CC_BREAK_IF(!this->isVisible());
        CC_BREAK_IF(!m_bTouchEnabled);
        CC_BREAK_IF(!isNormal());
        CC_BREAK_IF(!getBounds().containsPoint(point));
        
        return this->setTouchBegin(point);
    }
    while (0);
    
    return false;
}
Beispiel #14
0
void Rect::clipRect(const Rect &rect)
{
    const Vector2 topLeft = getTopLeft(),
	          bottomRight = getBottomRight(),
	          clipTopLeft = rect.getTopLeft(),
	          clipBottomRight = rect.getBottomRight();
	
    const Vector2 newTopLeft = Vector2(
	std::max(topLeft.x, clipTopLeft.x),
	std::max(topLeft.y, clipTopLeft.y));
    const Vector2 newBottomRight = Vector2(
	std::min(bottomRight.x, clipBottomRight.x),
	std::min(bottomRight.y, clipBottomRight.y));

    pos = newTopLeft;
    diagonal = newBottomRight - newTopLeft;
    if (!isNormal())
	pos = diagonal = Vector2();
}
Beispiel #15
0
    ///converts the move to a human readable string so that it can be printed
    std::string toString() const
    {
        if (mType == MOVE_WW)
            return "WW";
        if (mType == MOVE_RW)
            return "RW";
        if (mType == MOVE_DRAW)
            return "DRAW";
        if (mType == MOVE_BOG)
            return "BOG";
        if (isNull())
            return "NULL";

        std::ostringstream lStream;
        char delimiter = isNormal() ? '-' : 'x';
        assert(mData.size() > 0);

        // Concatenate all the cell numbers
        lStream << (int)mData[0];
        for(unsigned i=1; i<mData.size(); ++i)
            lStream << delimiter << (int)mData[i];

        return lStream.str();
    }
DCEL DivideAndConquerFor3DCH::BruceForceCH( vector<VERTEX*>* pVertex, const unsigned int offset )
{
    vector<TRIANGLE> triangleSet, finalTriangleSet;

    // Generate all possible triangles
    int pointSetSize = pVertex->size();
    for( int i = 0; i < pointSetSize; i++ )
    {
        for( int j = i + 1; j < pointSetSize; j++ )
        {
            for( int k = j + 1; k < pointSetSize; k++ )
            {
                // Forming face
                TRIANGLE face;
                face.p1.pointOneIndex = i;
                face.p2.pointTwoIndex = j;
                face.p3.pointThreeIndex = k;
                triangleSet.push_back( face );
            }
        }
    }

    // Find the CH for this point set by using RayAndTriangleIntersection method
    for( int i = 0; i < triangleSet.size(); i++ )
    {
        // Create a ray from this surface
        TRIANGLE triangle = triangleSet[ i ];
        // Point2 - point1
        //D3DXVECTOR3 edge1( triangle.pointTwo.x - triangle.pointOne.x, triangle.pointTwo.y - triangle.pointOne.y, triangle.pointTwo.z - triangle.pointOne.z );
        VERTEX* pointOne = (*pVertex)[ triangle.p1.pointOneIndex ];
        VERTEX* pointTwo = (*pVertex)[ triangle.p2.pointTwoIndex ];
        VERTEX* pointThree = (*pVertex)[ triangle.p3.pointThreeIndex ];

        D3DXVECTOR3 edge1( pointTwo->x - pointOne->x, pointTwo->y - pointOne->y, pointTwo->z - pointOne->z );
        D3DXVECTOR3 edge2( pointThree->x - pointOne->x, pointThree->y - pointOne->y, pointThree->z - pointOne->z );
        // point3 - point1
        //D3DXVECTOR3 edge2( triangle.pointThree.x - triangle.pointOne.x, triangle.pointThree.y - triangle.pointOne.y, triangle.pointThree.z - triangle.pointOne.z );

        D3DXVECTOR3 triangleNormal;
        D3DXVec3Cross( &triangleNormal, &edge1, &edge2 );
        D3DXVECTOR3 rayStartPoint( ( pointOne->x + pointTwo->x + pointThree->x ) / 3.0f,
                                   ( pointOne->y + pointTwo->y + pointThree->y ) / 3.0f,
                                   ( pointOne->z + pointTwo->z + pointThree->z ) / 3.0f );

        Ray ray, invRay;
        D3DXVec3Normalize( &ray.direction, &triangleNormal );
        ray.position = rayStartPoint;
        invRay = ray;
        invRay.direction *= -1.0;


        bool rayIntersect = !isNormal(ray, triangleSet[i], pVertex);
        bool invRayIntersect = !isNormal(invRay, triangleSet[i], pVertex);

        // This is the face that contribute to the convex hull and find its vertices order
        if( rayIntersect == false && invRayIntersect == true )
        {
            finalTriangleSet.push_back( triangleSet[ i ] );
        }
        else if( rayIntersect == true && invRayIntersect == false )
        {
            TRIANGLE tmpTri = triangleSet[ i ];
            int tmpVerIndex = tmpTri.p2.pointTwoIndex;
            tmpTri.p2.pointTwoIndex = tmpTri.p3.pointThreeIndex;
            tmpTri.p3.pointThreeIndex = tmpVerIndex;

            finalTriangleSet.push_back( tmpTri );
        }
    }

    DCEL dcel;
    dcel.createDCEL( &finalTriangleSet, pVertex, offset );

    return dcel;
}
Beispiel #17
0
MArray<UniWord>& MMD_Polynomial::getNormalCoef( void )
{
	if( !isNormal() ) Normalize();
	return term_coef;
}
Beispiel #18
0
/**
 * Evaluates the given mathematical expression and returns the result.
 * Angles may be expressed in degrees (default), rad (#r), gon (#g)
 * or as surveyors angles (N#d#'#"E).
 */
double RMath::eval(const QString& expression, bool* ok) {
    lastError = "";

    if (expression.isEmpty()) {
        if (ok!=NULL) {
            *ok = false;
        }
        lastError = "Expression is empty";
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    if (ok!=NULL) {
        *ok = true;
    }

    QString expr = expression;

    // 'correct' commas in numbers to points:
    if (RSettings::getNumberLocale().decimalPoint()==',') {
        expr.replace(QRegExp("(\\d*),(\\d+)"), "\\1.\\2");
    }

    int idx = -1;

    // convert surveyor type angles (e.g. N10d30'12.5"E) to degrees:
    if (expr.contains(QRegExp("[NESW]", Qt::CaseInsensitive))) {
        // \b(?:(?:([NS])(?:([+-]?)(?:(?:(\d*\.?\d*)[d°])?(?:(\d*\.?\d*)')?(?:(\d*\.?\d*)")?|(\d*))([EW]))?)|([EW]))\b
        QRegExp re(
            "\\b"                               // a word
            "(?:"
              "(?:"
                "([NS])"                        // expression starts with nord or south
                "(?:"
                  "([+-]?)"                     // sign
                  "(?:"
                    "(?:(\\d*\\.?\\d*)[d°])?"   // degrees with d
                    "(?:(\\d*\\.?\\d*)')?"      // minutes with '
                    "(?:(\\d*\\.?\\d*)\")?"     // seconds with "
                    "|"                         // or...
                    "(\\d*)"                    // degrees without d
                  ")"
                  "([EW])"                      // east or west
                ")?"
              ")"
              "|"                               // or...
              "([EW])"                          // only east (0d) or west (180d)
            ")"
            "\\b",
            Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            double angle = 0.0;
            QString sign;

            // "E" or "W":
            if (!re.cap(8).isEmpty()) {
                if (re.cap(8).toUpper()=="E") {
                    angle = 0.0;
                }
                else if (re.cap(8).toUpper()=="W") {
                    angle = 180.0;
                }
                else {
                    if (ok!=NULL) {
                        *ok = false;
                    }
                    lastError = "Invalid cardinal direction found (valid values are: N,E,S,W)";
                    return RNANDOUBLE;
                }
            }
            // "[NS]...[EW]":
            else {
                bool north = re.cap(1).toUpper()=="N";
                bool south = re.cap(1).toUpper()=="S";
                sign = re.cap(2);
                double degrees = 0.0;
                double minutes = 0.0;
                double seconds = 0.0;
                if (!re.cap(6).isEmpty()) {
                    degrees = re.cap(6).toDouble(ok);
                }
                else {
                    degrees = re.cap(3).toDouble(ok);
                    minutes = re.cap(4).toDouble(ok);
                    seconds = re.cap(5).toDouble(ok);
                }
                bool east = re.cap(7).toUpper()=="E";
                bool west = re.cap(7).toUpper()=="W";

                double base = (north ? 90.0 : 270.0);
                int dir = ((north && west) || (south && east) ? 1 : -1);
                angle = base + dir * (degrees + minutes/60.0 + seconds/3600.0);
            }

            expr.replace(
                re.cap(),
                QString("%1%2").arg(sign).arg(angle, 0, 'g', 16)
            );
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression 001 is: " << expr;

    // convert radiant angles (e.g. "1.2r") to degrees:
    {
        QRegExp re("((?:\\.\\d+)|(?:\\d+\\.\\d*)|(?:\\d+))r\\b", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString match = re.cap(1);
            //qDebug() << "RMath::eval: match 001a is: " << match;
            expr.replace(
                re,
                QString("%1").arg(rad2deg(match.toDouble(ok)), 0, 'g', 16)
            );
            //qDebug() << "RMath::eval: expression 001a is: " << expr;
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression 002 is: " << expr;

    // convert grad angles (e.g. "100g") to degrees:
    {
        QRegExp re("((?:\\.\\d+)|(?:\\d+\\.\\d*)|(?:\\d+))g\\b", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString match = re.cap(1);
            expr.replace(
                re,
                QString("%1").arg(gra2deg(match.toDouble(ok)), 0, 'g', 16)
            );
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression 003 is: " << expr;

    // convert explicitely indicated degree angles (e.g. "90d") to degrees:
    {
        QRegExp re("((?:\\.\\d+)|(?:\\d+\\.\\d*)|(?:\\d+))d\\b", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString match = re.cap(1);
            expr.replace(
                re,
                QString("%1").arg(match.toDouble(ok), 0, 'g', 16)
            );
        } while(idx!=-1);
    }

    // convert fraction notation to formula:
    // e.g. 7 3/32 to 7+3/32
    {
        QRegExp re("(\\d+)[ ]+(\\d+/\\d+)", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString numberString = re.cap(1);
            QString fractionString = re.cap(2);
            expr.replace(
                re,
                QString("%1+%2").arg(numberString).arg(fractionString)
            );
        } while(idx!=-1);
    }

    // convert foot indication to a factor of 12
    // e.g. "10'" to 10*12 and "10' " to 10*12+
    {
        QRegExp re("(\\d+)'[ ]*(\\d*)", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString feetString = re.cap(1);
            //QString spacesString = re.cap(2);
            QString inchString = re.cap(2);
            expr.replace(
                re,
                QString("%1*12%2%3")
                    .arg(feetString)
                    .arg(inchString.isEmpty() ? "" : "+")
                    .arg(inchString)
            );
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression is: " << expr;

    QScriptEngine e;


    if (mathExt.isNull()) {
        QString inputJs = "scripts/input.js";
        QFile file(inputJs);
        if (file.exists()) {
            if (file.open(QIODevice::ReadOnly|QIODevice::Text)) {
                mathExt = QString(file.readAll());
                file.close();
            }
        }
        else {
            qDebug() << "file not found: input.js";
        }
    }
    e.evaluate(mathExt);

    QScriptValue res = e.evaluate(expr);

    if (res.isError()) {
        if (ok!=NULL) {
            *ok = false;
        }
        lastError = res.toString();
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    if (!res.isNumber()) {
        if (ok != NULL) {
            *ok = false;
        }
        lastError = expr + " is not a number";
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    //qDebug() << "res.toNumber(): " << res.toNumber();
    //qDebug() << "fpclassify: " << std::fpclassify(res.toNumber());

    if (!isNormal(res.toNumber())) {
        if (ok != NULL) {
            *ok = false;
        }
        lastError = expr + " is not a normal number";
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    return res.toNumber();
}
Beispiel #19
0
/**
 * Evaluates the given mathematical expression and returns the result.
 * Angles may be expressed in degrees (default), rad (#r), gon (#g)
 * or as surveyors angles (N#d#'#"E).
 */
double RMath::eval(const QString& expression, bool* ok) {
    lastError = "";

    if (expression.isEmpty()) {
        if (ok!=NULL) {
            *ok = false;
        }
        lastError = "Expression is empty";
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    if (ok!=NULL) {
        *ok = true;
    }

    QString expr = expression;

    // 'correct' commas to points:
    if (RSettings::getNumberLocale().decimalPoint()==',') {
        expr.replace(',', '.');
    }

    if (expr.contains(',') || expr.contains(';')) {
        if (ok!=NULL) {
            *ok = false;
        }
        lastError = "Multiple expressions";
        return RNANDOUBLE;
    }

    int idx = -1;

    // convert surveyor type angles (e.g. N10d30'12.5"E) to degrees:
    if (expr.contains(QRegExp("[NESW]", Qt::CaseInsensitive))) {
        // \b(?:(?:([NS])(?:([+-]?)(?:(?:(\d*\.?\d*)[d°])?(?:(\d*\.?\d*)')?(?:(\d*\.?\d*)")?|(\d*))([EW]))?)|([EW]))\b
        QRegExp re(
            "\\b"                               // a word
            "(?:"
              "(?:"
                "([NS])"                        // expression starts with nord or south
                "(?:"
                  "([+-]?)"                     // sign
                  "(?:"
                    "(?:(\\d*\\.?\\d*)[d°])?"   // degrees with d
                    "(?:(\\d*\\.?\\d*)')?"      // minutes with '
                    "(?:(\\d*\\.?\\d*)\")?"     // seconds with "
                    "|"                         // or...
                    "(\\d*)"                    // degrees without d
                  ")"
                  "([EW])"                      // east or west
                ")?"
              ")"
              "|"                               // or...
              "([EW])"                          // only east (0d) or west (180d)
            ")"
            "\\b",
            Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            double angle = 0.0;
            QString sign;

            // "E" or "W":
            if (!re.cap(8).isEmpty()) {
                if (re.cap(8).toUpper()=="E") {
                    angle = 0.0;
                }
                else if (re.cap(8).toUpper()=="W") {
                    angle = 180.0;
                }
                else {
                    if (ok!=NULL) {
                        *ok = false;
                    }
                    lastError = "Invalid cardinal direction found (valid values are: N,E,S,W)";
                    return RNANDOUBLE;
                }
            }
            // "[NS]...[EW]":
            else {
                bool north = re.cap(1).toUpper()=="N";
                bool south = re.cap(1).toUpper()=="S";
                sign = re.cap(2);
                double degrees = 0.0;
                double minutes = 0.0;
                double seconds = 0.0;
                if (!re.cap(6).isEmpty()) {
                    degrees = re.cap(6).toDouble(ok);
                }
                else {
                    degrees = re.cap(3).toDouble(ok);
                    minutes = re.cap(4).toDouble(ok);
                    seconds = re.cap(5).toDouble(ok);
                }
                bool east = re.cap(7).toUpper()=="E";
                bool west = re.cap(7).toUpper()=="W";

                double base = (north ? 90.0 : 270.0);
                int dir = ((north && west) || (south && east) ? 1 : -1);
                angle = base + dir * (degrees + minutes/60.0 + seconds/3600.0);
            }

            expr.replace(
                re.cap(),
                QString("%1%2").arg(sign).arg(angle, 0, 'g', 16)
            );
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression 001 is: " << expr;

    // convert radiant angles (e.g. "1.2r") to degrees:
    {
        QRegExp re("((?:\\.\\d+)|(?:\\d+\\.\\d*)|(?:\\d+))r\\b", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString match = re.cap(1);
            //qDebug() << "RMath::eval: match 001a is: " << match;
            expr.replace(
                re,
                QString("%1").arg(rad2deg(match.toDouble(ok)), 0, 'g', 16)
            );
            //qDebug() << "RMath::eval: expression 001a is: " << expr;
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression 002 is: " << expr;

    // convert grad angles (e.g. "100g") to degrees:
    {
        QRegExp re("((?:\\.\\d+)|(?:\\d+\\.\\d*)|(?:\\d+))g\\b", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString match = re.cap(1);
            expr.replace(
                re,
                QString("%1").arg(gra2deg(match.toDouble(ok)), 0, 'g', 16)
            );
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression 003 is: " << expr;

    // convert explicitely indicated degree angles (e.g. "90d") to degrees:
    {
        QRegExp re("((?:\\.\\d+)|(?:\\d+\\.\\d*)|(?:\\d+))d\\b", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString match = re.cap(1);
            expr.replace(
                re,
                QString("%1").arg(match.toDouble(ok), 0, 'g', 16)
            );
        } while(idx!=-1);
    }

    // convert fraction notation to formula:
    // e.g. 7 3/32 to 7+3/32
    {
        QRegExp re("(\\d+)[ ]+(\\d+/\\d+)", Qt::CaseInsensitive, QRegExp::RegExp2);
        do {
            idx = re.indexIn(expr);
            if (idx==-1) {
                break;
            }
            QString numberString = re.cap(1);
            QString fractionString = re.cap(2);
            expr.replace(
                re,
                QString("%1+%2").arg(numberString).arg(fractionString)
            );
        } while(idx!=-1);
    }

    //qDebug() << "RMath::eval: expression is: " << expr;

    QScriptEngine e;

    // add common functions of Math to global scope for use in math input fields:
    QStringList mathProp;
    mathProp  << "PI" << "LN2" << "LN10" << "LOG2E" << "LOG10E" << "SQRT1_2" << "SQRT2"
          << "abs"
          //<< "cos" << "sin" << "tan"
          //<< "acos" << "asin" << "atan" << "atan2"
          << "ceil" << "floor"
          << "exp" << "log"
          << "max" << "min"
          << "pow" << "sqrt"
          << "random"
          << "round";
    for (int i=0; i<mathProp.length(); i++) {
        e.evaluate(mathProp[i] + " = Math." + mathProp[i]);
    }

    e.evaluate("rad2deg = function(a) { return a / (2.0 * Math.PI) * 360.0; }");
    e.evaluate("deg2rad = function(a) { return (a / 360.0) * (2.0 * Math.PI); }");

    e.evaluate("sin = function(v) { return Math.sin(deg2rad(v)); }");
    e.evaluate("cos = function(v) { return Math.cos(deg2rad(v)); }");
    e.evaluate("tan = function(v) { return Math.tan(deg2rad(v)); }");

    e.evaluate("asin = function(v) { return rad2deg(Math.asin(v)); }");
    e.evaluate("acos = function(v) { return rad2deg(Math.acos(v)); }");
    e.evaluate("atan = function(v) { return rad2deg(Math.atan(v)); }");
    //e.evaluate("atan2 = function(y,x) { return rad2deg(Math.atan2(y,x)); }");

    QScriptValue res = e.evaluate(expr);

    if (res.isError()) {
        if (ok!=NULL) {
            *ok = false;
        }
        lastError = res.toString();
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    if (!res.isNumber()) {
        if (ok != NULL) {
            *ok = false;
        }
        lastError = expr + " is not a number";
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    //qDebug() << "res.toNumber(): " << res.toNumber();
    //qDebug() << "fpclassify: " << std::fpclassify(res.toNumber());

    if (!isNormal(res.toNumber())) {
        if (ok != NULL) {
            *ok = false;
        }
        lastError = expr + " is not a normal number";
        //qDebug() << "RMath::evel: error: " << lastError;
        return RNANDOUBLE;
    }

    return res.toNumber();
}
IRequestStatus IRequestParser::consume(IRequest& request, char input) {
	switch (state) {
	case IParserState::IREQUEST_TYPE_START:
		if (isNormal(input)) {
			state = IParserState::IREQUEST_TYPE;
			request.getType() += input;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::IREQUEST_TYPE:
		if (input == FormatConst::COMP_SEPERATOR) {
			state = IParserState::IREQUEST_ID_START;
			return IRequestStatus::INDETERMINATE;
		} else if (isNormal(input)) {
			request.getType() += input;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::IREQUEST_ID_START:
		if (isNormal(input)) {
			state = IParserState::IREQUEST_ID;
			request.getId() += input;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::IREQUEST_ID:
		if (input == FormatConst::COMP_SEPERATOR) {
			state = IParserState::AUTO_VERSION_A;
			return IRequestStatus::INDETERMINATE;
		} else if (isNormal(input)) {
			request.getId() += input;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::AUTO_VERSION_A:
		if (input == 'A') {
			state = IParserState::AUTO_VERSION_U;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::AUTO_VERSION_U:
		if (input == 'U') {
			state = IParserState::AUTO_VERSION_T;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::AUTO_VERSION_T:
		if (input == 'T') {
			state = IParserState::AUTO_VERSION_O;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::AUTO_VERSION_O:
		if (input == 'O') {
			state = IParserState::AUTO_VERSION_SLASH;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::AUTO_VERSION_SLASH:
		if (input == '/') {
			state = IParserState::VERSION_MAJOR_START;
			request.setAutoVersionMajor(0);
			request.setAutoVersionMinor(0);
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::VERSION_MAJOR_START:
		if (isDigit(input)) {
			request.setAutoVersionMajor(
					request.getAutoVersionMajor() * 10 + input - '0');
			state = IParserState::VERSION_MAJOR;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::VERSION_MAJOR:
		if (input == '.') {
			state = IParserState::VERSION_NINOR_START;
			return IRequestStatus::INDETERMINATE;
		} else if (isDigit(input)) {
			request.setAutoVersionMajor(
					request.getAutoVersionMajor() * 10 + input - '0');
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::VERSION_NINOR_START:
		if (isDigit(input)) {
			request.setAutoVersionMinor(
					request.getAutoVersionMinor() * 10 + input - '0');
			state = IParserState::VERSION_NINOR;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::VERSION_NINOR:
		if (input == '\r') {
			state = IParserState::EXPECTING_NEWLINE_1;
			return IRequestStatus::INDETERMINATE;
		} else if (isDigit(input)) {
			request.setAutoVersionMinor(
					request.getAutoVersionMinor() * 10 + input - '0');
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::EXPECTING_NEWLINE_1:
		if (input == '\n') {
			state = IParserState::PARAM_START;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::PARAM_START:
		if (input == '\r') {
			state = IParserState::EXPECTING_NEWLINE_END;
			return IRequestStatus::INDETERMINATE;
		} else if (isDigit(input)) {
			request.getParams().push_back(input - '0');
			state = IParserState::PARAM_VALUE;
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::PARAM_VALUE:
		if (input == FormatConst::COMP_SUB_SEPERATOR) {
			state = IParserState::PARAM_START;
			return IRequestStatus::INDETERMINATE;
		} else if (input == '\r') {
			state = IParserState::EXPECTING_NEWLINE_END;
			return IRequestStatus::INDETERMINATE;
		} else if (isDigit(input)) {
			request.getParams().back() = request.getParams().back() * 10 + input
					- '0';
			return IRequestStatus::INDETERMINATE;
		} else {
			return IRequestStatus::BAD;
		}

	case IParserState::EXPECTING_NEWLINE_END:
		return (input == '\n') ? IRequestStatus::GOOD : IRequestStatus::BAD;

	default:
		return IRequestStatus::BAD;

	}
}
Beispiel #21
0
/*!
    \fn QMediaTimeInterval::contains(qint64 time) const

    Returns true if the time interval contains the specified \a time.
    That is, start() <= time <= end().
    \since 1.0
*/
bool QMediaTimeInterval::contains(qint64 time) const
{
    return isNormal() ? (s <= time && time <= e)
        : (e <= time && time <= s);
}