显示一个飞机:(飞机各顶点的坐标存放在数组中)
(1)按比例缩小或放大.缩放比例由键盘输入,缩放的参考点由用户确定;
(2)旋转.由键盘输入旋转角度和旋转中心;
实验源码:
#include<iostream>
using namespace std;
#include<graphics.h>
void showAirplane(int numberOfApex,int *p) {
int gdriver, gmode;
int *q;//临时存储空间
int xReference, yReference;//缩放参考点
float xscaling, yscaling;//缩放比例
int xrolling, yrolling;//旋转中心
float angle;//旋转角度
cout << "请输入缩放参考点:";
cin >> xReference;
cin >> yReference;
cout << "请输入x坐标的缩放比例:";
cin >> xscaling;
cout << "请输入y坐标的缩放比例:";
cin >> yscaling;
cout << "请输入旋转中心:";
cin >> xrolling;
cin >> yrolling;
cout << "请输入旋转角度:";
cin >> angle;
angle = float(angle / 57.3);//角度转化为弧度
q = new int[2 * numberOfApex];
initgraph(&gdriver, &gmode, "");
drawpoly(numberOfApex, p);//画初始图形
for (int i = 0; i < numberOfApex; i++) {//进行缩放变换
*(q + 2 * i) = int(*(p + 2 * i)*xscaling - xReference*xscaling + xReference + 0.5);
*(q + 2 * i + 1) = int(*(p + 2 * i + 1)*yscaling - yReference*yscaling + yReference + 0.5);
}
setcolor(RED);
drawpoly(numberOfApex, q);//画缩放变换后的图形
for (int i = 0; i < numberOfApex; i++) {//进行旋转变换
*(q + 2 * i) = int(*(p + 2 * i)*cos(angle) - *(p + 2 * i + 1)*sin(angle) + xrolling - xrolling*cos(angle) + yrolling*sin(angle)+0.5);
*(q + 2 * i + 1) = int(*(p + 2 * i)*sin(angle) + *(p + 2 * i + 1)*cos(angle) + yrolling - yrolling*cos(angle) - xrolling*sin(angle) + 0.5);
}
setcolor(YELLOW);
drawpoly(numberOfApex, q);//画旋转变换后的图形
delete q;
getchar();
getchar();
closegraph();
}
int main() {
int numberOfApex;//顶点个数
int *p;//存放顶点
cout << "请输入顶点的个数:";
cin >> numberOfApex;
p = new int[2 * numberOfApex];
for (int i = 0; i < numberOfApex; i++) {
cout << "请输入第" << i + 1 << "个顶点:";
cin >> *(p + 2 * i);
cin >> *(p + 2 * i + 1);
}
showAirplane(numberOfApex, p);//调用函数
delete p;
return 0;
}