一条直线通过端点绕一个半径为200的圆的圆心进行360度的旋转,在旋转的期间直线的端点一直在圆环上
#define _CRT_SECURE_NO_WARNINGS #include "graphics.h" #define _USE_MATH_DEFINES #include
struct Point { double x; double y;
1Point( void ) : x(), y() 2{ 3} 4 5 6Point( double x, double y ) : x(x), y(y) 7{ 8} 9 10 11Point translation( const Point& offset ) const // 平移 12{ 13 return Point( x+offset.x, y+offset.y ); 14} 15 16 17Point rotation( const Point& anchor, double angle ) const // 旋转 18{ 19 double radian = fmod(angle,360) * M_PI/180; 20 return Point( cos(radian)*(x-anchor.x) - sin(radian)*(y-anchor.y) + anchor.x 21 , cos(radian)*(y-anchor.y) + sin(radian)*(x-anchor.x) + anchor.y ); 22} 23 24 25Point scale( const Point& anchor, double ratio ) const // 缩放 26{ 27 return Point( (x-anchor.x)*ratio+anchor.x, (y-anchor.y)*ratio+anchor.y ); 28}
};
struct Line { Point a; Point b;
1Line( void ) 2{ 3} 4 5 6Line( const Point& a, const Point& b ) : a(a), b(b) 7{ 8} 9 10 11Line translation( const Point& offset ) const // 平移 12{ 13 return Line( a.translation(offset), b.translation(offset) ); 14} 15 16 17Line rotation( const Point& anchor, double angle ) const // 旋转 18{ 19 return Line( a.rotation(anchor,angle), b.rotation(anchor,angle) ); 20} 21 22 23Line scale( const Point& anchor, double ratio ) const // 缩放 24{ 25 return Line( a.scale(anchor,ratio), b.scale(anchor,ratio) ); 26} 27 28 29void Draw( COLORREF color=WHITE, int style=PS_DOT, int thickness=1 ) const 30{ 31 setlinecolor( color ); 32 setlinestyle( style, thickness ); 33 line( a.x, a.y, b.x, b.y ); 34}
};
struct Circle { Point center; double radius;
1Circle( void ) : radius() 2{ 3} 4 5 6Circle( const Point& center, double radius ) : center(center), radius(radius) 7{ 8} 9 10 11void Draw( COLORREF color=WHITE, int style=PS_DOT, int thickness=1 ) const 12{ 13 setlinecolor( color ); 14 setlinestyle( style, thickness ); 15 circle( center.x, center.y, radius ); 16}
};
#include
int main( void ) { initgraph( 640, 480 );
1Circle( Point(320,240), 200 ).Draw( WHITE, PS_DOT, 2 ); 2Line segment = Line( Point(320,40), Point(320,35) ).scale( Point(320,40), 10 ); 3for( double angle=0; angle<360; angle+=1 ) 4{ 5 segment.rotation( Point(320,240), angle ).Draw( WHITE, PS_SOLID, 1 ); 6} 7 8 9_getch(); 10closegraph();
} 好买网www.goodmai.com IT技术交易平台
