日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? 搞過計算機圖像的人都知道,圖像中的每一個像素通常為一個整型數,它可以分成4個無符號的char類型,以表示其RGBA四個分量。一幅圖像可以看做是一個二維整型數組。這里我會生成一個float數組,其數組大小為1000000,剛好1000*1000,數組內的浮點數的數值范圍在0到1000.0之間,呈等差數組排列,相鄰兩數的差為0.001。然后將其每一個浮點數強制轉化成一個整型數或三個unsigned char型,以決定像素的RGB三個通道分量,看看其生成的圖像是什么樣子。

? ? ? 前幾天寫了一篇文章是在C語言中使用異或運算交換兩個任意類型變量,引來某人的質疑,說什么“指針的強制類型轉換有一定限制,不是你想怎么轉就怎么轉的,結果可能會出錯的”。用這種莫須有的話來否定我的代碼。為嘲笑他的無知,我特意寫出這種用強制指針類型轉換生成圖像的算法。

先上C代碼:

#include <iostream>
#include <cmath>
#include <cstdlib>#define DIM 1000void pixel_write(int,int);
FILE *fp;int main()
{fp = fopen("image.ppm","wb");if (!fp){return -1;}fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);for(int j=0;j<DIM;j++){for(int i=0;i<DIM;i++){pixel_write(i,j);}}fclose(fp);return 0;
}void pixel_write(int i, int j)
{static unsigned char color[3];float t = j + i*0.001f;memcpy(color, &t, 3);fwrite(color, 1, 3, fp);

// 其實更簡單粗爆的方式是
     //fwrite(&t, 1, 3, fp);
}

? ? ? 代碼運行后會生成一種PPM格式的圖像,如下圖所示:

? ? ? 圖像多少有點分形的感覺。PPM格式的圖像不太常見,它是一種非常簡單的圖像格式。在我寫的軟件Why數學圖像生成工具中可以查看,當然我也將該圖像的生成算法寫到這個軟件中,相關代碼如下:

#ifndef _PixelFloatConvertInt_H_
#define _PixelFloatConvertInt_H_// --------------------------------------------------------------------------------------

#include "IPixelEquation.h"// --------------------------------------------------------------------------------------class CPixelFloatConvertInt : public IPixelEquation
{
public:CPixelFloatConvertInt(){m_width = 1000;m_height = 1000;}const char*     GetName() const{return "Float Convert Int";}unsigned int    CalculatePixel(unsigned int x, unsigned int y){float t = y + x*0.001f;unsigned int rst = *(unsigned int*)&t;rst |= 0xff000000;return rst;}
};// --------------------------------------------------------------------------------------#endif

使用Why數學圖像生成工具可以查看該圖像的紅綠藍三個分量:

R通道圖:

G通道圖:

B通道圖:

代碼稍做修改,分形效果更為明顯:

    unsigned int    CalculatePixel(unsigned int x, unsigned int y){float t = y/4+ x*0.001f;unsigned int rst = *(unsigned int*)&t;rst |= 0xff000000;return rst;}

?

轉載于:https://www.cnblogs.com/WhyEngine/p/4051001.html

總結

以上是生活随笔為你收集整理的C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。