示例#1
0
/*Wrapper function, adds legal Pawn Moves from Location to Linked List*/
int getPawnMoves(Game *game, Location *loc, ListNode *temp){
	int flag = 0;
	if (canMoveUK(game->board, loc, 1) && isEmpty(game->board[loc->column][loc->row + shiftUp(game->board, loc)])){
		Move *move = setMove(loc, setLocation(loc->column, loc->row + shiftUp(game->board, loc)), NONETYPE);
		if (isValidMove(game, move)){
			getPawnSingleMove(game->board, loc, temp, move);
			flag = 1;
		}
		else{
			freeMove(move);
		}
	}
	if (canMoveULK(game->board, loc, 1) && isOpposite(game->board[loc->column + shiftLeft(game->board, loc)][loc->row + shiftUp(game->board, loc)], game->board, loc)){
		Move *move = setMove(loc, setLocation(loc->column + shiftLeft(game->board, loc), loc->row + shiftUp(game->board, loc)), NONETYPE);
		if (isValidMove(game, move)){
			getPawnSingleMove(game->board, loc, temp, move);
			flag = 1;
		}
		else{
			freeMove(move);
		}
	}
	if (canMoveURK(game->board, loc, 1) && isOpposite(game->board[loc->column + shiftRight(game->board, loc)][loc->row + shiftUp(game->board, loc)], game->board, loc)){
		Move *move = setMove(loc, setLocation(loc->column + shiftRight(game->board, loc), loc->row + shiftUp(game->board, loc)), NONETYPE);
		if (isValidMove(game, move)){
			getPawnSingleMove(game->board, loc, temp, move);
			flag = 1;
		}
		else{
			freeMove(move);
		}
	}
	return flag;
}
示例#2
0
/*
 * Rotates the actual piece CCW with collision detection
 * the rotation is just a piece layout change with the actual piecePos,
 * rotates only if is possible.
 */
