Skip to content

Instantly share code, notes, and snippets.

@ygkn
Created September 22, 2022 08:19
Show Gist options
  • Save ygkn/0ffd1fd47e1da60218939fb3506e4a8c to your computer and use it in GitHub Desktop.
Save ygkn/0ffd1fd47e1da60218939fb3506e4a8c to your computer and use it in GitHub Desktop.
String[] fontList = PFont.list();
PFont font;
String showText = "令和";
String findFont(String fontPattern) {
for (int i = 0; i < fontList.length; i++) {
String[] match = match(fontList[i], fontPattern);
if (match != null) {
return match[0];
}
}
return null;
}
void setup() {
size(300, 300);
String[] fontFallback = {
".*楷.*",
".*游明朝.*",
".*Noto Serif CJK JP.*",
".*明朝.*"
};
println("Finding available fonts...");
for (int i = 0; i < fontFallback.length; i++) {
String fontName = findFont(fontFallback[i]);
if (fontName != null) {
println("use this font: " + fontName);
font = createFont(fontName, 100);
textFont(font);
break;
}
}
}
void draw() {
smooth();
scale(5.0);
// body
fill(38, 42, 50);
noStroke();
beginShape();
vertex(17.69, 20.13);
bezierVertex(20.76, 18.88, 22.52, 15.62, 29.36, 20.13);
vertex(29.36, 43);
vertex(17.69, 43);
endShape(CLOSE);
// collar
fill(38, 42, 50);
stroke(16, 18, 24);
strokeWeight(0.4);
beginShape();
vertex(18.99, 21.28);
vertex(20.6, 22.22);
vertex(19.28, 24.16);
vertex(23.91, 31.72);
vertex(28.54, 24.07);
vertex(27.41, 22.37);
vertex(28.97, 21.43);
bezierVertex(24.76, 14.89, 21.45, 15.49, 19, 21.29);
endShape(CLOSE);
// shirt
fill(255);
noStroke();
beginShape();
vertex(21.39, 19.39);
vertex(23.89, 31.72);
vertex(26.63, 19.34);
endShape(CLOSE);
// tie
fill(97, 148, 206);
noStroke();
beginShape();
vertex(23.83, 21.14);
vertex(22.69, 22.47);
vertex(23.42, 23.4);
vertex(22.91, 26.9);
vertex(23.89, 31.73);
vertex(24.96, 26.91);
vertex(24.2, 23.37);
vertex(25.1, 22.46);
endShape(CLOSE);
// hair
noStroke();
fill(41, 35, 31);
beginShape();
vertex(16.25, 12.02);
bezierVertex(12.12, 2.52, 25.65, -2.67, 29.15, 4);
bezierVertex(32, 4.98, 32.78, 7.59, 31.35, 11.95);
bezierVertex(25.42, 23.55, 20.19, 19.65, 16.25, 12.02);
endShape(CLOSE);
// face
fill(255, 203, 160);
beginShape();
vertex(23.85, 19.87);
bezierVertex(19.56, 19.84, 18.54, 17.53, 17.36, 15.34);
bezierVertex(15.22, 15.42, 15.4, 14.59, 15.29, 13.42);
bezierVertex(15.18, 12.25, 16.08, 11.74, 17.36, 12.17);
bezierVertex(16.51, 4.52, 19.75, 3.3, 23.61, 3.3);
bezierVertex(28.19, 3.3, 31.09, 4.19, 30.82, 11.95);
bezierVertex(32.52, 11.85, 32.79, 12.55, 32.68, 13.51);
bezierVertex(32.56, 14.48, 32.04, 15.37, 30.55, 15.23);
bezierVertex(29.52, 18.23, 27.29, 19.63, 23.85, 19.87);
endShape(CLOSE);
// eyebrows
noFill();
stroke(56, 52, 47);
strokeWeight(0.5);
beginShape();
vertex(20.04, 9.23);
bezierVertex(20.58, 9.03, 21.11, 8.98, 21.79, 9);
endShape();
beginShape();
vertex(27.54, 9.23);
bezierVertex(26.99, 9.03, 26.46, 8.98, 25.78, 9);
endShape();
// nose
noStroke();
fill(186, 37, 71);
beginShape();
vertex(23.73, 14.43);
bezierVertex(23.58, 14.52, 23.51, 14.69, 23.48, 14.82);
bezierVertex(23.65, 14.8, 23.79, 14.78, 23.96, 14.81);
bezierVertex(23.91, 14.68, 23.86, 14.55, 23.73, 14.43);
endShape(CLOSE);
// eyes
noStroke();
fill(0);
ellipse(26.1, 12.2, 0.7, 0.7);
ellipse(21.6, 12.2, 0.7, 0.7);
// mouth
noFill();
stroke(183, 35, 67);
beginShape();
vertex(22.37, 16.72);
bezierVertex(23.3, 17.48, 24.26, 17.5, 25.26, 16.7);
endShape();
// nose
noStroke();
fill(224, 146, 98);
beginShape();
vertex(25.82, 15.89);
bezierVertex(26.9, 15.69, 26.91, 17.1, 26.59, 17.43);
bezierVertex(26.4, 16.92, 26.23, 16.3, 25.82, 15.89);
endShape(CLOSE);
//arms
noFill();
stroke(38, 42, 50);
strokeWeight(4);
line(18, 22, 34, 28);
line(30, 22, 46, 28);
// reiwa frame
fill(255);
stroke(166, 122, 85);
strokeCap(ROUND);
strokeJoin(ROUND);
strokeWeight(1.5);
rect(34, 15, 12, 16);
// reiwa text
fill(0);
noStroke();
textFont(font);
textSize(6);
textLeading(6);
text(showText, 37, 17, 7, 20);
// hands
pushMatrix();
translate(33, 25); // arm + (-1, -2)
noStroke();
fill(255, 201, 157);
beginShape();
vertex(0, 0);
bezierVertex(-1.1, 0.01, -1.13, 1.06, -1.07, 2.28);
bezierVertex(-1, 3.62, -1.1, 4.92, -0.1, 4.96);
bezierVertex(1.61, 5.02, 2.51, 4.05, 0.91, 3.77);
bezierVertex(1.96, 3.29, 2.15, 2.91, 0.82, 2.61);
bezierVertex(1.9, 2.38, 2.57, 1.57, 0.71, 1.3);
bezierVertex(2.53, 0.37, 1.1, -0.01, 0, 0);
endShape();
popMatrix();
pushMatrix();
translate(47.5, 25); // arm + (+1, -2)
noStroke();
fill(255, 201, 157);
beginShape();
vertex(0, 0);
bezierVertex(1.1, 0.01, 1.13, 1.06, 1.07, 2.28);
bezierVertex(0.99, 3.63, 1.1, 4.92, 0.09, 4.96);
bezierVertex(-1.62, 5.02, -2.52, 4.05, -0.92, 3.77);
bezierVertex(-1.97, 3.29, -2.15, 2.91, -0.82, 2.61);
bezierVertex(-1.91, 2.38, -2.58, 1.57, -0.72, 1.3);
bezierVertex(-2.53, 0.37, -1.1, -0.01, 0, 0);
endShape();
popMatrix();
/*
// mike
fill(0);
noStroke();
beginShape();
vertex(15.73,32.54);
bezierVertex(15.79,30.82,15.37,29.53,16.38,28.62);
endShape(CLOSE);
noFill();
stroke(0);
strokeWeight(0.4);
beginShape();
vertex(15.73,32.54);
bezierVertex(15.79,30.82,15.37,29.53,16.38,28.62);
endShape();
*/
noStroke();
fill(64, 54, 47);
rect(13, 40, 22, 10);
// desk
fill(169, 107, 63);
beginShape();
vertex(10, 35);
vertex(38, 35);
vertex(39, 37);
vertex(38, 41);
vertex(10, 41);
vertex(9, 37);
endShape(CLOSE);
rect(10, 46, 28, 10);
}
PFont font;
int canvasSize = 700;
int drawCount = 50;
float reiwaSize = canvasSize / 5;
class SugaCood {
PVector p;
PVector v;
PVector a;
float angle;
SugaCood() {
this.p = new PVector(random(0, width - reiwaSize), random(0, height - reiwaSize));
float angle = random(0, 2 * PI);
this.v = new PVector(2 * cos(angle), 2* sin(angle));
this.a = new PVector(0, 0);
this.angle = random(PI * 2);
}
void update() {
this.v.add(this.a);
this.p.add(this.v);
this.angle += 0.3;
if(0 >= this.p.x || this.p.x >= width - reiwaSize)
this.v.x = this.v.x * -1;
if(0 >= this.p.y || this.p.y >= height - reiwaSize)
this.v.y = this.v.y * -1;
}
}
SugaCood[] sugaCoods = new SugaCood[drawCount];
String[] gengohs = {
"令和",
"平成",
"昭和",
"大正",
"明治",
"慶応",
"元治",
"文久",
"万延",
"安政",
"嘉永",
"弘化",
"天保",
"文政",
"文化",
"享和",
"寛政",
"天明",
"安永",
"明和",
"宝暦",
"寛延",
"延享",
"寛保",
"元文",
"享保",
"正徳",
"宝永",
"元禄",
"貞享",
"天和",
"延宝",
"寛文",
"万治",
"明暦",
"承応",
"慶安",
"正保",
"寛永",
"元和",
"慶長",
"文禄",
"天正",
"元亀",
"永禄",
"弘治",
"天文",
"享禄",
"大永",
"永正",
"文亀",
"明応",
"延徳",
"長享",
"文明",
"応仁",
"文正",
"寛正",
"長禄",
"康正",
"享徳",
"宝徳",
"文安",
"嘉吉",
"永享",
"正長",
"応永",
"明徳",
"康応",
"嘉慶",
"至徳",
"永徳",
"康暦",
"永和",
"応安",
"貞治",
"康安",
"延文",
"文和",
"観応",
"貞和",
"康永",
"暦応",
"元中",
"弘和",
"天授",
"文中",
"建徳",
"正平",
"興国",
"延元",
"建武",
"正慶",
"元弘",
"元徳",
"嘉暦",
"正中",
"元亨",
"元応",
"文保",
"正和",
"応長",
"延慶",
"徳治",
"嘉元",
"乾元",
"正安",
"永仁",
"正応",
"弘安",
"建治",
"文永",
"弘長",
"文応",
"正元",
"正嘉",
"康元",
"建長",
"宝治",
"寛元",
"仁治",
"延応",
"暦仁",
"嘉禎",
"文暦",
"天福",
"貞永",
"寛喜",
"安貞",
"嘉禄",
"元仁",
"貞応",
"承久",
"建保",
"建暦",
"承元",
"建永",
"元久",
"建仁",
"正治",
"建久",
"文治",
"元暦",
"寿永",
"養和",
"治承",
"安元",
"承安",
"嘉応",
"仁安",
"永万",
"長寛",
"応保",
"永暦",
"平治",
"保元",
"久寿",
"仁平",
"久安",
"天養",
"康治",
"永治",
"保延",
"長承",
"天承",
"大治",
"天治",
"保安",
"元永",
"永久",
"天永",
"天仁",
"嘉承",
"長治",
"康和",
"承徳",
"永長",
"嘉保",
"寛治",
"応徳",
"永保",
"承暦",
"承保",
"延久",
"治暦",
"康平",
"天喜",
"永承",
"寛徳",
"長久",
"長暦",
"長元",
"万寿",
"治安",
"寛仁",
"長和",
"寛弘",
"長保",
"長徳",
"正暦",
"永祚",
"永延",
"寛和",
"永観",
"天元",
"貞元",
"天延",
"天禄",
"安和",
"康保",
"応和",
"天徳",
"天暦",
"天慶",
"承平",
"延長",
"延喜",
"昌泰",
"寛平",
"仁和",
"元慶",
"貞観",
"天安",
"斉衡",
"仁寿",
"嘉祥",
"承和",
"天長",
"弘仁",
"大同",
"延暦",
"天応",
"宝亀",
"神護景雲",
"天平神護",
"天平宝字",
"天平勝宝",
"天平感宝",
"天平",
"神亀",
"養老",
"霊亀",
"和銅",
"慶雲",
"大宝",
"朱鳥",
"白雉",
"大化"
};
/**
* Setting of font.
*/
void setFont() {
font = loadFont("SourceHanSerifJP-Heavy-48.vlw");
textFont(font);
}
/**
* Draw a person who announces the era.
* @params x x-coorinate of picture.
* @params y y-coorinate of picture.
* @params width width of picture.
* @params showText text to show.
* @params angle angle of arms.
*/
void drawChar(float x, float y, float picureWidth, String showText, float angle) {
float scaleRatio = picureWidth / 53.0;
pushMatrix();
smooth();
translate(x, y);
scale(scaleRatio);
// body
fill(38, 42, 50);
noStroke();
beginShape();
vertex(17.69, 20.13);
bezierVertex(20.76, 18.88, 22.52, 15.62, 29.36, 20.13);
vertex(29.36, 43);
vertex(17.69, 43);
endShape(CLOSE);
// collar
fill(38, 42, 50);
stroke(16, 18, 24);
strokeWeight(0.4);
beginShape();
vertex(18.99, 21.28);
vertex(20.6, 22.22);
vertex(19.28, 24.16);
vertex(23.91, 31.72);
vertex(28.54, 24.07);
vertex(27.41, 22.37);
vertex(28.97, 21.43);
bezierVertex(24.76, 14.89, 21.45, 15.49, 19, 21.29);
endShape(CLOSE);
// shirt
fill(255);
noStroke();
beginShape();
vertex(21.39, 19.39);
vertex(23.89, 31.72);
vertex(26.63, 19.34);
endShape(CLOSE);
// tie
fill(97, 148, 206);
noStroke();
beginShape();
vertex(23.83, 21.14);
vertex(22.69, 22.47);
vertex(23.42, 23.4);
vertex(22.91, 26.9);
vertex(23.89, 31.73);
vertex(24.96, 26.91);
vertex(24.2, 23.37);
vertex(25.1, 22.46);
endShape(CLOSE);
// hair
noStroke();
fill(41, 35, 31);
beginShape();
vertex(16.25, 12.02);
bezierVertex(12.12, 2.52, 25.65, -2.67, 29.15, 4);
bezierVertex(32, 4.98, 32.78, 7.59, 31.35, 11.95);
bezierVertex(25.42, 23.55, 20.19, 19.65, 16.25, 12.02);
endShape(CLOSE);
// face
fill(255, 203, 160);
beginShape();
vertex(23.85, 19.87);
bezierVertex(19.56, 19.84, 18.54, 17.53, 17.36, 15.34);
bezierVertex(15.22, 15.42, 15.4, 14.59, 15.29, 13.42);
bezierVertex(15.18, 12.25, 16.08, 11.74, 17.36, 12.17);
bezierVertex(16.51, 4.52, 19.75, 3.3, 23.61, 3.3);
bezierVertex(28.19, 3.3, 31.09, 4.19, 30.82, 11.95);
bezierVertex(32.52, 11.85, 32.79, 12.55, 32.68, 13.51);
bezierVertex(32.56, 14.48, 32.04, 15.37, 30.55, 15.23);
bezierVertex(29.52, 18.23, 27.29, 19.63, 23.85, 19.87);
endShape(CLOSE);
// eyebrows
noFill();
stroke(56, 52, 47);
strokeWeight(0.5);
beginShape();
vertex(20.04, 9.23);
bezierVertex(20.58, 9.03, 21.11, 8.98, 21.79, 9);
endShape();
beginShape();
vertex(27.54, 9.23);
bezierVertex(26.99, 9.03, 26.46, 8.98, 25.78, 9);
endShape();
// nose
noStroke();
fill(186, 37, 71);
beginShape();
vertex(23.73, 14.43);
bezierVertex(23.58, 14.52, 23.51, 14.69, 23.48, 14.82);
bezierVertex(23.65, 14.8, 23.79, 14.78, 23.96, 14.81);
bezierVertex(23.91, 14.68, 23.86, 14.55, 23.73, 14.43);
endShape(CLOSE);
// eyes
noStroke();
fill(0);
ellipse(26.1, 12.2, 0.7, 0.7);
ellipse(21.6, 12.2, 0.7, 0.7);
// mouth
noFill();
stroke(183, 35, 67);
beginShape();
vertex(22.37, 16.72);
bezierVertex(23.3, 17.48, 24.26, 17.5, 25.26, 16.7);
endShape();
// nose
noStroke();
fill(224, 146, 98);
beginShape();
vertex(25.82, 15.89);
bezierVertex(26.9, 15.69, 26.91, 17.1, 26.59, 17.43);
bezierVertex(26.4, 16.92, 26.23, 16.3, 25.82, 15.89);
endShape(CLOSE);
//arms
noFill();
stroke(38, 42, 50);
strokeWeight(4);
line(18, 22, 18 + cos(angle) * 16, 22 + sin(angle) * 16);
line(30, 22, 30 + cos(angle) * 16, 22 + sin(angle) * 16);
// reiwa frame
fill(255);
stroke(166, 122, 85);
strokeCap(ROUND);
strokeJoin(ROUND);
strokeWeight(1.5);
rect(18 + cos(angle) * 16, 13 + sin(angle) * 16, 12, 16);
// reiwa text
fill(0);
noStroke();
float fontSize = 14.0 / showText.length();
textSize(fontSize);
textLeading(fontSize);
text(showText, 18.0 + cos(angle) * 16 + (12 - fontSize) / 2, 15 + sin(angle) * 16, fontSize + 1, 16);
// hands
pushMatrix();
translate(18 + cos(angle) * 16, 21 + sin(angle) * 16); // arm + (-1, -2)
noStroke();
fill(255, 201, 157);
beginShape();
vertex(0, 0);
bezierVertex(-1.1, 0.01, -1.13, 1.06, -1.07, 2.28);
bezierVertex(-1, 3.62, -1.1, 4.92, -0.1, 4.96);
bezierVertex(1.61, 5.02, 2.51, 4.05, 0.91, 3.77);
bezierVertex(1.96, 3.29, 2.15, 2.91, 0.82, 2.61);
bezierVertex(1.9, 2.38, 2.57, 1.57, 0.71, 1.3);
bezierVertex(2.53, 0.37, 1.1, -0.01, 0, 0);
endShape();
popMatrix();
pushMatrix();
translate(30 + cos(angle) * 16, 21 + sin(angle) * 16); // arm + (+1, -2)
noStroke();
fill(255, 201, 157);
beginShape();
vertex(0, 0);
bezierVertex(1.1, 0.01, 1.13, 1.06, 1.07, 2.28);
bezierVertex(0.99, 3.63, 1.1, 4.92, 0.09, 4.96);
bezierVertex(-1.62, 5.02, -2.52, 4.05, -0.92, 3.77);
bezierVertex(-1.97, 3.29, -2.15, 2.91, -0.82, 2.61);
bezierVertex(-1.91, 2.38, -2.58, 1.57, -0.72, 1.3);
bezierVertex(-2.53, 0.37, -1.1, -0.01, 0, 0);
endShape();
popMatrix();
/*
// mike
fill(0);
noStroke();
beginShape();
vertex(15.73,32.54);
bezierVertex(15.79,30.82,15.37,29.53,16.38,28.62);
endShape(CLOSE);
noFill();
stroke(0);
strokeWeight(0.4);
beginShape();
vertex(15.73,32.54);
bezierVertex(15.79,30.82,15.37,29.53,16.38,28.62);
endShape();
*/
// desk
noStroke();
fill(64, 54, 47);
rect(13, 40, 22, 10);
fill(169, 107, 63);
beginShape();
vertex(10, 35);
vertex(38, 35);
vertex(39, 37);
vertex(38, 41);
vertex(10, 41);
vertex(9, 37);
endShape(CLOSE);
rect(10, 46, 28, 15);
popMatrix();
}
void settings() {
size(canvasSize, canvasSize);
}
void setup(){
setFont();
for (int i = 0; i < drawCount; i++ ) {
sugaCoods[i] = new SugaCood();
}
}
void draw() {
background(255);
for(int i = 0; i < drawCount; i+=1) {
sugaCoods[i].update();
drawChar(sugaCoods[i].p.x, sugaCoods[i].p.y, reiwaSize, "令和", sugaCoods[i].angle);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment