最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用C語言輸出3D立體感心形圖詳解

 更新時(shí)間:2021年12月12日 12:05:58   作者:Code_流蘇  
其實(shí)我們在程序中也有很多樂趣的,只是很多人不善于發(fā)現(xiàn),這篇文章主要給大家介紹了關(guān)于C語言輸出3D立體感心形圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

首先我先在每行(除空白以及{}外)代碼上標(biāo)上序號(無序號源碼放在了文末)

#include <stdio.h>
#include <math.h>

float f(float x, float y, float z) 
{
    float a = x*x + 9.0f/4.0f*y*y + z*z - 1;
    return a*a*a - x*x*z*z*z - 9.0f/80.0f*y*y*z*z*z;
}

float h(float x, float z) 
{
    for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
    {
        if (f(x, y, z) <= 0.0f)
            return y;
    }
    return 0.0f;
}

int main() 
{
    for (float z = 1.5f; z > -1.5f; z -= 0.1f) 
    {
        for (float x = -1.5f; x < 1.5f; x += 0.05f) 
        {
            float v = f(x, 0.0f, z);
            if (v <= 0.0f) 
            {
                float y0 = h(x, z);
                float ny = 0.01f;
                float nx = h(x + ny, z) - y0;
                float nz = h(x, z + ny) - y0;
                float nd = 1.0f / sqrtf(nx*nx + ny*ny + nz*nz);
                float d = (nx + ny - nz)*nd*0.5f + 0.5f;
                putchar(".:-=+*#%@"[(int)(d * 5.0f)]);
            }
            else
                putchar(' ');
        }
        putchar('\n');
    }
    return 0;
}

此次空白行以及語句塊{}空白花括號就不再多加贅述,簡要來說,就是為了整體的完整性與可讀性。

首先先說一下數(shù)值后面加f的問題,例如: y=1.0f 1.0后面的f用于強(qiáng)調(diào)前面的1.0是一個(gè)float量。 如果不加,默認(rèn)為double,加了之后,賦值給y時(shí)會(huì)自動(dòng)轉(zhuǎn)換為float 的。

逐行分析(除空白以及{}空白行外):

★頭文件部分:

1.頭文件的定義,可以說是老朋友了,stdio頭文件,非常常用的頭文件。

2.math頭文件,看到math,我們應(yīng)該會(huì)想起數(shù)學(xué)這個(gè)名字,其實(shí)沒錯(cuò),math.h頭文件定義了各種數(shù)學(xué)函數(shù)和一個(gè)宏。此處定義這個(gè)頭文件的原因就是用到了數(shù)學(xué)函數(shù)sqrtf。

★主函數(shù)外自定義函數(shù)部分:

3.定義了一個(gè)float類型的函數(shù)f,有三個(gè)float類型的形參x,y,z。

4.定義了一個(gè)float類型的變量a,將其賦值為x * x + 9.0f / 4.0f* y * y + z * z - 1;

5.返回一個(gè)表達(dá)式的值:return a *a * a - x * x * z * z * z - 9.0f/80.0f * y * y * z * z * z;

有關(guān)4和5的解釋:這其實(shí)跟上一次平面心形圖方程類型,只不過增加到了第三維度,此處為立體感心形方程:

x * x + 9.0f / 4.0f* y * y + z * z - 1;

return a *a * a - x * x * z * z * z - 9.0f/80.0f * y * y * z * z * z;

6.定義了一個(gè)float類型的函數(shù)h,有兩個(gè)float類型的形參x,z。

7.float定義y=1.0f,1.0后面的f用于強(qiáng)調(diào)前面的1.0是一個(gè)float量。 如果不加,默認(rèn)為double,加了之后,賦值給y時(shí)會(huì)自動(dòng)轉(zhuǎn)換為float 的。

y>=0.0f 判斷條件;

z-=0.1f; 也就是z=z-0.1f; 可以類比i-=2; 即 i=i-2;

