Created
September 22, 2022 08:19
-
-
Save ygkn/0ffd1fd47e1da60218939fb3506e4a8c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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