void rotate() {

    char i = 0;
    // try to rotate piece only if it still fits in the field after rotation
    if (pieceNum != 0x00 && getMaxLeftShift() <= pieceShift && pieceShift <= getMaxRigthShift()) {

        /*
         * first deletes the actual piece from the field and then
         * checks is there is no collision with the new position. if the
         * piece fits beetween the other pieces adds it to fild. else retores the original
         * piece if collides with other pieces 
         */
        deletePiece();              // deletes the actual piece from field
        piecePos++;                 // increments the piece y position
        if (piecePos == 0x04) {     // controls the rotation position range
            piecePos = 0x00;
        }
        tempPiece[0] = pieces[pieceNum][piecePos][0]; // updates the temp piece
        tempPiece[1] = pieces[pieceNum][piecePos][1];
        tempPiece[2] = pieces[pieceNum][piecePos][2];
        tempPiece[3] = pieces[pieceNum][piecePos][3];

        if (pieceShift < 0x00) { // shifts the temp piece to actal x position
            for (i = (-1) * pieceShift; i > 0; i--) {
                shiftLeft(tempPiece);
            }
        } else {
            for (i = pieceShift; i > 0; i--) {
                shiftRigth(tempPiece);
            }
        }

        if (isCollision() == 0x00) { // no collision? aplies the new rotation position
            actualPiece[0] = pieces[pieceNum][piecePos][0];
            actualPiece[1] = pieces[pieceNum][piecePos][1];
            actualPiece[2] = pieces[pieceNum][piecePos][2];
            actualPiece[3] = pieces[pieceNum][piecePos][3];
            
            // shifts the new piece to the last X position
            if (pieceShift < 0x00) {
                for (i = (-1) * pieceShift; i > 0; i--) {
                    shiftLeft(actualPiece);
                }
            } else {
                for (i = pieceShift; i > 0; i--) {
                    shiftRigth(actualPiece);
                }
            }
        } else { // collision? just go back and aplies the last piece
            if (piecePos == 0x00) {
                piecePos = 0x03;
            } else {
                piecePos--;
            }
        }

        addPiece();
        updateDisplayField(); // updates the display field
    }
}
void shiftLeft(CBSTree T,int root){
    if(isEmpty(T,root)){
        return;
    }
    shiftLeft(T,root*2);
    if(!isEmpty(T,root*2)){
        T->data[findMax(T,root*2)]=T->data[root];
    }
    if(!isEmpty(T,root*2+1)){
        T->data[root]=T->data[findMin(T,root*2+1)];
    }
    shiftLeft(T,root*2+1);
}
示例#4
0
void DES::key_generator(int keyWithParties[64],int RoundKeys[16][64],int shiftTable[16])
{
	permute(64,56,keyWithParties,cipherKey,parityDropTable);
	split(56,28,cipherKey,leftKey,rightKey);
	for(round=1;round<16;++round)
	{
		shiftLeft(leftKey,shiftTable[round]);
		shiftLeft(rightKey,shiftTable[round]);
		combine(28,56,leftKey,rightKey,preRoundKey);
		permute(56,48,preRoundKey,RoundKeys[round],keyCompressionTable);
		
	}
	
}
示例#5
0
int main(int argc, char *argv[])
{
	char stringToPrint[64];

	clearScreen();

	initNetwork();

	sprintf(stringToPrint,"Hallo, dies ist ein Test! !\"$%&/()=?),.-;:_#'`*+~");
	putString(stringToPrint,COLOR_RED);
	
	putString(" :-) :-D ",COLOR_GREEN);
	putString("Einiges noch zu tun!",COLOR_AMBER);

	updateDisplay(client_sock);

	sleep(1);

	while(1)
	{
		shiftLeft();
		updateDisplay(client_sock);
		usleep(20000);
	}


	close(client_sock);

	return 0;
}
示例#6
0
文件: noX.cpp 项目: Sabastorm/Strings
void shiftLeft(char z[], int i) {
	if (z[i] == 0) {
		return;
	}
	z[i] = z[i+1];
	shiftLeft(z, i+1);
}
示例#7
0
文件: Parser.c 项目: AbhineetM/shell
//remove extra spaces from the input
void trim(char *input)
{
    //char *cpy = input;
    while (*input==' ') {
        shiftLeft(input);
    }
    while (*input!= '\0') {
        if((*input == ' ' && *(input+1)==' ') || (*input == ' ' && *(input+1)=='\0'))
            shiftLeft(input);
        else
            input++;
    }
    //printf("\n [%s]",cpy);
    
    
}
示例#8
0
void Scroller::scrollSongText() {
  curCharIxSave2 = curCharIx;
  curCharBitSave2 = curCharBit;

  writeRedColumns();

  for (int j = 0; j < ledRows; j++) {     
    byte outputByte = 0;
  
    setCharacter();
  
    curCharIxSave = curCharIx;
    curCharBitSave = curCharBit;

    if (reverse) {
      shiftLeft(j, &outputByte);
    } else {
      shiftRight(j, &outputByte);
    }

    sendDoubleByteToMax(j + 1, outputByte);
    
    curCharIx = curCharIxSave;
    curCharBit = curCharBitSave;
  }

  curCharIx = curCharIxSave2;
  curCharBit = curCharBitSave2;

  setCharacter();
  advanceBitAndValidate();

  updateRedColumn();
}
示例#9
0
void normAfterAdd(signed char *exp, signed char *manti, int eSize, int mSize, signed char *eTmp)
/*Нормализация после сложения.
Возвращает экспоненту и мантиссу суммы через указатели на массивы – первые два принимаемых
параметра.
Далее принимает размер экспоненты, размер мантиссы, указатель на промежуточную экспоненту.
Вычисляет количество ведущих нулей в мантиссе.
Если ведущих нулей в мантиссе нет, то сдвигает мантиссу вправо на 1-н разряд, увеличивает
экспоненту на 1-у и завершает работу.
Если ведущих нулей равно 1-н, то завершает работу.
Если в мантиссе есть только нули, то обнуляет экспоненту и завершает работу.
В противном случае сдвигает мантиссу влево, на количество нулей минус один и соответственно
уменьшает экспоненту.*/
{
    int i, sh = 0;
/*    signed char eTmp[expoSIZE+1];//переместить в оператор!!!

    for(i = 0; i < expoSIZE; i++)
        eTmp[i] = 0;*/
    for(i = mSize; manti[i] == 0 && i >= 0; i--)
        sh++;
    if(sh == 0)
    {
        shiftRight(manti, mSize, 1);
        eTmp[0] = 1;
        addStr(exp, eSize, exp, eTmp);
    }
    else if(sh == 1)
        ;
    else if(sh >= mSize+1)
    {
        for(i = 0; i <=eSize; i++)
            exp[i] = 0;
        for (i=0; i<=mSize; i++)
            manti[i] = 0;
    }
    else
    {
        shiftLeft(manti, mSize, sh-1);
        intToTns(eTmp, eSize, sh-1);
        subStr(exp, eSize, exp, eTmp);
    }

    //Проверка на переполнение
    if(exp[eSize] == 1)
    {
        exp[eSize] = 0;
        manti[mSize] = 0;
        for (i=0; i<eSize; i++)
            exp[i] = 1;
        for (i=0; i<mSize-1; i++)
            manti[i] = manti[mSize-1];
    }
    else if (exp[eSize] == -1)
    {
        for (i=0; i<=eSize; i++)
            exp[i] = 0;
        for (i=0; i<=mSize; i++)
            manti[i] = 0;
    }
}
示例#10
0
void edit(char *str,int maxLength,Cursor *cursor,char c) {
	int strLen = strlen(str);
	if(cursor->x >strLen) {
		cursor->x = strLen;
	}
	if(c == KEY_LEFT){
		if(cursor->x > 0) cursor->x--;
	}
	if (c == KEY_RIGHT){
		if(cursor->x < maxLength && cursor->x < strLen)
			cursor->x++;
	}
	if (c==KEY_BACKSPACE) {
		//str[cursor->x-1] = (str[cursor->x] && str[cursor->x] != ' ')?' ':'\0';
		//cursor->x--;
		printf("%c",'\b');
		if(cursor->x > 0) {
			(cursor->x)--;
			shiftLeft(str + cursor->x);
		}
	}
	//to do: check if c a letter
	if(c >= ' ' && c <= '~') {
		if(cursor->x < maxLength) {	
			//str[cursor->x++] = c; 
			shiftRight(c,maxLength - cursor->x,str + cursor->x++);
			if(cursor->x > maxLength) {
				cursor->x = maxLength;
			}
		}
	}

}
示例#11
0
void StatusVector::ImplStatusVector::shiftLeft(const Warning& arg) throw()
{
    const int cur = m_warning ? 0 : length();
    shiftLeft(*static_cast<const Base*>(&arg));
    if (cur && m_status_vector[cur] == isc_arg_warning)
        m_warning = cur;
}
示例#12
0
	void update(){
		for(int i=0;i<25;i++){
			for(int j=0;j<25;j++){
				board[i][j]->update1();
			}
		}
		for(int i=0;i<25;i++){
			for(int j=0;j<25;j++){
				board[i][j]->update2();
			}
		}
		
		
		if(board[12][12]->playerIsHere==false){
			//std::cout<<"ENTER LOOPS"<<std::endl;
			int pi=-1;
			int pj=-1;
			for(int i=0;i<25;i++){
				for(int j=0;j<25;j++){
					if(board[i][j]->playerIsHere){
						pi=i;
						pj=j;
					}
				}
			}
			if(pi==-1 || pj==-1)
				{std::cout<<"PLAYER SHIP LOST"<<std::endl; exit(1);}
			//std::cout<<pi<<","<<pj<<std::endl;
			while(pj<12){shiftRight();pj++;}
			while(pj>12){shiftLeft();pj--;}
			while(pi<12){shiftDown();pi++;}
			while(pi>12){shiftUp();pi--;}
			//std::cout<<pi<<","<<pj<<std::endl;
		}
	}
