座標を回転しながら星を描きます



回転関数を使って VC++ の Polygon() 関数の座標を設定して星を描きます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクト(Star)を作成して下さい。
    math.h をインクルードします。
        #include <math.h>
        
  2. 回転軸の中心を 0,0 として、座標を回転する rot() 関数です。
        // 回転計算
        void  rot(float rt, float px, float py, POINT *pt)
        {   pt->x= (LONG)(px*cos(rt/180*3.14)-py*sin(rt/180*3.14));
            pt->y= (LONG)(px*sin(rt/180*3.14)+py*cos(rt/180*3.14));
        }
        
  3. rot() 関数のパラメータの説明です。
    引数 説明
    rt 回転角度
    px 元のX座標
    py 元のY座標
    *pt 結果を格納する領域
  4. 塗りつぶした星を描画します。
          POINT   pont[10];
          int     i;
          HBRUSH      hBrush,hOldBrush;
          for(i=0; i<10; i++)
          {  if(i%2==1)   //星の頂点座標を設定する rot()関数の呼び出し  
             else         //星の内側の座標を設定する rot()関数の呼び出し
             pont[i].x+= 120;
             pont[i].y+= 120;
          }
          hBrush= CreateSolidBrush(RGB(200,0,0));
          hOldBrush= (HBRUSH)SelectObject(hdc,hBrush);
          Polygon(hdc,pont,10);
          SelectObject(hdc,hOldBrush);
          DeleteObject(hBrush);
        

【演習】

  1. ページ先頭の星型(大きくしながら回転する)を描いてみて下さい。
  2. 次の画像を描画して下さい。

【説明】

回転座標の説明は Windows Guid を参照して下さい。
半径をパラメータにした時の WM_PAINT です。
演習の画像のように、乱数で色を設定してみました。
    case WM_PAINT:
        hdc = BeginPaint (hWnd, &ps);
        // TODO: この位置に描画用のコードを追加してください...
        // 星形を演習の画像のように分割して色を塗る
        POINT   pont[24];
        int     i;
        HBRUSH      hBrush,hOldBrush;
        time_t      nowtime;
        time(&nowtime);
        srand(nowtime&0Xff);
        ZeroMemory(pont,sizeof(POINT)*24);
        // 回転座標を設定する
        for(i=0; i<6; i++)
        {   rot(i*72.0F,38.0F,&pont[i*4]);
            rot(i*72.0F+36.0F,100.0F,&pont[i*4+2]);
        }
        // 回転座標の中心が 0,0 なのでウインドウの中央に移動
        for(i=0; i<24; i++)
        {   pont[i].x+= 240;
            pont[i].y+= 170;
        }
        // 乱数で色を設定して、星型を描画
        hBrush= CreateSolidBrush(RGB(rand()&0XFF,rand()&0XFF,rand()&0XFF));
        hOldBrush= (HBRUSH)SelectObject(hdc,hBrush);
        for(i=0; i<10; i++)
        {   Polygon(hdc,pont+i*2,3);
            DeleteObject(hBrush);
            hBrush= CreateSolidBrush(RGB(rand()&0XFF,rand()&0XFF,rand()&0XFF));
            SelectObject(hdc,hBrush);
        }
        SelectObject(hdc,hOldBrush);
        DeleteObject(hBrush);

        EndPaint( hWnd, &ps );
        break;

超初心者のプログラム入門(Win32API C++)