Beispiel #1
0
void Graph::
paintEvent(QPaintEvent */*event*/)
{
    QPainter painter(this);

    QBrush brush;brush.setColor(QColor(250,50,50));
    painter.fillRect(0,0,width(),height(),brush);
    
    QPen pen;
    pen.setWidth(1);
    pen.setColor(QColor(210,210,255));
    painter.setPen(pen);

    float powerx=(int)floor(log(xmax-xmin)/log(logBase));
    float powery=(int)floor(log(ymax-ymin)/log(logBase));

    int powerOffsetSmall=5;
    int powerOffsetBig=1;
    drawX(painter,powerx-powerOffsetSmall);
    drawY(painter,powery-powerOffsetSmall);
    
    pen.setWidth(2);
    pen.setColor(QColor(200,200,255));
    painter.setPen(pen);

    drawX(painter,powerx-powerOffsetBig,false);
    drawY(painter,powery-powerOffsetBig,false);

    pen.setColor(Qt::black);
    painter.setPen(pen);
    drawX(painter,powerx-powerOffsetBig,true);
    drawY(painter,powery-powerOffsetBig,true);


    pen.setWidth(2);
    pen.setColor(QColor(50,100,200));
    painter.setPen(pen);
    float x1,y1,x2,y2;
    xform(0,ymin,x1,y1);
    xform(0,ymax,x2,y2);
    painter.drawLine(x1,y1,x2,y2);
    xform(xmin,0,x1,y1);
    xform(xmax,0,x2,y2);
    painter.drawLine(x1,y1,x2,y2);

   



    painter.setRenderHints(QPainter::Antialiasing);
    for(int i=0;i<funcs.rowCount(QModelIndex());i++){
        plot(painter,i);
    }

    if(rootShow || minShow){
        pen.setColor(Qt::black);
        painter.setPen(pen);
        //std::cerr<<"drawing"<<std::endl;
        float dx,dy;
        xform(rootX,rootY,dx,dy);
        painter.drawEllipse(QPoint(dx,dy),3,3);
        QString text=QString("(%1,%2)").arg(rootX).arg(rootY);
        painter.drawText(QPoint(dx,dy),text);
    }


    if(minShow || operationCode==FIND_MIN || operationCode==FIND_MAX){
        QBrush brush(Qt::yellow);
        painter.setBrush(brush);
        //std::cerr<<"draw boundstart "<<boundStart<<" "<<boundEnd<<std::endl;
        xform(boundStart,ymin,x1,y1);
        xform(boundStart,ymax,x1,y2);
        xform(boundEnd,ymin,x2,y1);
        xform(boundEnd,ymax,x2,y2);
        //painter.drawLine(x1,y1,x1,y2);
        //painter.drawLine(x2,y1,x2,y2);
        painter.setOpacity(.2);
        painter.drawRect(x1,y1,x2-x1,y2-y1);
        painter.setOpacity(1);
    }

}
/************************************************************************************
绘制函数
该函数主要完成对绘制更新操作,主要过程如下:
1. 绘制相应的X轴信息
2. 绘制相应的Y轴信息
3. 绘制常规检索下的RP曲线
4. 绘制蜂群检索下的RP曲线
5. 绘制其它一些辅助信息(如检索用时等)
************************************************************************************/
void CRPResultDlg::OnPaint()
{
	CPaintDC dc(this);

	CFont font;
	font.CreatePointFont(100, "微软雅黑");
	CFont *pOldFont = (CFont *)dc.SelectObject(&font);

	//设置背景为透明
	dc.SetBkMode(0);

	RECT clientRect;
	GetClientRect(&clientRect);

	POINT originPos;
	originPos.x = clientRect.left + 30;
	originPos.y = clientRect.bottom - 70;

	POINT size;
	size.x = (clientRect.right - clientRect.left) - 50;
	size.y = (clientRect.bottom - clientRect.top) - 80;

	dc.MoveTo(originPos.x , originPos.y);
	dc.LineTo(originPos.x + size.x , originPos.y);

	dc.MoveTo(originPos.x , originPos.y);
	dc.LineTo(originPos.x , originPos.y - size.y);

	drawX(originPos.x , originPos.y , &dc , 0.0f);
	drawX(originPos.x + size.x * 0.5 , originPos.y , &dc , 0.5f);
	drawX(originPos.x + size.x , originPos.y , &dc , 1.0f);
	drawY(originPos.x , originPos.y - size.y * 0.5f , &dc , 0.5f);
	drawY(originPos.x , originPos.y - size.y , &dc , 1.0f);

	dc.TextOut(clientRect.right - 100 , clientRect.bottom - 45 , "横向-Recall");
	dc.TextOut(clientRect.right - 100 , clientRect.bottom - 25 , "纵向-Precision");

	// 绘制常规搜索下的结果
	{
		CPen pen(PS_SOLID , 1 , RGB(255, 0, 0));
		CPen *pOldPen = dc.SelectObject(&pen);

		POINT curPos;
		float lastX , lastY;

		int valueX , valueY;
		// 绘制在X轴上 50维度的曲线
		if(mRPResult.mRPDataList.GetListSize() > 0)
		{
			RPData* pRTData = mRPResult.mRPDataList.GetItemPtr(0);
			curPos.x = (LONG)(pRTData->recall * size.x + originPos.x);
			curPos.y = (LONG)(-pRTData->precision * size.y + originPos.y);
			dc.MoveTo(curPos.x , curPos.y);
			lastX = pRTData->recall;
			lastY = pRTData->precision;

			for(int i = 1 ; i < mRPResult.mRPDataList.GetListSize() ; i++)
			{
				if ((i % 20 == 0))
				{
					pRTData = mRPResult.mRPDataList.GetItemPtr(i);
					curPos.x = (int)(pRTData->recall * (float)size.x) + originPos.x;
					curPos.y = -(int)(pRTData->precision * (float)size.y) + originPos.y;
					dc.LineTo(curPos.x , curPos.y);

					valueX = (int)(pRTData->recall * 100.0f);
					valueY = (int)(pRTData->precision * 100.0f);

					dc.MoveTo(curPos.x , curPos.y);

					lastX = pRTData->recall;
					lastY = pRTData->precision;
				}
			}
		}

		dc.MoveTo(75 , clientRect.bottom - 15);
		dc.LineTo(120 , clientRect.bottom - 15);
		
		CString timeText;
		timeText.Format("时间:%3.6f 秒" , mRPResult.mUsedTime);
		dc.TextOut(160 , clientRect.bottom - 25 , timeText);
		dc.TextOut(15 , clientRect.bottom - 25 , "常规搜索");

		dc.SelectObject(pOldPen);
	}

	// 绘制蜂群搜索下的结果
	{
		CPen pen(PS_SOLID , 1 , RGB(0, 0, 255));
		CPen *pOldPen = dc.SelectObject(&pen);

		POINT curPos;
		float lastX , lastY;

		int valueX , valueY;

		int xStep = mRPResultBee.mRPDataList.GetListSize() / 50;
		if(mRPResultBee.mRPDataList.GetListSize() > 0)
		{
			RPData* pRTData = mRPResultBee.mRPDataList.GetItemPtr(0);
			curPos.x = (LONG)(pRTData->recall * size.x + originPos.x);
			curPos.y = (LONG)(-pRTData->precision * size.y + originPos.y);
			dc.MoveTo(curPos.x , curPos.y);
			lastX = pRTData->recall;
			lastY = pRTData->precision;

			for(int i = 1 ; i < mRPResultBee.mRPDataList.GetListSize() ; i++)
			{
				if ((i % xStep == 0))
				{
					pRTData = mRPResultBee.mRPDataList.GetItemPtr(i);
					curPos.x = (int)(pRTData->recall * (float)size.x) + originPos.x;
					curPos.y = -(int)(pRTData->precision * (float)size.y) + originPos.y;
					dc.LineTo(curPos.x , curPos.y);

					valueX = (int)(pRTData->recall * 100.0f);
					valueY = (int)(pRTData->precision * 100.0f);

					dc.MoveTo(curPos.x , curPos.y);

					lastX = pRTData->recall;
					lastY = pRTData->precision;
				}
			}
		}

		dc.MoveTo(75 , clientRect.bottom - 35);
		dc.LineTo(120 , clientRect.bottom - 35);

		CString timeText;
		timeText.Format("时间:%3.6f 秒" , mRPResultBee.mUsedTime);
		dc.TextOut(160 , clientRect.bottom - 45 , timeText);
		dc.TextOut(15 , clientRect.bottom - 45 , "蜂群搜索");

		dc.SelectObject(pOldPen);
	}
	dc.SelectObject(pOldFont);
}
Beispiel #3
0
void
BoundingBox::draw()
{
  if (m_emitUpdate)
    {
      bool ok = true;
      for (int i=0; i<6; i++)
	{      
	  if (m_bounds[i].grabsMouse())
	    {
	      ok = false;
	      break;
	    }
	}
      if (ok)
	{
	  emit updated();
	  m_emitUpdate = false;
	}
    }

  Vec bmin, bmax;  

  bounds(bmin, bmax);

  Vec lineColor = defaultColor;
  lineColor = Vec(0.8f, 0.8f, 0.6f);

  glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  glColor4f(boxColor.x, boxColor.y, boxColor.z, 0.9f);
  StaticFunctions::drawEnclosingCube(bmin,
				     bmax);
  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

  for (int i=0; i<6; i++)
    {      
      if (m_bounds[i].grabsMouse())
	{
	  glLineWidth(2);
	  switch(i)
	    {
	    case 0 :
	      drawX(bmin.x, bmin, bmax, selectColor);
	      break;
	    case 1 :
	      drawX(bmax.x, bmin, bmax, selectColor);
	      break;	     
	    case 2 :
	      drawY(bmin.y, bmin, bmax, selectColor);
	      break;	      
	    case 3 :
	      drawY(bmax.y, bmin, bmax, selectColor);
	      break;	      
	    case 4 :
	      drawZ(bmin.z, bmin, bmax, selectColor);
	      break;	      
	    case 5 :
	      drawZ(bmax.z, bmin, bmax, selectColor);
	      break;
	    }
	}
      else
	{
	  glLineWidth(1);
	  switch(i)
	    {
	    case 0 :
	      drawX(bmin.x, bmin, bmax, lineColor);
	      break;
	    case 1 :
	      drawX(bmax.x, bmin, bmax, lineColor);
	      break;	     
	    case 2 :
	      drawY(bmin.y, bmin, bmax, lineColor);
	      break;	      
	    case 3 :
	      drawY(bmax.y, bmin, bmax, lineColor);
	      break;	      
	    case 4 :
	      drawZ(bmin.z, bmin, bmax, lineColor);
	      break;	      
	    case 5 :
	      drawZ(bmax.z, bmin, bmax, lineColor);
	      break;
	    }
	}
    }

  glLineWidth(1);
}
int main()
{

	int drive, mode, width, height;
	int x[ 21 ], xx[ 21 ], y[ 21 ];
	int fixx,fixy;
	float b[21], xz[ 21 ];

	int i, j, num_eq, num_var, pointNUM;
	float coeff[ 20 ][ 20 ], inv_coeff[ 20 ][ 20 ], known[ 20 ];
	float var[ 20 ];
	float drawpoints[ 50 ];
	float  scope, interval;

	drive = DETECT;
	printf( "Enter the Number of Equations. : " );
	scanf( "%d", &num_eq );
	num_var = num_eq;
	for( i = 0; i < num_eq; i++ ){
		printf( "*********************************************\n" );
		printf( "Enter the Coefficients of eq. %d. \n", i + 1 );
		for( j = 0; j < num_var; j++ ){
			printf( "coefficient of variable %d. : ", j + 1 );
			scanf( "%f", &coeff[ i ][ j ] );
		}
		printf( "Enter the Known Value of eq. %d. : ", i + 1 );
		scanf( "%f", &known[ i ] );
	}
	
	printf( "*********************************************\n" );




	printf( "\n\n Entered Equations :\n" );
	for( i = 0; i < num_var; i++ ){
		for( j = 0; j < num_var; j++ ){
			printf( "%10.3f * X%d", coeff[ i ][ j ], j + 1);
			if( j != num_var - 1)
				printf( "+" );
			else
				printf( "=" );
		}
		printf("%10.3f\n", known[i] );
	}

matrix_inversion_using_element_operation( coeff, inv_coeff, num_eq );

	for( i = 0; i < num_var; i++ ){
		var[ i ] = 0.0;
		for( j = 0; j < num_eq; j++ )
			var[ i ] += inv_coeff[ i ][ j ] * known[ j ];
	}
	
	printf( "*********************************************\n" );
	printf( "Results : \n" );
	
	for( i = 0; i < num_var; i++ )
		printf( "X%d = %10.3f\n", i + 1, var[ i ] );

	for( i = num_eq; i >= 1; i-- ){
		printf( "%0.3fX^%d", var[ num_eq - i ], i - 1 );
		if( i > 1 )
			printf( " + " );

		xz[ num_eq - i ] = var[ num_eq - i];
	}
	
	

	printf( "\n\n" );
	printf( "Enter the scope of X: " );
	scanf( "%f", &scope );
	printf( "\n" );
	printf( "Enter the interval of test: " );
	scanf( "%f", &interval );
	printf( "\n\n" );


	pointNUM =( int )( scope / interval );

	for( i = 0; i <= pointNUM; i++ ){
		b[ i ] = ( xz[ num_eq - num_eq ] * i * i ) + ( xz[ num_eq - num_eq + 1 ] * i ) + ( xz[ num_eq - num_eq + 2 ] * ( num_eq - num_eq ) );
		printf( "%d B is :%10.3f\n", i, b[ i ] );
	}

	for( i = 0; i <= pointNUM; i++ ){
		printf( "Enter the %d number of X: ", i + 1);
		x[ i ] = i;
		xx[ i ] = x[ i ] * 46;
		printf( "%d\n", xx[ i ] );
	}

	for( i = 0; i <= pointNUM; i++ ){
		printf( "Enter the %d number of Y: ", i + 1);
		y[ i ] =(int)( 460 - b[ i ] * 46 );
		printf( "%d\n", y[ i ] );
	}
	printf( "\n\n\npass any key to draw the function line..." );
	getch();

	initgraph( &drive, &mode, "" );
	setbkcolor( BLUE );
	cleardevice();
	drawX();
	drawY();

	for( i = 0; i < pointNUM; i++ ){
		cleardevice();
		drawX();
		drawY();
		moveto( xx[ i + 1 ], y[ i + 1 ] );
		outtext( "*" );
		msDelay( 1000000 );
	}

	for( i = 0; i < pointNUM; i++ ){
		moveto( xx[ i + 1 ], y[ i + 1 ] );
		outtext( "*" );
		line( xx[ i ], y[ i ], xx[ i + 1], y[ i + 1 ] );
	}

	getch();
	closegraph();

}