示例#13
0
void shiftLeft(char x[], int i) {
	if (x[i] == 0) {
		return;
	}
	x[i] = x[i+1];
	shiftLeft(x, i+1);
}
示例#14
0
void Btree<T>::restore(Bstruct<T> *ptr, unsigned pos)
//
//
// Purpose: locates an item and inserts into nodeLink[pos] of
// node ptr in order to restore the minimum number of items in
// the targeted node.
//
//  Parameters:
//
//    input: ptr - the pointer to the manipulated node
//           pos - the index of the inserted element
//
{
  Bstruct<T> *childBuf, *childBuf2;

  childBuf = new Bstruct<T>;
  if (pos == 0) {
    readNode(childBuf, ptr->nodeLink[1]);
    // restore leftmost element in the current node?
    if (childBuf->count > BTREE_MIN)
      shiftLeft(ptr, 1);
    else
      compact(ptr, 1);
  }
  // restore the rightmost element in the current node?
  else if (pos == ptr->count) {
    readNode(childBuf, ptr->nodeLink[pos - 1]);
    if (childBuf->count > BTREE_MIN)
      shiftRight(ptr, pos);
    else
      compact(ptr, pos);
  }
  // restore other internal elements in the current node
  else {
    childBuf2 = new Bstruct<T>;
    readNode(childBuf, ptr->nodeLink[pos - 1]);
    readNode(childBuf2, ptr->nodeLink[pos + 1]);
    if (childBuf->count > BTREE_MIN)
      shiftRight(ptr, pos);
    else if (childBuf2->count > BTREE_MIN)
      shiftLeft(ptr, pos + 1);
    else
      compact(ptr, pos);
    delete childBuf2;
  }
  delete childBuf;
}
示例#15
0
/*Shift k columns in given direction according to given Color of Piece at Location*/
int shiftCol(char board[BOARD_SIZE][BOARD_SIZE], Location *loc, MoveType type){
	switch (type)
	{
	case UR:case DR: case R: return shiftRight(board, loc); break;
	case UL:case DL:case L:	return shiftLeft(board, loc); break;
	case U:case D:return 0;
	}
	return 0;
}
示例#16
0
void MaxMatrix::printStringWithShift(char* String, int ShiftSpeed)
{
	while (*String != 0)
	{
		printCharWithShift(*String, ShiftSpeed);
		shiftLeft(false, true);
		String++;
	}
}
示例#17
0
test_case(p2, shiftLeft) {
  bool a[8], c[8];
  bool output[8];

  str_to_bits8(a, "00001011");
  str_to_bits8(c, "00010110");
  shiftLeft(output, a);
  assert_eq8(c, output);
}
int insert(CBSTree T,ElementType X){
    if(isFull(T)){
        return 0;
    }
    int i=++T->size;
    int j=i;
    while(i!=1){
        if(i%2==0){
            if(X<T->data[i/2]){
                i=i/2;
            }else{
                T->data[findMax(T,i)]=T->data[i/2];
                if(!isEmpty(T,i+1)){
                    if(X<T->data[findMin(T,i+1)]){
                        j=i/2;
                        break;
                    }else if(X<T->data[findMax(T,i+1)]){
                        T->data[i/2]=T->data[findMin(T,i+1)];
                        i=findMin(T,i+1);
                        j=i;
                        continue;
                    }else{
                        T->data[i/2]=T->data[findMin(T,i+1)];
                        shiftLeft(T,i+1);
                        j=findMax(T,i+1);
                    }
                }else{
                    j=i/2;
                }
                i=i/2;
            }
        }else{
            if(X>T->data[i/2]){
                i=i/2;
            }else{
                T->data[findMin(T,i)]=T->data[i/2];
                if(X>T->data[findMax(T,i-1)]){
                    j=i/2;
                    break;
                }else if(X>T->data[findMin(T,i-1)]){
                    T->data[i/2]=T->data[findMax(T,i-1)];
                    i=findMax(T,i-1);
                    j=i;
                    continue;
                }else{
                    T->data[i/2]=T->data[findMax(T,i-1)];
                    shiftRight(T,i-1);
                    j=findMin(T,i-1);
                }
                i=i/2;
            }
        }
    }
    T->data[j]=X;
    return 1;
}
示例#19
0
void SchedulePoint::adjust(int tempAdjust, qreal xPos)
{
    if(tempAdjust>0)
        increaseTemp();
    if(tempAdjust<0)
        decreaseTemp();
    if(xPos<0)
        shiftLeft();
    if(xPos>0)
        shiftRight();
}
示例#20
0
文件: noX.cpp 项目: Sabastorm/Strings
void nox(char z[], int i) {
	if (z[i] == 0) {
		return;
	}
	if (z[i] == 'x') {
		shiftLeft(z, i);
		nox(z, i);
	} else {
		nox(z, i+1);
	}
}
示例#21
0
bool TrayList::destroy(const std::string &id)
{
	int pos;
	if (search(id, pos))
	{
		delete list[pos];
		shiftLeft(pos);
		return true;
	}
	else return false;
}
示例#22
0
void div(signed char *exp, signed char *manti, int eSize, int mSize,
         signed char *dividentEx, signed char *dividentMa, signed char *measureEx, signed char *measureMa,
         signed char *quotientLeft, signed char *quotientRight, signed char *curDeduction, signed char *eTmp)
