簡體   English   中英

制作SINE WAVE程序

[英]Making a SINE WAVE program

我正在編寫一個用於在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開始,它基本上是整數除法行為的重復

簡而言之:除法運算符同時使用兩個操作數,並以足夠大且精確的類型返回值,以容納任何操作數。 因此,整數除法將始終產生整數結果,因為任何整數都足夠精確以容納整數。 如您所知,整數除法可能會得出實數值,因此至少一個操作數必須是實數。 例如#define TWOPI (2*(22.0/7)) // implicit conversion#define TWOPI (2*((float)22/7) // explicit conversion

  1. C提供了兩種類型的容器變量:數組和結構。 數組是具有相同類型的值的集合,而結構是具有任意類型的值的集合。 使用[]運算符訪問array的成員並提供元素的索引(將array[0]偏移0的元素,得到第一個元素)。 使用訪問結構. 運算符(或-> ),提供元素的名稱
    因此, apt[i]基本含義是“從apt偏移了i的數組中獲取一個元素”,換句話說就是“從名為apt數組中獲取第i+1個元素”。 添加.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 / TWOPI / 10等TWOPI sin()期望其自變量為弧度和“全”正弦波(一個周期)在區域[0; 2π]。 因此,乘以2 PI基本上意味着您代表一個正弦波的一個周期。 將其更改為4 PI將導致2個周期的正弦波。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM