第一次发布问题-希望我能树立良好的声誉!
标题几乎描述了我的工作性质:
用户输入弹丸的初始速度和发射角后,我的程序必须生成点并绘制弹丸轨迹图。为此,我必须使用两个2D数组-一个用于生成的点,另一个用于画布(基本上是一个40x80的空格填充的空数组)。
为我提供了我必须使用的函数的原型,所以这里是我想出的相关代码(虽然很冗长,但仅出于完整性考虑。实际问题可以在第3和第4个函数中找到。 ):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Assignment6B.h"
int Sx = 0;
int Sy = 0;
void calcTraj(double initSpeed, double launchAngle, double trajData[][2]) {
do {
double Ux = initSpeed*cos(launchAngle*3.14/180.0);
double Uy = initSpeed*sin(launchAngle*3.14/180.0);
Sy = (Sx/Ux)*(Uy - ((9.81*Sx)/(2*Ux)));
if (Sy >= ZERO) {
trajData[Sx][0] = Sx;
trajData[Sx][1] = Sy;
}
Sx++;
} while (Sy >= ZERO);
}
int Row, Column;
void clearDisplayData(char displayData[HEIGHT][WIDTH]) {
for (Row = 0; Row < HEIGHT; Row++) {
for (Column = 0; Column < WIDTH; Column++) {
displayData[Row][Column] = ' ';
}
}
}
void updateDisplayData(char displayData[HEIGHT][WIDTH], double trajData[][2]) {
这是我受困的部分,毫无希望。
我理解该函数背后的思想:它接收“空画布”数组以及包含数据的数组(图形的点)。因此,现在需要做的是
displayData
中与[Sx][Sy]
中trajData
坐标相对应的所有元素,都需要替换为X
。例如,假设[1][4]
中的trajData
具有元素,则displayData[1][4]
= X
。我只是不知道该如何编码。如果有人可以提供样品,那就太好了!
}
void printData(char displayData[HEIGHT][WIDTH]) {
puts("");
for (Column = 0; Column < WIDTH + 2; Column++) {
printf("_");
}
puts("");
for (Row = 0; Row < HEIGHT; Row++) {
printf("|");
for (Column = 0; Column < WIDTH; Column++) {
printf("%c", displayData[Row][Column]);
}
printf("|");
puts("");
}
for (Column = 0; Column < WIDTH + 2; Column++) {
printf("_");
}
此功能也不完全正确。我必须绘制一个图,这意味着点
[0,0]
必须在左下角。但是数组的元素[0][0]
在左上角。我认为应该以
for
循环反转行的显示顺序,例如for (Row = HEIGHT; Row > 0; Row--)
-对吗?请指教...}
如果有人发现任何其他问题或有任何建议,请分享!一切帮助都值得赞赏...
最佳答案
阿什顿,如果我没记错的话,您似乎遇到的概念上的困难仅部分与C有关(语法上)。另一部分只是简单地了解要求您使用两个单独的阵列做什么。我会尽力消除雾气,希望不会使情况变得更糟。这基本上是一个数据扩展问题。
您的两个数组trajData
和displayData
只是同一数据的两种不同表示形式。 trajData
保留完整值,displayData
将仅保留缩放以适合[HEIGHT][WIDTH]
的相同值。
您的trajData
保留从运动学方程式返回的任意给定时间点的值。您的displayData
只是一个数组,其中保存了将trajData
的内容打印到某些[HEIGHT][WIDTH]
显示器时将打印到屏幕上的内容。这是您的工作所在。
为了使trajData
适应[HEIGHT][WIDTH]
的displayData
约束,您需要计算两个比例因子。第一个将缩放HEIGHTMAX - HEIGHTMIN
之间的差异,因此所有Y值数据点都适合HEIGHT
。您的第二个比例因子将确保所有时间值(您计算出的点的迭代次数,例如while (Sy >= ZERO);
)都适合WIDTH
。 (这也意味着您将需要使用trajData
中的点数返回(或更新指针)。
由于您当前正在使用type void
,请将返回类型更改为有用的内容,例如unsigned int
或size_t
或简单地int
(即使没有负时间)并返回点数)始终选择返回类型,以便它向您返回一些有价值的信息。 void
返回(请勿与void *
混淆)仅应在没有任何可用于返回的情况下使用,例如仅用于print
数据或free
内存的函数等。
知道点数并知道'Y'
值的范围,您可以计算因子来缩放您的trajData
值。这些比例因子将限制用于填充displayData
的值,因此它们都适合,因此您不会在数组末尾提交写入错误。
使用displayData
数组(清除后)的目标仅仅是打开容纳缩放以适合trajData
的[HEIGHT][WIDTH]
值的单元格。要使用刻度,您需要知道Sx
和Sy
的范围,因此您可以添加一些变量,例如:
int Sx = 0;
int Sy = 0;
int y_min = INT_MAX;
int y_max = INT_MIN;
然后,您将需要在
Sy
中选择calcTraj
的最大/最小值,类似于:int calcTraj(double initSpeed, double launchAngle, double trajData[][2]) {
...
if (Sy >= ZERO) {
if (Sy > y_max) y_max = Sy;
if (Sy < y_min) y_min = Sy;
...
} while (Sy >= ZERO);
return Sx;
}
要计算比例因子,您将执行以下操作:
int scale_x = WIDTH/Sx;
int scale_y = HEIGHT/(y_max - y_min);
为了填充
displayData
,您只需要使用要显示轨迹路径的任意字符打开单元格,例如'X'
或'#'
或'*'
。类似于以下内容的内容应该很接近,但是请注意,由于使用整数除法,可能必须调整在HEIGHT
小于(y_max - y_min)
的情况下使用的缩放公式,或更改为其他中间数据类型,例如float
或double
以准确地缩放您的值。另外,如果
Sx
远大于WIDTH
,则可能会为每个'Y'
值写入几个'X'
值,这些值在轨迹的斜率变为垂直的情况下-像是垂直发射子弹的图。 (如果您只能给出1的值,则可以取平均值)。类似于以下内容的东西应该起作用:/* set each relative cell to 'X' */
for (i = 0; i < Sx; i++) {
displayData[scale_x * trajData[i][0]][scale_y * trajData[i][1]] = 'X';
}
注意:这些只是关于此问题的想法,我还没有编写完整的示例进行测试。因此,如果您遇到问题,请告诉我。