第十二课 定位画图---坐标
【平面坐标】
为了能描述一个地点的位置,一般有两种说法:
l 以自己当前的位置和方向为根据,描述相对的方向和距离。例如:向前走100米,右转再走50米。GoC的笔的fd、rt命令正是如此。
l 另一种方法是根据整个城市的地图,描述确定的地点。例如:在城市的东南方向。
第2种方法在数学上叫:平面直角坐标系。如下图表示:
|
|
坐标系由原点O、水平的X轴和垂直的Y轴构成。
坐标系中每一点的位置都用它在X轴和Y轴的位置表示,称为坐标。例如:(2,3)。
|
上图中A点的坐标为(3,5)、B点的坐标为(-5,1)、C点的坐标为(2,-3)。
【思考】
l 坐标(0, 0)位置在哪里?
l 坐标(-3, -5)位置在哪里?
l 坐标(6, 1)位置在哪里?
GoC中的位置也是用直角坐标表示的,你可以在程序开始加显示坐标的命令:
showXY( ); |
showXY(1); |
|
|
showXY()更多的模式参数请查看帮助文档。
【坐标相关命令】
GoC里有几个与坐标系相关的命令:
坐标类命令 |
|
pen.move(x , y); |
例:pen.move(0,0);“笔”回到原点。 |
pen.line(x , y); |
从笔的当前位置画到坐标位置(x,y)处,画线不受笔的方向影响。 例:pen.line(100,100); |
使用move和line命令,可以比较方便地到指定的位置,在画和数学相关的图形时特别有效。
例题12.1:在X坐标轴上画13个点,位置从(-300,0)到(300,0)。如下图:
分析
x坐标从-300开始,每次增加50,到300。利用move(x,0)到指定位置,再画个红色的圆即可。
样例程序12.1 |
图形 |
int main() { showXY(1); for(int x=-300; x<=300; x+=50) p.move(x,0).oo(3, _red);
return0; } |
|
例题12.2:画下面的图形。
|
分析:
连一些线,线的左端点在Y轴上,右端点固定为(300,0):
解题方法:用for语句的循环变量列举所有左端点的Y坐标,用move命令到左端点,再line到(300,0)画线即可。
样例程序12.2 |
图形 |
int main() { // showXY(1); for(int i=0; i<300; i+=25) { pen.move(0,i); pen.line(300,0); } return0; } |
|
例题12.3:风帆。
分析:
连一些线,线的左端点固定为(-300,0),线的中间点在Y轴上,右端点固定为(300,0):
解题方法:用for语句的循环变量列举所有左端点的Y坐标,用move命令到左端点,再line到中间Y轴上点和右端点(300,0)画线即可。
样例程序12.2 |
图形 |
int main() { // showXY(1); pen.size(5).fd(310); //画中间的柱子 pen.size(1).c(0); for(int y=300; y>=0; y-=30) { p.move(-300,0).line(0,y).line(300,0); } return0; } |
|
例题12.3(初中):画Y=X*X/30的函数图形。
分析:手工画函数的基本方法是“描点连线”。现在我们模拟这个方法。公式中如果不除30,x=100时y=10000,函数的图形高度会超出屏幕。
解题方法:用for语句的循环变量列举X从-100到100,计算出相应的Y值,就是一个点的坐标,用line画线即可。要先到第一点。
样例程序12.3 |
图形 |
//程序名:样例程序12.2 //作者: gogo //2015.12.22 int main() { // showXY(); pen.move(-100,100*100/30); for(int x=-100; x<100; x++) { int y=x*x/30; pen.line(x,y); // pen.oo(2,3);//描点 } return0; } |
|
【练习】
一、填空题。根据题目的任务,填空完善程序。
题目 |
程序 |
练习12.1画下面图形。
|
int main() { // showXY(2); for(int x=-100; x<=200; x+=20) { p.move(x,100); p.line(-x, ); } return0 |
练习12.2(初中)画Y=kX的函数图形,k是键盘输入。 下面是输入-2的图形。
|
int main() { showXY(); double k; cin>>k; for(int x=-200; x<=200; x++) { p.move(x, ); p.oo(2,3); } return0; } 注:变量k定义为double型,可以输入小数,比如:0.2。 |
练习12.3(高中)画Y=sin(x*w)*hight的函数图形。w是周期密度,hight是高。w=3,hight=200的图形如下:
|
int main() { // showXY(); int w=3; int hight= ; for(int x=-200; x<=200; x++) { p.move(x, sin(x*3.1416/180*w)*hight); p.oo(3,1); wait(0.01); // p.oo(5,_white); } return0; } 注:x是度数,但C++里sin函数参数单位是弧度,要转换一下:x*3.14/180。 加wait是增加动态效果。 |
二、编程题。
练习12.4:编程画出下面图形,正方形边长为200。
|
参考程序: int main() { showXY(2); double len=200;
p.c(1).size(2); for(int i=0; i<4; i++)//画正方形边框 p.fd(len).rt(90);
p.size(1); for(double i=0; i<=len;i+= len/10) { p.move(0, i ).line(len-i,0); } return0; }
|
练习12.5:编程画出下面图形。
|
练习12.6:编程画一个等腰梯形,上底边长为60,下底编程为120,高为50。如下面图形。
【学习目标】
(1) 掌握平面坐标(小学生可能要专门学习一下,比如用练习软件)。
(2) 掌握move和line命令。
(3) 学会用坐标定位画图。