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); }
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(); }