Beispiel #1
0
// -------------------------------------------------------------
void Graph::drawArrowSymbols(int x0i, int y0i, QPainter *p) const
{
  int x0, y0, x1, x2, y1, y2;
  float DX_, DY_;
  auto Scale = 1; /// \todo p->Scale;
  auto Painter = p;
  auto pp = begin();
  if(!pp->isPt())
    pp++;

  /// \todo DX DY
  DX_ = /*p->DX*/ + float(x0i)*Scale;
  DY_ = /*p->DY*/ + float(y0i)*Scale;
  y2 = DY_;

  while(!pp->isGraphEnd()) {
    if(pp->isPt()) {
      x0 = DX_ + pp->getScrX()*Scale;
      x1 = x0-4.0*Scale;
      x2 = x0+4.0*Scale;
      y0 = DY_ - (pp++)->getScrY()*Scale;
      y1 = y0+7.0*Scale;
      Painter->drawLine(QLineF(x0, y0, x0, y2));
      Painter->drawLine(QLineF(x1, y1, x0, y0));
      Painter->drawLine(QLineF(x2, y1, x0, y0));
    }
    else  pp++;
  }
}
Beispiel #2
0
// -------------------------------------------------------------
void Graph::drawStarSymbols(int x0i, int y0i, QPainter *p) const
{
  float x3, x0, y0, x1, x2, y1, y2;
  float z, DX_, DY_;
  auto Scale = 1; /// \todo p->Scale;
  auto Painter = p;
  auto pp = begin();
  if(!pp->isPt())
    pp++;

  /// \todo DX DY
  DX_ = /*p->DX*/ + float(x0i)*Scale;
  DY_ = /*p->DY*/ + float(y0i)*Scale;

  while(!pp->isGraphEnd()) {
    if(pp->isPt()) {
      z = DX_ + pp->getScrX()*Scale;
      x0 = z-5.0*Scale;
      x3 = z+5.0*Scale;
      x1 = z-4.0*Scale;
      x2 = z+4.0*Scale;
      z = DY_ - (pp++)->getScrY()*Scale;
      y0 = z;
      y1 = z-4.0*Scale;
      y2 = z+4.0*Scale;
      Painter->drawLine(QLineF(x0, y0, x3, y0)); // horizontal line
      Painter->drawLine(QLineF(x1, y2, x2, y1)); // upper left to lower right
      Painter->drawLine(QLineF(x2, y2, x1, y1)); // upper right to lower left
    }
    else  pp++;
  }
}
Beispiel #3
0
int isPt(struct a_NODE *node)
{
	if(!node)
		return FALSE;
	if(node->token == '&')
		return TRUE;
	if(node->token == TK_IDENTIFIER && node->node->type == ID_POINTER)
		return TRUE;

	if(node->token == '+' && isPt(node->sons[0]) && isInt(node->sons[1]))
		return TRUE;
	if(node->token == '+' && isPt(node->sons[1]) && isInt(node->sons[0]))
		return TRUE;
	if(isPt(node->sons[0]))
		return TRUE;
	return FALSE;
}
Beispiel #4
0
// -------------------------------------------------------------
//draws the vectors of phasor diagram
void Graph::drawvect(int x0, int y0, QPainter *p) const
{
  float DX_, DY_;
  double beta, phi;
  QPolygon Points;
  auto Painter = p;
  QPen pen = Painter->pen();
  auto Scale = 1; /// \todo p->Scale;

  Painter->setPen(pen);
  QPainterPath path;
  auto pp = begin();
  if(!pp->isPt())
    pp++;

  /// \todo DX DY
  DX_ = /*p->DX*/ + float(x0)*Scale;
  DY_ = /*p->DY*/ + float(y0)*Scale;

  float x1, y1,x2,y2,x3,y3,x4,y4;

  while(!pp->isGraphEnd())
  {
    if(!pp->isBranchEnd())//draws the main line
    {
      x1=DX_ + pp->getScrX()*Scale;
      y1=DY_ - (pp++)->getScrY()*Scale;
      x2=DX_ + pp->getScrX()*Scale;
      y2=DY_ - (pp++)->getScrY()*Scale;
      Painter->drawLine(QLineF(x1, y1, x2, y2));
    }
    else
    {
      pp++;
      continue;
    }

      phi = atan2(double(y2-y1), double(x2-x1));
      beta = atan2(double(4), double(10));
      double alfa = beta+phi;
      double Length = sqrt(4*4+10*10);
      x3 = x2-int(Length*cos(alfa));
      y3 = y2-int(Length*sin(alfa));
      Painter->drawLine(QLineF(x3, y3, x2, y2));
      pp++;

      alfa = phi-beta;
      x4 = x2-int(Length*cos(alfa));
      y4 = y2-int(Length*sin(alfa));

      Painter->drawLine(QLineF(x4, y4, x2, y2));

  }

}
Beispiel #5
0
// -------------------------------------------------------------
void Graph::drawCircleSymbols(int x0i, int y0i, ViewPainter *p) const
{
  float x0, y0;
  float z, DX_, DY_;
  auto Scale = p->Scale;
  auto Painter = p->Painter;
  auto pp = begin();
  if(!pp->isPt())
    pp++;

  z = 8.0*Scale;
  DX_ = p->DX + float(x0i)*Scale;
  DY_ = p->DY + float(y0i)*Scale;

  while(!pp->isGraphEnd()) {
    if(pp->isPt()) {
      x0 = DX_ + (pp->getScrX()-4.0)*Scale;
      y0 = DY_ - ((pp++)->getScrY()+4.0)*Scale;
      Painter->drawEllipse(QRectF(x0, y0, z, z));
    }
    else  pp++;
  }
}
Beispiel #6
0
void verify(struct a_NODE * node_p)
{
	struct a_NODE * aux;
	if(node_p)
	{
	struct a_NODE node_ = *node_p;

	switch(node_.token)
	{
		// TOKENS
		case LIT_TRUE:

			break;
		case LIT_FALSE:

			break;
		case LIT_INTEGER:

			break;
		case TK_IDENTIFIER:
			break;
		case LIT_CHAR:

			break;
		case LIT_STRING:

			break;
		// LIST
		case LIST:
			verify((node_.sons[0]));
			verify((node_.sons[1]));
			break;
		// TYPE
		case KW_BOOL:
			break;
		case KW_WORD:
			break;
		case KW_BYTE:
			break;
		// FUNC_DECLARATION
		case ARGUMENTS:
			verify((node_.sons[0]));
			verify((node_.sons[1]));
			if((node_.sons[2])!=NULL)
			{
				verify((node_.sons[2]));
			}
			break;
		case D_NODE: // GAMBIARRATION
			verify((node_.sons[0]));
			verify((node_.sons[1]));
			break;
		case FUNC_DECLARATION:
			/*node_.sons[1]->node->type = ID_FUNC;
			if(node_.sons[0]->token == KW_BOOL)
				node_.sons[1]->node->dataType = ID_BOOL;
			else if(node_.sons[0]->token == KW_WORD)
				node_.sons[1]->node->dataType = ID_WORD;
			else if(node_.sons[0]->token == KW_BYTE)
				node_.sons[1]->node->dataType = ID_BYTE;

			currentFunction = node_.sons[1]->node;

			aux = node_.sons[2];
			for(aux = node_.sons[2] ; aux != NULL ; aux = aux->sons[2])
			{
				aux->sons[1]->node->type = ID_SCALAR;
				if(aux->sons[0]->token == KW_BOOL)
				{
					aux->sons[1]->node->dataType = ID_BOOL;
				}
				else if(aux->sons[0]->token == KW_WORD)
				{
					aux->sons[1]->node->dataType = ID_WORD;
				}
				else if(aux->sons[0]->token == KW_BYTE)
				{
					aux->sons[1]->node->dataType = ID_BYTE;
				}

				node_.sons[1]->node->args = insertInIntList(aux->sons[0]->token,node_.sons[1]->node->args);
			}
			*/
			currentFunction = node_.sons[1]->node;
			verify((node_.sons[3])); // SEMPRE D_NODE , GAMBIARRATIONN

			break;
		// DECLARATIONS
		case PROG:
			verify((node_.sons[0]));
			verify((node_.sons[1]));
			break;
		case DECLARATION:
			if(node_.sons[1]->node->type != SYMBOL_IDENTIFIER)
				{hasError++;printf("Semantic error on line %d: variable %s already declared \n",node_.lineNumber,node_.sons[1]->node->value);}
			else
			{
				if(node_.sons[0]->token == KW_BOOL)
					node_.sons[1]->node->dataType = ID_BOOL;
				else if(node_.sons[0]->token == KW_WORD)
					node_.sons[1]->node->dataType = ID_WORD;
				else if(node_.sons[0]->token == KW_BYTE)
					node_.sons[1]->node->dataType = ID_BYTE;
				node_.sons[1]->node->type = ID_SCALAR;
				if(!(
					(node_.sons[0]->token == KW_BOOL && (node_.sons[2]->token == LIT_TRUE || node_.sons[2]->token == LIT_FALSE)) ||
					(((node_.sons[0]->token == KW_WORD) || (node_.sons[0]->token == KW_BYTE)) && ((node_.sons[2]->token == LIT_INTEGER)||(node_.sons[2]->token == LIT_CHAR)))))
					{hasError++;printf("Semantic error on line %d: Scalar initialized wrong.\n",node_.lineNumber);}
			}

			break;
		case DECLARATION_POINTER:
			if(node_.sons[1]->node->type != SYMBOL_IDENTIFIER)
				{hasError++;printf("Semantic error on line %d: variable already declared\n",node_.lineNumber);}
			else
			{
				if(node_.sons[0]->token == KW_BOOL)
					node_.sons[1]->node->dataType = ID_BOOL;
				else if(node_.sons[0]->token == KW_WORD)
					node_.sons[1]->node->dataType = ID_WORD;
				else if(node_.sons[0]->token == KW_BYTE)
					node_.sons[1]->node->dataType = ID_BYTE;
				node_.sons[1]->node->type = ID_POINTER;
			}
			break;
		case DECLARATION_VEC:
			if(node_.sons[1]->node->type != SYMBOL_IDENTIFIER)
				{hasError++;printf("Semantic error on line %d: variable already declared\n",node_.lineNumber);}
			else
			{
				if(node_.sons[0]->token == KW_BOOL)
					node_.sons[1]->node->dataType = ID_BOOL;
				else if(node_.sons[0]->token == KW_WORD)
					node_.sons[1]->node->dataType = ID_WORD;
				else if(node_.sons[0]->token == KW_BYTE)
					node_.sons[1]->node->dataType = ID_BYTE;
				node_.sons[1]->node->type = ID_VECTOR;

				if(!isInt(node_.sons[2]))
					{hasError++;printf("Semantic error on line %d: Vector with not-integer size\n",node_.lineNumber);}
			}
			break;
		case DECLARATION_VEC_INIT:
			if(node_.sons[1]->node->type != SYMBOL_IDENTIFIER)
				{hasError++;printf("Semantic error on line %d: variable already declared\n",node_.lineNumber);}
			else
			{
				if(node_.sons[0]->token == KW_BOOL)
					node_.sons[1]->node->dataType = ID_BOOL;
				else if(node_.sons[0]->token == KW_WORD)
					node_.sons[1]->node->dataType = ID_WORD;
				else if(node_.sons[0]->token == KW_BYTE)
					node_.sons[1]->node->dataType = ID_BYTE;
				node_.sons[1]->node->type = ID_VECTOR;

				if(!isInt(node_.sons[2]))
					{hasError++;printf("Semantic error on line %d: Vector with not-integer size\n",node_.lineNumber);}
				if(!(node_.sons[3]->token == LIST))
					{hasError++;printf("Semantic error on line %d: Vector initialized wrong.\n",node_.lineNumber);}
			}
			break;

		// EXPRESSION
		case '&':
			if(!(node_.sons[0]->node->type==ID_SCALAR))
				{hasError++;printf("Semantic error: getting reference for not-scalar on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			break;
		case POINTER:
			if(!(node_.sons[0]->node->type==ID_POINTER))
				{hasError++;printf("Semantic error: using not-pointer as pointer on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			break;
		case '*':
			if(!(isInt(node_.sons[0]) && isInt(node_.sons[1])))
				{hasError++;printf("Semantic error: multiplying not integer on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case '(':
			verify((node_.sons[0]));
			break;
		case '+':
			if(!(isInt(node_.sons[0]) && isInt(node_.sons[1])))
				{hasError++;printf("Semantic error: adding not integer on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case '-':
			if(!(isInt(node_.sons[0]) && isInt(node_.sons[1])))
				{hasError++;printf("Semantic error: subtracting not integer on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case '/':
			if(!(isInt(node_.sons[0]) && isInt(node_.sons[1])))
				{hasError++;printf("Semantic error: dividing not integer on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case OR:
			if(!(isBoolean(node_.sons[0]) && isBoolean(node_.sons[1])))
				{hasError++;printf("Semantic error: '||' with not boolean on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case AND:
			if(!(isBoolean(node_.sons[0]) && isBoolean(node_.sons[1])))
				{hasError++;printf("Semantic error: '&&' with not boolean on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case LE:
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case EQ:
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case GE:
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case NE:
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case '>':
			if(!(isInt(node_.sons[0]) && isInt(node_.sons[1])))
				{hasError++;printf("Semantic error: '>' with not integer on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case '<':
			if(!(isInt(node_.sons[0]) && isInt(node_.sons[1])))
				{hasError++;printf("Semantic error: '<' with not integer on line %d\n",node_.lineNumber);}
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		case VECCALL:
			if(node_.sons[0]->node->type == SYMBOL_IDENTIFIER)
				{hasError++;printf("Semantic error: Vector %s not declared used on line %d\n",node_.sons[0]->node->value,node_.lineNumber);}
			if(!isInt(node_.sons[1]))
				{hasError++;printf("Semantic error: Vector index not integer on line %d\n",node_.lineNumber);}
			if(!(node_.sons[0]->node->type==ID_VECTOR))
				{hasError++;printf("Semantic error: Something not-vector used as vector on line %d\n",node_.lineNumber);}
			break;
		case NORMAL:
			if(node_.sons[0]->node->type == SYMBOL_IDENTIFIER)
				{hasError++;printf("Semantic error: Variable %s not declared used on line %d\n",node_.sons[0]->node->value,node_.lineNumber);}
			if(node_.sons[0]->node->type != ID_SCALAR && node_.sons[0]->node->type != ID_POINTER)
				{hasError++;printf("Semantic error: Something not-scalar used as scalar on line %d\n",node_.lineNumber);}
			break;
		// FUNCALL ARGCALL CMD_SEQ
		case FUNCALL:
			if(node_.sons[0]->node->type == SYMBOL_IDENTIFIER)
				{hasError++;printf("Semantic error: Function %s not yet declared used on line %d\n",node_.sons[0]->node->value,node_.lineNumber);}
			if(!(node_.sons[0]->node->type==ID_FUNC))
				{hasError++;printf("Semantic error: Something not-function used as function on line %d\n",node_.lineNumber);}
			testArguments(node_.sons[0]->node,node_.sons[1]);
			break;
		case ARGCALL:
			break;
		case CMD_SEQ:
			verify((node_.sons[0]));
			verify((node_.sons[1]));
			break;
		// OUTPUT
		case OUTPUT_L:
			verify(node_.sons[0]);
			verify(node_.sons[1]);
			break;
		// CMD
		case INPUT:
			verify(node_.sons[0]);
			break;
		case OUTPUT:
			verify(node_.sons[0]);
			break;
		case RETURN:
			if(!currentFunction)
				{hasError++;printf("Semantic error: 'return' in wrong place on line %d\n",node_.lineNumber);}
			else if(currentFunction->dataType == ID_WORD)
			{
				if(!isInt(node_.sons[0]))
					{hasError++;printf("Semantic error: wrong return type for function %s, on line %d\n",currentFunction->value,node_.lineNumber);}
			}
			else if(currentFunction->dataType == ID_BYTE)
			{
				if(!isInt(node_.sons[0]))
					{hasError++;printf("Semantic error: wrong return type for function %s, on line %d\n",currentFunction->value,node_.lineNumber);}
			}
			else if(currentFunction->dataType == ID_BOOL)
			{
				if(!isBoolean(node_.sons[0]))
					{hasError++;printf("Semantic error: wrong return type for function %s, should be boolean, on line %d\n",currentFunction->value,node_.lineNumber);}
			}
			break;
		case BLOCK:
			verify((node_.sons[0]));
			break;
		case '=':
			verify(node_.sons[1]); ////////////////////////////////////////////////////////////////////// REMEMBER
			if(node_.sons[0]->token == VECCALL)
			{
				if(!(node_.sons[0]->sons[0]->node->type == ID_VECTOR))
					{hasError++;printf("Semantic error: not-vector used as vector on line %d\n",node_.lineNumber);}

				if(!isInt(node_.sons[0]->sons[1]))
					{hasError++;printf("Semantic error: vector index is not integer on line %d\n",node_.lineNumber);}

				if(node_.sons[0]->sons[0]->node->dataType == ID_WORD)
				{
					if(!isInt(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to integer vector from not-integer on line %d\n",node_.lineNumber);}
				}
				else if(node_.sons[0]->sons[0]->node->dataType == ID_BYTE)
				{
					if(!isInt(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to integer vector from not-integer on line %d\n",node_.lineNumber);}
				}
				else if(node_.sons[0]->sons[0]->node->dataType == ID_BOOL)
				{
					if(!isBoolean(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to boolean vector from not-boolean on line %d\n",node_.lineNumber);}
				}
				else
					{hasError++;printf("Semantic error: identifier %s not declared on line %d\n",node_.sons[0]->node->value,node_.lineNumber);}
			}
			else if(node_.sons[0]->token == POINTER)
			{
				if(node_.sons[0]->sons[0]->node->type != ID_POINTER)
					{hasError++;printf("Semantic error: dereferencing non-pointer on line %d\n",node_.lineNumber);}
				if(node_.sons[0]->sons[0]->node->dataType == ID_WORD)
				{

					if(!isInt(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to integer scalar from not-integer on line %d\n",node_.lineNumber);}
				}
				else if(node_.sons[0]->sons[0]->node->dataType == ID_BYTE)
				{
					if(!isInt(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to integer scalar from not-integer on line %d\n",node_.lineNumber);}
				}
				else if(node_.sons[0]->sons[0]->node->dataType == ID_BOOL)
				{
					if(!isBoolean(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to boolean scalar from not-boolean on line %d\n",node_.lineNumber);}
				}
				else
					{hasError++;printf("Semantic error: identifier %s not declared on line %d\n",node_.sons[0]->node->value,node_.lineNumber);}
			}
			else if(node_.sons[0]->node->type == ID_POINTER)
			{
				if(!isPt(node_.sons[1]))
				{
					{hasError++;printf("Semantic error: atributin a non-pointer to a pointer on line %d\n",node_.lineNumber);}
				}

			}
			else if(node_.sons[0]->node->type == ID_SCALAR)
			{
				if(node_.sons[0]->node->type == ID_VECTOR)
					{hasError++;printf("Semantic error: vector used as not-vector on line %d\n",node_.lineNumber);}
				if(node_.sons[0]->node->dataType == ID_WORD)
				{
					if(!isInt(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to integer scalar from not-integer on line %d\n",node_.lineNumber);}
				}
				else if(node_.sons[0]->node->dataType == ID_BYTE)
				{
					if(!isInt(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to integer scalar from not-integer on line %d\n",node_.lineNumber);}
				}
				else if(node_.sons[0]->node->dataType == ID_BOOL)
				{
					if(!isBoolean(node_.sons[1]))
						{hasError++;printf("Semantic error: atributing to boolean scalar from not-boolean on line %d\n",node_.lineNumber);}
				}
				else
					{hasError++;printf("Semantic error: identifier %s not declared on line %d\n",node_.sons[0]->node->value,node_.lineNumber);}
			}
			else
			{
				{hasError++;printf("Semantic error: atributing to non-variable on line %d\n",node_.lineNumber);}
			}
			break;
		case IF_THEN:
			if(!isBoolean(node_.sons[0]))
				{hasError++;printf("Semantic error: if called with not-boolean on line %d\n",node_.lineNumber);}
			verify(node_.sons[1]);
			break;
		case IF_THEN_ELSE:
			if(!isBoolean(node_.sons[0]))
				{hasError++;printf("Semantic error: if called with not-boolean on line %d\n",node_.lineNumber);}
			verify(node_.sons[1]);
			verify(node_.sons[2]);
			break;
		case LOOP :
			if(!isBoolean(node_.sons[0]))
				{hasError++;printf("Semantic error: loop called with not-boolean on line %d\n",node_.lineNumber);}
			verify(node_.sons[1]);
			break;
		// DEFAULT
		default:
			break;

	} // switch
	} // if node
}
Beispiel #7
0
/*!
 * Checks if the coordinates x/y point to the graph. returns the number of the
 * branch of the graph, -1 upon a miss.
 *
 * x/y are relative to diagram cx/cy. 5 is the precision the user must point
 * onto the graph.
 *
 * FIXME: should return reference to hit sample point or some context.
 */
int Graph::getSelected(int x, int y)
{
  auto pp = ScrPoints.begin();
  if(pp == ScrPoints.end()) return -1;

  int A, z=0;
  int dx, dx2, x1;
  int dy, dy2, y1;

  int countX = cPointsX.at(0)->count;
  if(pp->isStrokeEnd()) {
    if(pp->isBranchEnd()) z++;
    pp++;
    if(pp->isBranchEnd()) {
      if(pp->isGraphEnd())  return -1;   // not even one point ?
      z++;
      pp++;
      if(pp->isGraphEnd())  return -1;   // not even one point ?
    }
  }

  if(Style >= GRAPHSTYLE_STAR || gy!=NULL) {
    // for graph symbols
    while(!pp->isGraphEnd()) {
      if(!pp->isStrokeEnd()) {
        dx  = x - int((pp)->getScrX());
        dy  = y - int((pp++)->getScrY());

        if(dx < -5) continue;
        if(dx >  5) continue;
        if(dy < -5) continue;
        if(dy >  5) continue;
        return z*countX;   // points on graph symbol
      }
      else {
        z++;   // next branch
        pp++;
      }
    }
    return -1;
  }

  // for graph lines
  while(!pp->isGraphEnd()) {
    while(!pp->isBranchEnd()) {
      x1 = int(pp->getScrX());
      y1 = int((pp++)->getScrY());
      dx  = x - x1;
      dy  = y - y1;

      if(pp->isPt()){
        dx2 = int(pp->getScrX());
      }else if(pp->isBranchEnd()) {
        break;
      }else if(pp->isStrokeEnd()) {
        pp++;
        dx2 = int(pp->getScrX());  // go on as graph can also be selected between strokes
        if(pp->isBranchEnd()) break;
      }
      if(dx < -5) { if(x < dx2-5) continue; } // point between x coordinates ?
      else { if(x > 5) if(x > dx2+5) continue; }

      dy2 = int(pp->getScrY());
      if(dy < -5) { if(y < dy2-5) continue; } // point between y coordinates ?
      else { if(y > 5) if(y > dy2+5) continue; }

      dx2 -= x1;
      dy2 -= y1;

      A  = dx2*dy - dx*dy2;    // calculate the rectangle area spanned
      A *= A;                  // avoid the need for square root
      A -= 25*(dx2*dx2 + dy2*dy2);  // substract selectable area

      if(A <= 0)  return z*countX;  // lies x/y onto the graph line ?
    }
    pp++;
    z++;
  }

  return -1;
}
Beispiel #8
0
/*!
 * draw a (line) graph from screen coord pairs
 */
void Graph::drawLines(int x0, int y0, QPainter *p) const
{
  float DX_, DY_;
  float x1, y1;
  auto Scale = 1; /// \todo p->Scale;
  auto Painter = p;
  QVector<qreal> dashes;

  double Stroke=10., Space=0.;
  switch(Style) {
    case GRAPHSTYLE_DASH:
      Stroke = 10.; Space =  6.;
      break;
    case GRAPHSTYLE_DOT:
      Stroke =  2.; Space =  4.;
      break;
    case GRAPHSTYLE_LONGDASH:
      Stroke = 24.; Space =  8.;
      break;
    default:
      break;
  }

  QPen pen = Painter->pen();
  switch(Style) {
    case GRAPHSTYLE_DASH:
    case GRAPHSTYLE_DOT:
    case GRAPHSTYLE_LONGDASH:
      dashes << Stroke << Space;
      pen.setDashPattern(dashes);
      Painter->setPen(pen);
      break;
    default:
      pen.setStyle(Qt::SolidLine);
      break;
  }
  Painter->setPen(pen);

  auto pp = begin();
  if(!pp->isPt())
    pp++;

  /// \todo DX DY
  DX_ = /*p->DX*/ + float(x0)*Scale;
  DY_ = /*p->DY*/ + float(y0)*Scale;

  while(!pp->isGraphEnd()) {
    if(pp->isStrokeEnd()) ++pp; // ??
    QPainterPath path;
    if(pp->isPt()) {
      x1 = DX_ + pp->getScrX()*Scale;
      y1 = DY_ - pp->getScrY()*Scale;
      path.moveTo(x1,y1);
      ++pp;
    }else{
      break;
    }

    while(!pp->isStrokeEnd()) {
      x1 = DX_ + pp->getScrX()*Scale;
      y1 = DY_ - pp->getScrY()*Scale;
      path.lineTo(x1,y1);
      ++pp;
    }

    Painter->drawPath(path);
  }
}