[英]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) )時,該圖是正方形的,但是兩者相同,因此更精確為什么會這樣。
這些東西在書中沒有解釋,所以我問你。
簡而言之:除法運算符同時使用兩個操作數,並以足夠大且精確的類型返回值,以容納任何操作數。 因此,整數除法將始終產生整數結果,因為任何整數都足夠精確以容納整數。 如您所知,整數除法可能會得出實數值,因此至少一個操作數必須是實數。 例如#define TWOPI (2*(22.0/7)) // implicit conversion
或#define TWOPI (2*((float)22/7) // explicit conversion
。
[]
運算符訪問array的成員並提供元素的索引(將array[0]
偏移0的元素,得到第一個元素)。 使用訪問結構.
運算符(或->
),提供元素的名稱 。 apt[i]
基本含義是“從apt
偏移了i的數組中獲取一個元素”,換句話說就是“從名為apt
數組中獲取第i+1
個元素”。 添加.x
表示“好,因為apt
的元素包含其他容器,請使用名為x
的元素”,這方便地表示正弦波中該點的x坐標。 編輯[解釋數學]:
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.