gpt4 book ai didi

c - 在 C 中用数组绘制轨迹图

转载 作者:行者123 更新时间:2023-11-30 17:10:55 24 4
gpt4 key购买 nike

第一次发布问题 - 让我们希望我建立良好的声誉!
标题几乎描述了我的任务的性质:

After a user enters the Initial Speed and Launch Angle for a projectile, my program has to generate points and plot a graph of the projectile's trajectory. For this I must use two 2D arrays - one for the points generated and the other as a canvas (basically an 40x80 empty array filled with spaces).



我得到了我必须使用的函数的原型(prototype),所以这是我想出的相关代码(它很长,但只是为了完整起见。实际问题可以在第 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]) {

这是我被卡住并且毫 headless 绪的部分。

我理解函数背后的想法:它接收“空 Canvas ”数组以及包含数据的数组(图表的点)。所以,现在需要做的是 displayData中的所有元素对应于 [Sx][Sy] - trajData 中的坐标, 需要替换为 X .例如,说 [1][4]trajData有一个元素,那么 displayData[1][4] = X .

我只是不知道如何编码。如果有人可以提供 sample ,那就太好了!
}

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--) - 正确的?请指教...
}

如果有人发现任何其他问题或有任何建议,请分享!一切有帮助的都表示赞赏...

最佳答案

Ashton,如果我没记错的话,你似乎遇到的概念上的困难只是部分与 C 相关(语法方面)。另一部分只是了解您被要求对两个单独的数组做什么。我会努力消除迷雾,希望不会让情况变得更糟。这基本上是一个数据扩展问题。

你的两个数组trajDatadisplayData只是相同数据的两种不同表示。 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 intsize_t或者干脆int (即使没有负时间)并返回点数)始终选择您的返回类型,以便它返回一些有值(value)的信息给您。一个 void return (不要与 void * 混淆)只应在没有任何用处可返回时使用,例如仅用于 print 的函数数据或 free内存等

知道点数和知道'Y'的范围值,您可以计算因子来缩放 trajData值(value)观。这些比例因子将限制用于填充 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) ,或更改为不同的中间数据类型,如 floatdouble准确地衡量你的值(value)观。

此外,如果 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';
}

注:这些只是关于这个问题的想法,我还没有编写一个完整的例子来测试。因此,如果您遇到问题,请告诉我。

关于c - 在 C 中用数组绘制轨迹图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32639683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com