gpt4 book ai didi

c - 制作正弦波程序

转载 作者:行者123 更新时间:2023-11-30 15:47:33 24 4
gpt4 key购买 nike

我正在编写一个用 C 语言显示正弦图的程序,这是程序的一小部分

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxClient, cyClient;
HDC hdc;
int i;
PAINTSTRUCT ps;
POINT apt[NUM];
switch (message)
{
case WM_SIZE:
cXClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
MoveToEx(hdc, 0, cyClient / 2, 0);
LineTo(hdc, cxClient, cyClient / 2);
for (i = 0; i < NUM; i++)
{
apt[i].x = i * cxClient / NUM;
apt[i].y = (int) (height / 2 * (1 - sin(TWOPI * i / NUM)));
}
Polyline(hdc, apt, NUM);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

其中 NUM 设置为 1000,cxClient 为低字中客户区的宽度,cyClient 为高字中客户区的高度,TWOPI 全局定义为 (2*3.1459)

我的程序问题是

1.我无法理解apt[i].x和apt[i].y这行代码(包括正弦形式)。

2.当我将 TWOPI 定义为 #define TWOPI (2*(22/7)) 而不是 (#define TWOPI (2*3.1459)) 时,图形是方形的,但两者是相同的,相反这更准确,所以为什么会发生这种情况。

这些东西书上没有解释所以我问你。

最佳答案

我将从 2 开始,它基本上是 What is the behavior of integer division? 的重复。 .

简而言之:除法运算符接受两个操作数并返回一个足够大且精确的类型的值来容纳任何操作数。因此,整数除法总是会产生整数结果,因为任何整数都足够精确以容纳整数。如您所知,整数除法可能会产生实数,因此至少其中一个操作数必须是实数。例如 #define TWOPI (2*(22.0/7))//隐式转换#define TWOPI (2*((float)22/7)//显式转换 >. 这解释了方形图

  1. C 提供两种类型的容器变量:数组和结构。数组是具有相同类型的值的集合,而结构是具有任意类型的值的集合。使用 [] 运算符访问数组的成员并提供元素的索引(array[0] 表示偏移量为 0 的元素,产生第一个元素)。使用 . 运算符(或 ->)访问结构,并提供元素的名称
    所以 apt[i] 基本上意味着“从数组 apt 中获取一个由 i 偏移的元素”,或者换句话说“tahe 一个 i+1”名为 apt 的数组中的第一个元素”。添加 .x 意味着“好的,因为 apt 的元素包含其他容器,该容器采用名为 x 的元素”,这很方便地表示该容器的 x 坐标正弦波中的点。
    与 .y 相同,只是我们有一个具有可变比例的正弦函数的数学表示。

编辑[解释数学]:
1. 1-sin()。正弦函数的值范围为 R = [-1;1],因此 1-R = [2;0]。这会导致函数反转(正弦上没有“视觉”效果)并向上移动到正值。实际上,这允许添加高度乘数而不处理负值。即函数仅从零点“增长”,并且不会从中心点向两个方向“扩展”。
2.sin() 里面有什么。您正在将 i 从 0 迭代到 NUM。在 sin() 内部,你有乘以 i/NUM 的值。如果您在纸上进行分析,您会发现在每次迭代中 TWOPI 都会乘以 1/10、2/10、3/10 等。sin() 期望其以弧度为单位的参数和“完整”正弦波(一个周期)可在区域 [0; 2π]。因此,乘以 2 PI 基本上意味着您代表的是正弦波的一个周期。将其更改为 4 PI 将导致正弦波的 2 个周期。

关于c - 制作正弦波程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17337475/

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