1006150804 发表于 2025-1-12 21:34:30

正弦曲线

for (i = 0; i < NUM; i++)
                {
                        apt.x = i * cxClient / NUM;
                        apt.y = (int)(cyClient / 2 * (1 + sin( TWOPI * i / NUM)));
                }

这里apt.y不是很理解,高手帮忙解疑惑一下

FishC 发表于 2025-1-12 21:34:51

在这个代码片段中,`apt.y` 的计算涉及到将正弦函数的值转换为屏幕上的像素坐标。这里是详解:

1. **`cyClient / 2`:** 这代表画布(窗口)的垂直方向的中点。因为正弦波将在这个中点上下波动,所以我们首先将 y 坐标基于这个中点计算。

2. **`sin(TWOPI * i / NUM)`:** `TWOPI` 是一个表示 2π 的常量,通常用于完成一个完整的正弦波周期。`i / NUM` 确保每个 `i` 对应于正弦波上的一个不同点,`NUM` 是总的采样点数,这意味着 `i` 从 0 到 `NUM` 将覆盖一个完整的周期。

3. **`1 + sin(...)`:** 正弦函数 `sin(...)` 的值范围是从 -1 到 1。通过加 1,范围变为 0 到 2,这意味着正弦波的最低点(-1)被映射为 0,最高点(1)则被映射为 2。

4. **`(int)(cyClient / 2 * (1 + sin(...)))`:** 这个整体的计算将正弦波的值(现在在 0 到 2 之间)映射到画布的像素坐标。乘以 `cyClient / 2` 是为了将 0 到 2 的范围映射到窗口的像素高度。最终通过 `int` 强制转换为整数,因为像素坐标必须是整数。

这段代码有效地将整个正弦波绘制在窗口的垂直居中的位置,波动范围在窗口的上半部分和下半部分之间。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

1006150804 发表于 2025-1-12 21:37:06

FishC 发表于 2025-1-12 21:34
在这个代码片段中,`apt.y` 的计算涉及到将正弦函数的值转换为屏幕上的像素坐标。这里是详解:

1. **`cy ...

原计算方式是1 - sin( TWOPI * i / NUM),改成1 + 后倒过来了,这个是为啥

FishC 发表于 2025-1-12 21:37:28

1006150804 发表于 2025-01-12 21:37
FishC 发表于 2025-1-12 21:34
在这个代码片段中,`a ...

将计算方式从 `1 - sin(TWOPI * i / NUM)` 改为 `1 + sin(TWOPI * i / NUM)`,确实会导致正弦波的方向发生变化。让我们来分析一下原因:

1. **`1 - sin(...)`:** 这个计算方式会将正弦波的最高点(1)映射为 0,最低点(-1)映射为 2。这样,正弦波的波峰在下,波谷在上,形成一个倒置的正弦波。

2. **`1 + sin(...)`:** 这个计算方式将正弦波的最低点(-1)映射为 0,最高点(1)映射为 2。这样,正弦波的波峰在上,波谷在下,形成一个正常的正弦波。

因此,改变计算方式的符号从减号变为加号,实际上是将正弦波在垂直方向上翻转了180度。这样,波的方向就从倒置变为正常。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

1006150804 发表于 2025-1-12 21:45:44

FishC 发表于 2025-1-12 21:37
将计算方式从 `1 - sin(TWOPI * i / NUM)` 改为 `1 + sin(TWOPI * i / NUM)`,确实会导致正弦波的方向 ...

是因为我屏幕的坐标轴方向跟正弦曲线坐标轴方向相反的原因吗

FishC 发表于 2025-1-12 21:45:55

1006150804 发表于 2025-01-12 21:45
FishC 发表于 2025-1-12 21:37
将计算方式从 `1 - si ...

是的,正如您所猜测的,屏幕的坐标轴方向与通常数学中的坐标轴方向是相反的,这是导致这种变化的主要原因。

在计算机图形学中:

- 屏幕坐标的 y 轴是向下的。这意味着 y 值增加时,点在屏幕上向下移动。
- 数学中的笛卡尔坐标系 y 轴是向上的,这意味着 y 值增加时,点向上移动。

因此,当你使用 `1 - sin(...)`:

- 正弦曲线的波峰(sin 值接近于 1)被映射到较小的 y 值(接近 0 的位置),在屏幕上表现为波峰在下。

而使用 `1 + sin(...)`:

- 正弦曲线的波峰被映射到较大的 y 值(接近 2 * cyClient / 2 的位置),在屏幕上表现为波峰在上。

这就是为什么在屏幕上导致正弦曲线方向相反的原因。通过改变这部分代码,可以手动调节正弦曲线在屏幕上显示的方向。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

1006150804 发表于 2025-1-12 21:52:21

FishC 发表于 2025-1-12 21:45
是的,正如您所猜测的,屏幕的坐标轴方向与通常数学中的坐标轴方向是相反的,这是导致这种变化的主要原 ...

(1 + sin( TWOPI * i / NUM))这个我理解了,为什么又要再乘以 cyClient /2

FishC 发表于 2025-1-12 21:52:32

1006150804 发表于 2025-01-12 21:52
FishC 发表于 2025-1-12 21:45
是的,正如您所猜测的 ...

再乘以 `cyClient / 2` 是为了将正弦波的 y 值映射到屏幕的像素坐标上。解释如下:

1. **正弦函数的原始范围:** `1 + sin(...)` 的结果范围在 0 到 2 之间。

2. **调整幅度以适应屏幕:** 为了在屏幕显示上适当地展示这个正弦波,我们需要将这个范围映射到实际的屏幕像素值。通过乘以 `cyClient / 2`,我们可以将正弦波调整为适合于屏幕显示的高度。

3. **垂直居中显示:** `cyClient` 通常代表可用显示区域的高度。当我们使用 `cyClient / 2` 进行缩放,将波的范围设置为 0 到 `cyClient` 的一半。再加上这个中心参考点 `cyClient / 2`,就能确保正弦波垂直居中,既不会超出屏幕顶部,也不会超出屏幕底部。

这样做整体上会将正弦波居中在屏幕的垂直方向上,并根据屏幕的尺寸自适应地绘制出来。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 正弦曲线