旋转算法

一条直线通过端点绕一个半径为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技术交易平台

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid