大三的这前半个学期了,又遇上了这个精通(滑稽) Delphi的老师,人还挺好的其实。

关于他对分辨率的吐槽呀,对Delphi的赞美啊,都是非常幽默的。另外我倒是很欣赏他对他的笔记本的保养【dell i7 920xm的工作站吧估计】。

好了,接下来他上课,基本上就是敲代码(实践)。为了迎合我们专业没学过Pascal的条件,他决定用c++ builder 4【后来才知道的,

实在是有点老了】。之前的我确实是费了很多劲,花了很多时间才找到的相关的参考资料。

 

首先,一切的绘画都基于画布【Canvas】之上,我们操作的是Canvas->Pixels[x][y],其中x,y,就是坐标,单位是px。

另外,由于直接操作显示中的画布会导致重复刷新,效率很低,我们可以建立TBitmap【内存里】,在TBitmap上绘图,然后用

CopyRect复制到要显示的画布上即可【新建时,注意指定TBitmap尺寸】。

比如,在窗口上描一个蓝色的正方形:

for(int x = 0;x < 100;x++)
	for(int y = 0;y < 100;y++)
		Form1->Canvas->Pixels[x][y] = clBlue;

  下面给出一个比较简单的直线绘制函数。

void DrawLine(TCanvas *c, int x1, int y1 , int x2 , int y2);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    bmp = new Graphics::TBitmap();
    bmp->Width = 202;
    bmp->Height = 202;
    randomize();
    SetTime();
    for(int i = 0; i < 20 ; i++)
    {
        DrawLine(bmp,1,1,201,10.6 * i - random(2));
        DrawLine(bmp,1,1,10.6 * i - random(2),201);
    }
    Form1->Canvas->CopyRect(Rect(0,0,201,201),bmp->Canvas,Rect(1,1,201,201));
}

void DrawLine( TCanvas *c,int x1, int y1 , int x2 , int y2)
{
    float k = 0;
    if(x2 != x1)
        k = ( y2 - y1 ) * 1.0 / ( x2 - x1);
    //draw
    if(k > 1)
        for(int i = 1; i <= y2 ; i++ )
            c->Pixels[(int)((i - y1) / k) - x1][i] = clBlack;
    else
        for(int i = 1; i <= x2 ; i++ )
            c->Pixels[i][(int)((i - x1) * k) + y1] = clBlue;
}