乾物!ピギーペッパをC言語(ソースコードを添付)で描いてください。突く必要はありません!

C言語を使用して子豚のページを描画し、符号付き距離フィールド(SDF)を使用して円を表す方法を共有します :file:/// C:\ Users \ Administrator.WIN-

STED6B9V5UI \ AppData \ Local \ Temp \ ksohtml9656 \ wps19.pngは引き続きこのメソッドを使用して形状を表現しますが、今回はASCII文字| / = \を使用して形状の外枠を描画し、内部を塗りつぶします。これ:=====

// ..... \\

|| ....... ||

\\ ..... //

   ===== SDFの勾配は、SDFが最も変化する方向を表します。この方向を使用して、使用する文字を決定できます。file:/// C:\ Users \ Administrator.WIN-

STED6B9V5UI \ AppData \ Local \ Temp \ ksohtml9656 \ wps20.png差によってSDFの勾配近似を取得し、atan2()を使用して勾配の角度を見つけます:file:/// C:\ Users \ Administrator.WIN -

STED6B9V5UI \ AppData \ Local \ Temp \ ksohtml9656 \ wps21.jpgは単純にC言語で実装されています。キャンバスで、半径0.8、外枠0.1の円を描きます:file:/// C:\ Users \ Administrator .WIN-


\AppData\Local\Temp\ksohtml9656\wps22.jpg #include #include #define T doubleT f(T x, T y) {

    return sqrt(x * x + y * y) - 0.8f;}char outline(T x, T y) {

    T delta = 0.001;

    if (fabs(f(x, y)) < 0.05) {

        T dx = f(x + delta, y) - f(x - delta, y);

        T dy = f(x, y + delta) - f(x, y - delta);

        return "|/=\\|/=\\|"[(int)((atan2(dy, dx) / 6.2831853072 + 0.5) * 8 + 0.5)];

    }

    else if (f(x, y) < 0)

        return '.';

    else

        return ' ';}int main() {

    for (T y = -1; y < 1; y += 0.05, putchar('\n'))

        for (T x = -1; x < 1; x += 0.025)

            putchar(outline(x、y));}コードは左右に移動できます!  file:/// C:\ Users \ Administrator.WIN-STED6B9V5UI \ AppData \ Local \ Temp \ ksohtml9656 \ wps23.png次に、複数の円を描くことができます。

それらを適切に回転およびスケーリングし、構造的な立体幾何学と組み合わせて、19行のコードでPeppa Pigを描画できます。コードは左右に移動できます!

▼// ASCII Peppa Pig by Milo Yip#include #include #include #define T double

T c(T x,T y,T r){return sqrt(x*x+y*y)-r;}

T u(T x,T y,T t){return x*cos(t)+y*sin(t);}

T v(T x,T y,T t){return y*cos(t)-x*sin(t);}

T fa(T x,T y){return fmin(c(x,y,0.5),c(x*0.47+0.15,y+0.25,0.3));}

T no(T x,T y){return c(x*1.2+0.97,y+0.25,0.2);}

T nh(T x,T y){return fmin(c(x+0.9,y+0.25,0.03),c(x+0.75,y+0.25,0.03));}

T ea(T x,T y){return fmin(c(x*1.7+0.3,y+0.7,0.15),c(u(x,y,0.25)*1.7,v(x,y,0.25)+0.65,0.15));}

T ey(T x,T y){return fmin(c(x+0.4,y+0.35,0.1),c(x+0.15,y+0.35,0.1));}

T pu(T x,T y){return fmin(c(x+0.38,y+0.33,0.03),c(x+0.13,y+0.33,0.03));}

T fr(T x,T y){return c(x*1.1-0.3,y+0.1,0.15);}

T mo(T x,T y){return fmax(c(x+0.15,y-0.05,0.2),-c(x+0.15,y,0.25));}

T o(T x,T y,T(*f)(T,T),T i){T r=f(x,y);return fabs(r)<0.02?(atan2(f(x,y+1e-3)-r,f(x+1e-3,y)-r)+0.3)*1.273+6.5:r<0?i:0;}

T s(T x,T y,T(*f)(T,T),T i){return f(x,y)<0?i:0;}

T f(T x,T y){return o(x,y,no,1)?

fmax(o(x,y,no,1),s(x,y,nh,12)):fmax(o(x,y,fa,1),fmax(o(x,y,ey,11),fmax(o(x,y,ea,1),fmax(o(x,y,mo,1),fmax(s(x,y,fr,13),s(x,y,pu,12))))));}

int main(int a,char**b){for(T y=-1,s=a>1?strtod(b,0):1;y<0.6;y+=0.05/s,putchar('\n'))for(T x=-1;x<0.6;x+=0.025/s)putchar(" .|/=\\|/=\\| @!"

[(int)f(u(x,y,0.3),v(x,y,0.3))]);}file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml9656\wps24.png 2倍:

file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml9656\wps25.png 4倍:

file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml9656\wps26.png 8倍:

file:///C:\Users\Administrator.WIN-STED6B9V5UI\AppData\Local\Temp\ksohtml9656\wps27.png 

どうですか?今会っていますか?このペッパを動かすこともできます

さらに、プログラミング能力を向上させたい場合は、C言語とC ++プログラミングを学んでください。カーブで追い越し、一歩速く!ここでお手伝いできるかもしれません〜

UPは、C / C ++プログラミングの学習に関するビデオチュートリアルをホームページにアップロードしています。興味のある方、または学習している方は、ぜひご覧ください。お役に立てれば幸いです〜

共有(ソースコード、実際のプロジェクトビデオ、プロジェクトノート、基本的な入門チュートリアル)

キャリアを変えてプログラミングを学び、自分で考えるよりも早く学び成長するために、より多くの情報を使用するパートナーを歓迎します!

プログラミング学習:

プログラミング学習:

 

おすすめ

転載: blog.csdn.net/weixin_45713725/article/details/115006684