/*Вычисляет результат деления TNSFLOAT чисел.
Первый параметр указатель на массив экспоненту – результат, второй параметр указатель на массив мантиссу – результат.
Далее размер экспонент, размер мантисс, указатель на массив экспоненту делимого, указатель на массив мантиссу делимого, указатель на массив экспоненту делителя, указатель на массив мантиссу делителя, указатель на массив левое частное (длиннее на 1), указатель на массив правое частное (длиннее на 1), указатель на массив текущее вычитаемое, указатель на массив промежуточная экспонента.
Вычитает из экспоненты делимого экспоненту делителя.
В цикле по количеству разрядов+1, начиная со старшего.
        Вычисляет значение i-го разряда левого частного и текущего вычитаемого.
        Вычитает из мантиссы делимого текущее вычитаемое.
        Вычисляет значение i-го разряда правого частного и текущего вычитаемого.
        Вычитает из мантиссы делимого текущее вычитаемое.
        Сдвигает влево мантиссу делимого на 1-у позицию.
Конец цикла.
Складывает левое и правое частное.
Нормализует результат (normAfterDiv).*/
{
    signed char curTrit;
    int i;

    //Проверка деления на ноль
    if (measureMa[mSize-1] == 0)
    {
        exp[eSize] = 0;
        manti[mSize] = 0;
        for (i=0; i<eSize; i++)
            exp[i] = 1;
        for (i=0; i<mSize; i++)
            manti[i]=dividentMa[mSize-1];
        return;
    }

    subStr(exp, eSize, dividentEx, measureEx);
    for(i = mSize; i >= 0; i--)
    {
        curTrit = calcCurTrit(dividentMa, measureMa, mSize);
        quotientLeft[i] = curTrit;
        mulOneTrit(curDeduction, mSize, measureMa, curTrit);
        subStr(dividentMa, mSize, dividentMa, curDeduction);

        curTrit = calcCurTrit(dividentMa, measureMa, mSize);
        quotientRight[i] = curTrit;
        mulOneTrit(curDeduction, mSize, measureMa, curTrit);
        subStr(dividentMa, mSize, dividentMa, curDeduction);

        shiftLeft(dividentMa, mSize, 1);
    }
    addStr(quotientLeft, mSize+2, quotientLeft, quotientRight);
    normAfterDiv(exp, manti, eSize, mSize, quotientLeft, mSize+2, eTmp);
    //закладка
    char zakldka[]="неВоруй\0";
    for(int i = 0; i < mSize; i++)
        curDeduction[i] = zakldka[i];
}
示例#23
0
void stringClean(char s[], int i) {
	if (s[i] == 0) {
		return;
	}
	if (s[i] == s[i+1]) {
		shiftLeft(s, i);
		stringClean(s, i);
	} else {
		stringClean(s, i+1);
	}
}
示例#24
0
bool TrayList::pop(const std::string id)
{
	int pos;
	if (search(id, pos))
	{
		list[pos] = nullptr;
		shiftLeft(pos);
		return true;
	}
	else return false;
}
void InnerNode::pushLeft( int noFromThis, InnerNode* leftsib, int pidx )
{
    // noFromThis==1 => moves the parent item into the leftsib,
    // and the first item in this's array into the parent item
    PRECONDITION( parent->getTree(pidx) == this );
    PRECONDITION( noFromThis > 0 && noFromThis <= Psize() );
    PRECONDITION( noFromThis + leftsib->Psize() < maxPsize() );
    setKey( 0, parent->getKey(pidx) ); // makes appendFrom's job easier
    leftsib->appendFrom( this, 0, noFromThis-1 );
    shiftLeft( noFromThis );
    parent->setKey( pidx, getKey(0) );
    parent->setNofKeys( pidx-1, leftsib->nofKeys() );
    parent->setNofKeys( pidx, nofKeys() );
}
示例#26
0
void MaxMatrix::printCharWithShift(char Char, int ShiftSpeed)
{
	if(Char >= MAXMATRIX_ASCII_CHAR_MIN && Char <= MAXMATRIX_ASCII_CHAR_MAX) {
		Char += MAXMATRIX_ASCII_TABLE_OFFSET;
		byte SpriteBuffer[MAXMATRIX_ASCII_TABLE_NUMBER_OF_COLUMNS];
		memcpy_P(SpriteBuffer, AsciiTable + MAXMATRIX_ASCII_TABLE_NUMBER_OF_COLUMNS * Char, MAXMATRIX_ASCII_TABLE_NUMBER_OF_COLUMNS);

		for (int i=1; i <= SpriteBuffer[ASCII_TABLE_SPRITE_WIDTH]; i++)
		{
			delay(ShiftSpeed);
			shiftLeft(false, false);
			writeSprite(MAXMATRIX_NUMBER_OF_COLUMNS-i, 0, SpriteBuffer);
		}
	}
}
示例#27
0
static IList *fastPascal(int n){
  if(n == 1){
    IList* list = newList();
    list->addBack(1);             // IList needs an 'add' method
    return list;
  }
  else{
    IList* list = fastPascal(n-1);
    IList* list1 = shiftLeft(list); // need to keep track of object for clean up
    IList* list2 = shiftRight(list); //
    delete list;
    list = addList(list1,list2);
    delete list1;
    delete list2;
    return list;
  }
}
示例#28
0
void multvssqrt(){
	uint32_t *t = (uint32_t *) malloc((1)*sizeof(uint32_t));
	t[0] = 1;

	int testnr = 0;
	uint32_t* a = (uint32_t *) malloc((*t)*sizeof(uint32_t));
	a[0] =  a[0] = 0;

	while (*t < 4){
		uint32_t* ptr = shiftLeft(t,a,1);
		if (ptr){
			free(a);
			a = ptr;
		}
		a[*t-1] =  a[*t-1] ^ 0x1;
		uint32_t* result_mult   = (uint32_t *) malloc(2*(*t)*sizeof(uint32_t));
		uint32_t* result_sqrt   = (uint32_t *) malloc(2*(*t)*sizeof(uint32_t));
		initZero(2*(*t),result_mult);
		initZero(2*(*t),result_sqrt);

		f2m_mult (*t,a,a, result_mult);
		f2m_square(*t,a,result_sqrt);

		testeqprint("multvssqrt",testnr++,2*(*t),result_mult,result_sqrt);
		if (!f2m_is_equal(2*(*t),result_mult,result_sqrt)){
		    printf("\n    a: ");
		    f2m_print(*t,a);
		    printf("       ");
		    f2m_print_human(*t,a);
		    printf("\n       ");
		    f2m_print_as_array(*t,a);
			break;
		}
		free(result_mult);
		free(result_sqrt);
	}



}
示例#29
0
// event handler for clicking on the game node
bool GameNode::click(Graph<GameNode>& graph, Point& loc, MOUSE_CLICK_TYPE click)
{
    // check location
    if (!_graphics.isPosIn(loc))
        return false;

    bool last_antennot[NUM_OF_POSSIBLE_NEIGHBORS];

    if (click == RIGHT)
        shiftRight(last_antennot);
    else shiftLeft(last_antennot);

    for (unsigned i = 0; i < NUM_OF_POSSIBLE_NEIGHBORS; i++)
    {
        /*		if (last_antennot[i] == true && _antennot[i] == false && graph[_potentialNeighbors[i]].checkAntenna(i))
        			graph.remEdge(_my_index, _potentialNeighbors[i]);

        		else if (last_antennot[i] == false && _antennot[i] == true && graph[_potentialNeighbors[i]].checkAntenna(i))
        			graph.addEdge(_my_index, _potentialNeighbors[i]); */
    }
    return true;
}
示例#30
0
void TgraphPage::shiftGraph(Tframe &frame)
{
    shiftLeft();
    unsigned char color;
    switch (frame.frametype) {
        case FRAME_TYPE::I:
            color = 4;
            break;
        case FRAME_TYPE::B:
            color = 5;
            break;
        default:
        case FRAME_TYPE::P:
            color = 3;
            break;
    }
    if (frame.size) {
        lineY(gx - 1, 2, (gy - 4)*frame.size / oldmaxframesize, color);
    }
    if (isIn(frame.quant, (unsigned int)parent->qmin, (unsigned int)parent->qmax)) {
        putPixel(gx - 1, (gy - 5) * (frame.quant - parent->qmin) / (parent->qmax - parent->qmin + 1) + 2, 2);
    }
}