不好意思,没帖全,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个点,根据差值计算每个点的坐标,具体的我自己都看不懂了汗,反正就是根据角度,该角度线上初始坐标(方形上面)和终止坐标(圆形上面)以及差值计算此次时间循环中的点应该处在的位置。我分了四个象限做的,不知道是不是多余,楼主可以试试有没有“通式”~
http://www.gzit.edu.cn/gut/magazine/xb20024/2002xb4-3/2002xb43-10.html
{
// 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
}
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个点,根据差值计算每个点的坐标,具体的我自己都看不懂了汗,反正就是根据角度,该角度线上初始坐标(方形上面)和终止坐标(圆形上面)以及差值计算此次时间循环中的点应该处在的位置。我分了四个象限做的,不知道是不是多余,楼主可以试试有没有“通式”~