旋 转 算 法

一条直线通过端点绕一个半径为200的圆的圆心进行360度的旋转,在旋转的期间直线的端点一直在圆环上


#define _CRT_SECURE_NO_WARNINGS
#include "graphics.h"
#define _USE_MATH_DEFINES
#include


struct Point
{
    double x;
    double y;


    Point( void ) : x(), y()
    {
    }


    Point( double x, double y ) : x(x), y(y)
    {
    }


    Point translation( const Point& offset ) const // 平移
    {
        return Point( x+offset.x, y+offset.y );
    }


    Point rotation( const Point& anchor, double angle ) const // 旋转
    {
        double radian = fmod(angle,360) * M_PI/180;
        return Point( cos(radian)*(x-anchor.x) - sin(radian)*(y-anchor.y) + anchor.x
                    , cos(radian)*(y-anchor.y) + sin(radian)*(x-anchor.x) + anchor.y );
    }


    Point scale( const Point& anchor, double ratio ) const // 缩放
    {
        return Point( (x-anchor.x)*ratio+anchor.x, (y-anchor.y)*ratio+anchor.y );
    }
};


struct Line
{
    Point a;
    Point b;


    Line( void )
    {
    }


    Line( const Point& a, const Point& b ) : a(a), b(b)
    {
    }


    Line translation( const Point& offset ) const // 平移
    {
        return Line( a.translation(offset), b.translation(offset) );
    }


    Line rotation( const Point& anchor, double angle ) const // 旋转
    {
        return Line( a.rotation(anchor,angle), b.rotation(anchor,angle) );
    }


    Line scale( const Point& anchor, double ratio ) const // 缩放
    {
        return Line( a.scale(anchor,ratio), b.scale(anchor,ratio) );
    }


    void Draw( COLORREF color=WHITE, int style=PS_DOT, int thickness=1 ) const
    {
        setlinecolor( color );
        setlinestyle( style, thickness );
        line( a.x, a.y, b.x, b.y );
    }
};


struct Circle
{
    Point center;
    double radius;


    Circle( void ) : radius()
    {
    }


    Circle( const Point& center, double radius ) : center(center), radius(radius)
    {
    }


    void Draw( COLORREF color=WHITE, int style=PS_DOT, int thickness=1 ) const
    {
        setlinecolor( color );
        setlinestyle( style, thickness );
        circle( center.x, center.y, radius );
    }
};


#include


int main( void )
{
    initgraph( 640, 480 );


    Circle( Point(320,240), 200 ).Draw( WHITE, PS_DOT, 2 );
    Line segment = Line( Point(320,40), Point(320,35) ).scale( Point(320,40), 10 );
    for( double angle=0; angle<360; angle+=1 )
    {
        segment.rotation( Point(320,240), angle ).Draw( WHITE, PS_SOLID, 1 );
    }


    _getch();
    closegraph();
}

好买网 IT技术交易平台

壹立科技自主研发的FCRM-壹脉销客智能名片系统

壹脉销客V3.0.0版本,适合政企单位的宣传展示名片系统Java源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值