バックグラウンド
絵を使って、ゆっくりと窓にハートの形を描きます。
インターネットを検索しましたが、比較的既成のアルゴリズムが見つからず、非常に美しく見える関数が見つかりました: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);
}