8.if (f(x, y, z) <= 0.0f)條件判斷,調(diào)用函數(shù)f傳參x,y,z看函數(shù)返回值是否小于等于0,如果小于,說明y的值就對了,返回y的值到主函數(shù)。

9.見8.

10.return返回0.0f表示結(jié)束了該函數(shù)的執(zhí)行。

★主函數(shù)部分:

11.主函數(shù)的定義。

12.見7.分析

? ps:12和13不再多加闡述,和7道理相同。

13.見7.分析

14.float定義了一個(gè)v變量,接收了y=0.0f即y為定值時(shí)函數(shù)f的返回值。

15.條件判斷,看函數(shù)返回的v值是否小于等于0,如果小于等于0,則執(zhí)行語句塊內(nèi)容,輸出所設(shè)定字符。

16.由15可知,15成立則進(jìn)入語句16的執(zhí)行,此處定義變量y0來接收返回值。

17.定義浮點(diǎn)型變量ny,并給它賦值為0.01f。

18.float nx = h(x + ny, z) - y0; 經(jīng)h函數(shù)返回之后相當(dāng)于,nx=y(x變化)-y0;

19.float nz = h(x, z + ny) - y0; 經(jīng)h函數(shù)返回之后相當(dāng)于,nz=y(z變化)-y0;

20.float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz); 這里的nd的值就相當(dāng)于(x * x+y * y+z * z)開方再取倒數(shù)。

21.float d = (nx + ny - nz) * nd * 0.5f + 0.5f; d值相當(dāng)于 d=(x+y-z)*1.0f/sqrtf(x * x+y * y+z * z)+0.5f。

22.putchar(".:-=+*#%@"[(int)(d * 5.0f)]); 輸出所設(shè)定字符,更好地呈現(xiàn)出立體感心形。

關(guān)于17——22這些都是為了更好的呈現(xiàn)立體感圖形所寫,關(guān)聯(lián)到輸出的位置,輸出的形狀等多個(gè)方面,可以說,是立體感心形代碼中核心代碼之一(而且是很關(guān)鍵的)。

23.if else中else否則部分;

24.如果執(zhí)行else語句,則輸出空白;

25.輸出換行;

26.return 0; return語句結(jié)束main()函數(shù)的執(zhí)行,把0返還給操作系統(tǒng)。

無序號源碼:

#include <stdio.h>
#include <math.h>

float f(float x, float y, float z) 
{
    float a = x*x + 9.0f/4.0f*y*y + z*z - 1;
    return a*a*a - x*x*z*z*z - 9.0f/80.0f*y*y*z*z*z;
}

float h(float x, float z) 
{
    for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
    {
        if (f(x, y, z) <= 0.0f)
            return y;
    }
    return 0.0f;
}

int main() 
{
    for (float z = 1.5f; z > -1.5f; z -= 0.1f) 
    {
        for (float x = -1.5f; x < 1.5f; x += 0.05f) 
        {
            float v = f(x, 0.0f, z);
            if (v <= 0.0f) 
            {
                float y0 = h(x, z);
                float ny = 0.01f;
                float nx = h(x + ny, z) - y0;
                float nz = h(x, z + ny) - y0;
                float nd = 1.0f / sqrtf(nx*nx + ny*ny + nz*nz);
                float d = (nx + ny - nz)*nd*0.5f + 0.5f;
                putchar(".:-=+*#%@"[(int)(d * 5.0f)]);
            }
            else
                putchar(' ');
        }
        putchar('\n');
    }
}

希望這篇文章對你有所幫助!

總結(jié)

到此這篇關(guān)于如何利用C語言輸出3D立體感心形圖的文章就介紹到這了,更多相關(guān)C語言輸出3D立體感心形圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++面試題字符串拷貝函數(shù)示例

    c++面試題字符串拷貝函數(shù)示例

    這個(gè)也算是企業(yè)招工里面比較常見的一道筆試面試題了,非常簡單。個(gè)人覺得考的主要是對指針使用的熟練程度,還有對字符串類內(nèi)部原理的掌握程度
    2013-12-12
  • c++中的string常用函數(shù)用法總結(jié)

    c++中的string常用函數(shù)用法總結(jié)

    以下是對c++中的string常用函數(shù)的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • 詳解C++ STL中vector擴(kuò)容機(jī)制

    詳解C++ STL中vector擴(kuò)容機(jī)制

    vector是表示可以改變大小的數(shù)組的序列容器,就像數(shù)組一樣,vector對其元素使用連續(xù)的存儲(chǔ)位置,這篇文章將給大家詳細(xì)介紹C++ STL中vector擴(kuò)容機(jī)制,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 如何在二叉樹中找出和為某一值的所有路徑

    如何在二叉樹中找出和為某一值的所有路徑

    本篇文章是對在二叉樹中找出和為某一值的所有路徑方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 輸入3個(gè)字符串,將它們按照字母由大到小排序(示例代碼)

    輸入3個(gè)字符串,將它們按照字母由大到小排序(示例代碼)

    我們可以用string方法定義字符串變量。以下是具體實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 一起聊聊C++中的四種類型轉(zhuǎn)換符

    一起聊聊C++中的四種類型轉(zhuǎn)換符

    這篇文章主要是想喝大家一起聊聊來C++中的四種類型轉(zhuǎn)換符?:const_cast、reinterpret_cast、dynamic_cast和static_cast,感興趣的可以了解一下
    2022-07-07
  • Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn)

    Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn)

    這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn),這是一個(gè)非常值得研究的問題,需要的朋友可以參考下
    2014-09-09
  • C++深入淺出講解缺省參數(shù)

    C++深入淺出講解缺省參數(shù)

    所謂缺省參數(shù),顧名思義,就是在聲明函數(shù)的某個(gè)參數(shù)的時(shí)候?yàn)橹付ㄒ粋€(gè)默認(rèn)值,在調(diào)用該函數(shù)的時(shí)候如果采用該默認(rèn)值,你就無須指定該參數(shù)。缺省參數(shù)使用主要規(guī)則:調(diào)用時(shí)你只能從最后一個(gè)參數(shù)開始進(jìn)行省略,換句話說,如果你要省略一個(gè)參數(shù),你必須省略它后面所有的參數(shù)
    2022-07-07
  • C語言多媒體框架GStreamer使用教程深講

    C語言多媒體框架GStreamer使用教程深講

    GStreamer 是用來構(gòu)建流媒體應(yīng)用的開源多媒體框架(framework),其目標(biāo)是要簡化音/視頻應(yīng)用程序的開發(fā),已經(jīng)能夠被用來處理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多種格式的多媒體數(shù)據(jù)
    2022-07-07
  • FFmpeg實(shí)現(xiàn)音頻漸響效果參數(shù)值詳解

    FFmpeg實(shí)現(xiàn)音頻漸響效果參數(shù)值詳解

    這篇文章主要為大家介紹了FFmpeg實(shí)現(xiàn)音頻漸響效果參數(shù)值詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評論

寿光市| 古丈县| 文山县| 石景山区| 鞍山市| 新河县| 扎兰屯市| 鄂伦春自治旗| 图们市| 沁水县| 南宁市| 高雄县| 吉水县| 皮山县| 西乌珠穆沁旗| 屏山县| 威信县| 稻城县| 思南县| 惠州市| 孟州市| 罗定市| 紫金县| 宜章县| 贺州市| 基隆市| 香河县| 台南市| 辰溪县| 阿拉善左旗| 岑溪市| 常德市| 耿马| 南木林县| 涞水县| 铜鼓县| 锦屏县| 禹州市| 盘锦市| 永顺县| 石河子市|