心を描くためのより素朴で便利な方法

バックグラウンド

絵を使って、ゆっくりと窓にハートの形を描きます。

インターネットを検索しましたが、比較的既成のアルゴリズムが見つからず、非常に美しく見える関数が見つかりました:f(x)= x ^(2/3)+(0.9 *√(8-x ^ 2))sin(pi * a * x)、効果はここで見ることができます:https//www.zhihu.com/question/267069065およびhttps://www.bilibili.com/video/BV1DT4y1E7xW?p=1&share_medium = android&share_plat = android&share_source = COPY&share_tag = s_i&timestamp = 1592660301&unique_k = kCeiSJ

しかし、上記の関数で示した効果はまだ私の期待に応えていません。非常に低いハートの形を書く方法を見つけることしかできず、数学を忘れたことで自分を責めるだけです。

コード

// 参数分别是:gdi+的Graphics, 图像信息,绘制的起始位置的横、纵坐标,绘制偏移量,图片宽,高
void drawHeart(::Graphics * graphics, Image* image, int startx, int starty, int offset, int drawWidth, int drawHeight) {
    double posx = startx, posy = starty;
    double pi = acos(-1);
    // 这里可以画心的上半截
    for (double angle = 90; angle > -90;) {
        if (angle > 0) {
            angle -= (8 + max(pow(angle, 2) / 1000, 1));
            posx += offset * cos(pi / 180 * angle);
            posy -= offset * sin(pi / 180 * angle);
        }
        else if (angle > -90) {
            if (angle > -30) {
                angle -= 5;
            }
            else {
                angle -= 10;
            }
            angle = -angle;
            posx += offset * cos(pi / 180 * angle);
            posy += offset * sin(pi / 180 * angle);
            angle = -angle;
        }
        graphics->DrawImage(image, posx, posy, drawWidth, drawHeight);
        graphics->DrawImage(image, sw / 2 - (posx - sw / 2) - drawWidth, posy, drawWidth, drawHeight);
        pause();
    }

    // 这是画心的下半截
    while (posx > startx) {
        posx -= offset * cos(pi / 180 * 30);
        posy += offset * sin(pi / 180 * 60);
        graphics->DrawImage(image, posx, posy, drawWidth, drawHeight);
        graphics->DrawImage(image, sw / 2 - (posx - sw / 2) - drawWidth, posy, drawWidth, drawHeight);

        if (posy > sh) {
            break;
        }
    }
}

実際、私の心を綴るのは私です。

これが真ん中の大きな赤いハートです。これが私の絵の最終結果です。ウィンドウを半透明の効果で全画面に設定しただけなので、後ろのコードを見ることができます。これは、の絵の方法とは関係ありません。この心。もちろん、上記のパラメータはサイズを調整することができ、結果は異なりますが、すべてハート型です。

実際、上記のコードは外側の円でしかハートを描くことができず、トラブルを避けるために怠惰です。また、ハートの下半分を描く方法についても怠惰なので、円弧はなく、直線だけです。 。そして、10回サイクリングし、オフセットを減らし続けてそのような効果を得ました。数回サイクリングすると、次のサイクルと同じように、心臓がいっぱいになります。

            int offset = drawWidth /5 * 3;
            for (int i = 0; i < 10; i++) {
                drawHeart(&graphics, &image, startx, starty, offset, drawWidth, drawHeight);
                starty += drawHeight / 2 + i;
                offset -= min(2 * i, 2);
            }

 

おすすめ

転載: blog.csdn.net/x763795151/article/details/107308556