2013-06-27 59 views
0

我正在一个程序,用于显示在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是客户端的宽度区域IIN低位字和cyClient是在高字客户区的高度,TWOPI如(2 * 3.1459)

全局定义我与程序的问题是

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

2.当我定义TWOPI为的#define TWOPI(2 *(22/7))代替(的#define TWOPI(2 * 3.1459)),则图形是正方形,但两者的东西相同,相反,这是更准确的,为什么发生这种情况。

这些东西没有在书中解释,所以我问你。

+4

要回答第二个问题(22/7)是3(整数除法),(22.0/7.0)是Pi(浮点除法)的近似值。 –

+0

对π的更好逼近是3.14159(3.1459错误很大,超过0.13%太大),但也可以使用355.0/113.0(它比3.14159更精确一些)。 –

+3

仅供参考您[可以通过''](http://msdn.microsoft.com/zh-cn/library/4hwaceh6.aspx) –

回答

1

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

简而言之:除法运算符取两个操作数,并返回一个大小足够精确的值来存放任何操作数。因此,整数除法总是会产生整数结果,因为任何整数都足够精确以保存整数。如您所知,整数除法可能会产生实际值,因此至少有一个操作数必须是实数。例如#define TWOPI (2*(22.0/7)) // implicit conversion#define TWOPI (2*((float)22/7) // explicit conversion。这就解释了方形图形

  1. Ç提供两种类型的容器变量:阵列和结构体。数组是具有相同类型的值的集合,结构是具有任意类型的值的集合。使用[]运算符访问数组的成员,并提供元素的索引(array[0],用于0的元素offseted,产生第一个元素)。使用.运营商(或->)访问结构,提供名称的元素。
    所以apt[i]基本上是指“从i偏离的数组apt中取元素”,或换句话说,“从名为apt的数组中取第012元素”。添加一个.x意味着“没问题,因为apt的元素包含其他容器,请取一个名为x的元素”,这便于表示正弦波中点的x坐标。
    与.y相同,就在那里,我们有一个正弦函数的数学表示,可变比例。

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

+0

我无法理解第1部分 - 罪(TWOPI * i/NUM)。为什么我们减去1,为什么我们使用2pi而不是pi。请问任何人都可以帮忙 – Freedom911