日本の政界に変化があるようです。まだ終着点は分かりませんが、東アジア情勢が私のような素人目にも一区切りした感じなので、少しほっとした感じになったからでしょう。
これ以上、言いませんよ。本ブログで政治ネタを出すのは、春香たちのいる芸能界に影響がある部分だけです。
例の古典幾何学本に関連してコンピュータグラフィックスのソフトを検討し始めています。本命はOpenGLによるいくつかの3Dプログラムです。そちらもぼちぼちと。
しかし、その前に手軽にグラフィックできる態勢を取りたかったので、Windowsの絵のファイル形式の一つ、bmpファイルを作るC言語プログラムを検討しました。
というのも、その昔のパソコンはBASICで画面にドットを打つなど簡単だったのに、今のパソコンは準備がいやほどかかります。マウスでドットを打つ話では無くて、プログラムから、つまり数学関数のグラフを描いたりしたい訳。
単にbmpファイルを作るだけなら簡単でした…、orz。巻末に掲載します。
一つは256色パレットのもので、画面の1ドットが1バイトになるのが特徴です。もう一つは1ドット24bit、つまり三原色RGBが1バイト(8bit)ずつなので、3バイトが1ドットになる形式。要するにフルカラーです。
まあ、これだけでもドットごとに視線と図形が交わるかどうかを判定して、交わったら、それなりの色を塗る、この方針でも良い絵が出てくると思います。
しかし、むらむらと、ちょっと工夫すればさらに良くなるのではないかとの欲が湧いてきましたです。ほどほどにしないと、ひどいことになるのは分かっているつもりですが。
つまり、学術ですから計算機の整数(int、符号付き32bit)とかでは無く、倍精度浮動小数点数(double、64bit実数)のままで絵を描くと。ドットは整数ですから最終的には量子化されるのですが、途中経過は結構、アイデアの宝庫になるかも、と、邪推。
まず、0次元、つまり「点」は簡単です。xの値とyの値を整数化して、指定色で打てばおしまい。
1次元、つまり直線は…、長くなりそうなので、多分、続きます。
// ConsoleApplication5.cpp
// 200828; making 24bit color bmp file
#include "stdafx.h"
#include <math.h>
FILE *ftp;
errno_t err;
const int WT = 640; // width (mod 4 = 0) *** modify here
const int HT = 480; // height *** modify here
const int BZ = WT * HT * 3; // buffer size
const int FZ = BZ + 0x36; // file size
const double sq3 = sqrt(3.0);
const double rc = (double)HT * 0.3;
unsigned char b1[FZ]; // header*2; bitmap data
unsigned char cv(double x) { // 0.0 - 0.999 -> 0 - 255
x *= 256.0;
if (x >= 255.0) return 255;
if (x <= 0.0) return 0;
return (unsigned char)(floor(x));
}
void draw1(void) {
int ix, iy;
unsigned char *pc;
double x, y;
pc = b1 + 0x36;
for (iy = 0; iy < HT; iy++) {
y = (double)(iy - HT / 2) / rc;
for (ix = 0; ix < WT; ix++) {
x = (double)(ix - WT / 2) / rc;
*pc++ = cv((-sq3 * x - y + 2.0) / 4.0); // blue 0-255
*pc++ = cv((sq3 * x - y + 2.0) / 4.0); // green 0-255
*pc++ = cv(0.5 * y + 0.5); // red 0-255
}
}
}
int main()
{
unsigned int ux;
// writing hedder
b1[0x00] = 'B'; b1[0x01] = 'M';
b1[0x02] = FZ & 0xff; b1[0x03] = FZ >> 8 & 0xff; b1[0x04] = FZ >> 16 & 0xff; b1[0x05] = FZ >> 24;
b1[0x06] = 0; b1[0x07] = 0; b1[0x08] = 0; b1[0x09] = 0;
b1[0x0a] = 0x36; b1[0x0b] = 0; b1[0x0c] = 0; b1[0x0d] = 0;
b1[0x0e] = 0x28; b1[0x0f] = 0; b1[0x10] = 0; b1[0x11] = 0;
b1[0x12] = WT & 0xff; b1[0x13] = WT >> 8 & 0xff; b1[0x14] = WT >> 16 & 0xff; b1[0x15] = WT >> 24;
b1[0x16] = HT & 0xff; b1[0x17] = HT >> 8 & 0xff; b1[0x18] = HT >> 16 & 0xff; b1[0x19] = HT >> 24;
b1[0x1a] = 0x1; b1[0x1b] = 0; b1[0x1c] = 0x18; b1[0x1d] = 0;
b1[0x1e] = 0; b1[0x1f] = 0; b1[0x20] = 0; b1[0x21] = 0;
b1[0x22] = BZ & 0xff; b1[0x23] = BZ >> 8 & 0xff; b1[0x24] = BZ >> 16 & 0xff; b1[0x25] = BZ >> 24;
b1[0x26] = 0; b1[0x27] = 0; b1[0x28] = 0; b1[0x29] = 0;
b1[0x2a] = 0; b1[0x2b] = 0; b1[0x2c] = 0; b1[0x2d] = 0;
b1[0x2e] = 0; b1[0x2f] = 0; b1[0x30] = 0; b1[0x31] = 0;
b1[0x32] = 0; b1[0x33] = 0; b1[0x34] = 0; b1[0x35] = 0;
// making bitmap data b1[0x36] -
draw1();
// output file
err = fopen_s(&ftp, "t24.bmp", "wb");
for (ux = 0; ux < FZ; ux++) {
fputc(b1[ux], ftp);
}
err = fclose(ftp);
printf("complete\n");
return err;
}