简单的说就是通过插值将环形短边展成和长边一样长,不知该如何实现

解决方案 »

  1.   

    看以下这个连接,我以前也使用过
    http://www.gzit.edu.cn/gut/magazine/xb20024/2002xb4-3/2002xb43-10.html
      

  2.   

    很久以前编的小程序,方形变圆形,不知道对你有没有用void CMorpheView::OnMorph() 
    {
    // TODO: Add your command handler code here
    //  while ( 1 )
    #define TIME 50
    CClientDC dc ( this ) ;
      for ( int time = 0 ; time <= TIME ; time ++ )
      {
    double factor = ( ( double ) TIME - time ) / TIME ;
    double angle ;
    double _angle_ = atan ( ( float ) nHeight / nLength ) ;
    int nPixelX = nMidX + nLength / 2 ;
    int nPixelY = nMidY ; int index = 0 ;
    PIXEL pixel [200] ;
    for ( angle = 0 ; angle < 6.28318 ; angle += 0.0314159 )
    {
    // dc.MoveTo ( nPixelX , nPixelY ) ;
    int nPixelXPre = nPixelX ;
    int nPixelYPre = nPixelY ;
    double cosangle = cos ( angle ) ;
    double sinangle = sin ( angle ) ;
    double tanangle = tan ( angle ) ;
    if ( angle < _angle_ || ( angle > ( 6.28318 - _angle_ ) ) )
    {
    nPixelX = nMidX + ( nLength / 2 - MAX_LENGTH * cosangle / 2 ) * factor + MAX_LENGTH * cosangle / 2 ;
    nPixelY = nMidY + ( nLength / 2 * tanangle - MAX_LENGTH * sinangle / 2 ) * factor + MAX_LENGTH * sinangle / 2 ;
    }
    else if ( angle >= _angle_ && angle <= ( 3.14159 - _angle_ ) )//( 3.14159 / 2 ) )
    {
    nPixelX = nMidX + ( nHeight / ( 2 * tanangle ) - MAX_LENGTH * cosangle / 2 ) * factor + MAX_LENGTH * cosangle / 2 ;
    nPixelY = nMidY + ( nHeight / 2 -MAX_LENGTH * sinangle / 2 ) * factor + MAX_LENGTH * sinangle / 2 ;
    }
    else if ( angle > ( 3.14159 - _angle_ ) && angle < 3.14159 )
    {
    nPixelX = nMidX - ( nLength / 2 - fabs ( MAX_LENGTH * cosangle / 2 ) ) * factor - fabs ( MAX_LENGTH * cosangle / 2 ) ;
    nPixelY = nMidY + ( fabs ( nLength / 2 * tanangle ) - fabs ( MAX_LENGTH * sinangle / 2 ) ) * factor + fabs ( MAX_LENGTH * sinangle / 2 ) ;
    }
    else if ( angle >= 3.14159 && angle < ( 3.14159 + _angle_ ) )
    {
    nPixelX = nMidX - ( nLength / 2 - fabs ( MAX_LENGTH * cosangle / 2 ) ) * factor - fabs ( MAX_LENGTH * cosangle / 2 ) ;
    nPixelY = nMidY - ( fabs ( nLength / 2 * tanangle ) - fabs ( MAX_LENGTH * sinangle / 2 ) ) * factor - fabs ( MAX_LENGTH * sinangle / 2 ) ;
    }
    else if ( angle >= ( 3.14159 + _angle_ ) && angle <= ( 6.28318 - _angle_ ) )
    {
    nPixelX = nMidX - ( nHeight / ( 2 * tanangle ) + MAX_LENGTH * cosangle / 2 ) * factor + MAX_LENGTH * cosangle / 2 ;
    nPixelY = nMidY - ( nHeight / 2 - fabs ( MAX_LENGTH * sinangle / 2 ) ) * factor - fabs ( MAX_LENGTH * sinangle / 2 ) ;
    }
    // dc.LineTo ( nPixelX , nPixelY ) ;
    pixel[index++] = PIXEL ( nPixelX , nPixelY ) ;
    }
    dc.MoveTo ( pixel[0].X , pixel[0].Y ) ;
    for ( int i = 1 ; i < 200 ; i ++ )
    {
    dc.LineTo ( pixel[i].X , pixel[i].Y ) ;
    }
    dc.LineTo ( pixel[0].X , pixel[0].Y ) ;

    if ( time <= ( TIME - 1 ) )
    {
    CPen pen , * pOldpen ;
    pen.CreatePen ( PS_SOLID , 3 , RGB ( 255 , 255 , 255 ) ) ;
    pOldpen = dc.SelectObject ( &pen ) ; _sleep ( 50 ) ;
    dc.MoveTo ( pixel[0].X , pixel[0].Y ) ;
    for ( i = 1 ; i < 200 ; i ++ )
    {
    dc.LineTo ( pixel[i].X , pixel[i].Y ) ;
    }
    dc.LineTo ( pixel[0].X , pixel[0].Y ) ; dc.SelectObject ( pOldpen ) ;
    }
      }
    #undef TIME
    }
      

  3.   

    不好意思,没帖全,PIXEL是个结构
    struct PIXEL 
    {
    PIXEL () {} ;
    PIXEL ( int x , int y ) : X ( x ) , Y ( y ) {} ;
    int X ;
    int Y ;
    };
    nMidX , nMidY , nLength , nWidth是四个变量,我做了随机,你可以直接定义一下给个定值也行
    当然还要"math.h"
    OnMorph函式中的内容自己定义一个事件放里面就行了,最好做在CXXXView类的函式内。原理说不上,自己瞎琢磨的
    大循环关于时间,50次,每次睡50ms,每次有不同的差值(factor),并在内部循环计算出所有点坐标后进行点连接绘图。
    内部循环关于圆周,分成200份,定义200个点,根据差值计算每个点的坐标,具体的我自己都看不懂了汗,反正就是根据角度,该角度线上初始坐标(方形上面)和终止坐标(圆形上面)以及差值计算此次时间循环中的点应该处在的位置。我分了四个象限做的,不知道是不是多余,楼主可以试试有没有“通式”~