processing
カレンダー
初投稿
Fencers

Processsingでマンスリーカレンダーを作ろう


はじめに

初めまして、DaiMmotoです。

今回はProcessingを使って、西暦年と月を入力するとひと月分のマンスリーカレンダーが出力されるプログラムを作ります。


注意

ProcessingについてはProcesssing 3.4 の Java モードを使用しています。


考え方


必要な項目


  • 各月の日数


    • 2月は閏年か、否かで変わる。

    • その他の月は決まっている。

    • 対応は下の図




日数
備考

日数
備考

1
31

2
28 or 29
閏年なら29

3
31

4
30

5
31

6
30

7
31

8
31

9
30

10
31

11
30

12
31


  • 各月の朔日 (firstday) の曜日


    • 朔日の曜日は各月でずれていくため、対応させる。



  • 閏年の判定条件


    • 次の条件1または条件2のとき、その年は閏年である。




条件

1. 4 で割り切れて、かつ 100 で割り切れない年

2. 400 で割り切れる年


↑詳しくは下の参考先をご覧ください


↓いざ、実装!!!↓


code

カレンダーのコード

final int YEAR  = 2019; // 年

final int MONTH = 1; // 月
int w; // 曜日
int d = 1; // 日付

// 日~土曜日 (0 ~ 1) に対応
String[] week = {
"S", "M", "Tu", "W", "Th", "F", "S"
};

void setup() {
size(400, 340);
colorMode(HSB); // 色の設定
background(240);

// 月
fill(MONTH % 255, 255, 210);
textAlign(CENTER);
textSize(48);
text(str(MONTH), width / 2, 55);

// 年
fill(YEAR % 255, 255, 210);
textSize(20);
text(str(YEAR), 310, 47.5);

w = firstdayOfTheWeek(YEAR, MONTH);

// 曜日
for (int i = 0; i < 7; i++) {
fill(i * 50 * 255 / width, 255, 210);
text(week[i], (i + 1) * 50, 95);
}

// 日付
translate(0, 135);
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
if (d > lengthOfMonth(YEAR, MONTH)) { break; }
fill(j * 50 * 255 / width, 255, 210);
// 朔日を曜日の分だけ移動
if (w < 7) {
j = w;
fill(j * 50 * 255 / width, 255, 210);
text(str(d), (j + 1) * 50, i * 35);
w++;
} else {
text(str(d), (j + 1) * 50, i * 35);
}
d++;
}
}
}

// y年m月1日の曜日判定
int firstdayOfTheWeek(int y, int m) {
int f = y + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400;
for (int i = 1; i < m; i++) {
f += lengthOfMonth(y, i);
}
return f % 7;
}

// y年m月の日数
int lengthOfMonth(int y, int m) {
if (m == 2) {
if (isLeapYear(y)) { return 29; }
return 28;
}
if (8 <= m) { m++; }
return 30 + (m % 2);
}

// 閏年判定
boolean isLeapYear(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

もっと簡潔にできそう:thinking:

年単位のカレンダーにするときには、 translate() を使わない方がよさげ。



実行

monthly1.png

monthly.png

↑実行するとこんな感じです。


参考