题目如下:
Description |
将平面上的圆绕任意点(称为旋转中心点)旋转任意角度,输出旋转后的圆的圆心坐标及圆的面积和周长。 |
Input |
有多组数据。 每组数据的前两个数是圆的圆心的起始坐标;第3个数是圆的半径;第4、5个数旋转中心点;第6个数是旋转的角度(单位:度)。 |
Output |
旋转后的圆的圆心坐标及圆的面积和周长。圆心坐标保留4位小数,面积和周长保留两位小数。 |
Sample Input |
5 5 10 15 12 45 -8.9 12.15 22 17.69 -5.78 25 |
Sample Output |
(12.8787,-0.0208) area:314.16 perim:62.83 (-13.9863,-0.7673) area:1520.53 perim:138.23 |
题意十分简单,而点的旋转有个公式:
a=(x-rx)*cos(angle)-(y-ry)*sin(angle)+rx;
b=(x-rx)*sin(angle)+(y-ry)*cos(angle)+ry;
其中,a为旋转以后点的x坐标,b为旋转以后点的y坐标,x、y为旋转前点坐标,rx、ry为旋转中心坐标,angle为角度,此公式可以得到证明,而我才力有限(太蠢了,而且高数还不好emmm),请诸君可以去百度下。。。。
另外一点,c/c++里面的角度是以弧度表示的,所以我们在读入的时候应该把角度转化为弧度值,怎么转化,,,嘻嘻,数学老师说了吗,乘以PI除以180就ok啦。。。这就是主要的解法。。。
然而题目要求用面对对象编程来做,于是乎我们要定义一个类,圆类???
其实利用C++中类与对象的知识,我们可以定义一个点类,然后再派生出圆类,毕竟,圆是不是有个坐标和半径,这就完全可以由点类继承而写出圆类了。。。
附上AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <math.h>
#define pi acos(-1.0)
using namespace std;
class point
{
protected:
double x,y;
public:
point(float =0,float =0);
void setpoint(float,float);
double getx(void)
{
return x;
}
double gety(void)
{
return y;
}
point xz(point &s,double angle);
void output(void)
{
printf("(%.4f,%.4f)",x,y);
}
};
point::point(float a,float b)
{
x=a;
y=b;
}
void point::setpoint(float a,float b)
{
x=a;
y=b;
}
point point::xz(point &s, double angle)
{
angle = angle*pi/180;
double a,b;
a=(x-s.x)*cos(angle)-(y-s.y)*sin(angle)+s.x;
b=(x-s.x)*sin(angle)+(y-s.y)*cos(angle)+s.y;
point ss(a,b);
return ss;
}
class circle : public point
{
private:
double rad;
public:
public:
circle(double x=0,double y=0,double r=0);
void set_r(double);
double getS(void)
{
return pi*rad*rad;
}
double getC(void)
{
return pi*rad*2;
}
};
circle::circle(double a,double b,double r):point(a,b),rad(r)
{
}
void circle::set_r(double r)
{
rad=r;
}
int main()
{
double a,b,c,d,e,f;
while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF)
{
point s1(a,b),s2(d,e);
circle cir(a,b,c);
point s3=s1.xz(s2, f);
s3.output();
printf(" area:%.2f perim:%.2f\n",cir.getS(),cir.getC());
}
return 0;
}
另外,其实不定义点类也不是不行,我们可以利用C++中友元的概念,直接定义一个圆类,然后将其他三个元素放入友元函数中来操作就OK了。
附上代码:
#include <iostream>
#include <math.h>
#include <iostream>
#define pi acos(-1.0)
using namespace std;
class circle
{
private:
double a,b,c;
public:
circle(double na,double nb,double nc)
{
a=na;
b=nb;
c=nc;
}
double S(void);
double C(void);
friend void xz(circle &s,double d,double e,double f);
};
double circle::S()
{
return pi*c*c;
}
double circle::C()
{
return 2*pi*c;
}
void xz(circle &s,double d,double e,double f)
{
double x=(s.a-d)*cos(f)-(s.b-e)*sin(f)+d;
double y=(s.a-d)*sin(f)+(s.b-e)*cos(f)+e;
printf("(%.4f,%.4f)",x,y);
}
int main()
{
double a,b,c,d,e,f;
while(~scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f))
{
circle ss(a,b,c);
f=f*pi/180;
xz(ss,d,e,f);
printf(" area:%.2f perim:%.2f\n",ss.S(),ss.C());
}
return 0;
}