"프로그램으로 고사리 그리기"를 Groovy에서 시도했습니다.
설명이라든가
아마 진원지
프로그램으로 고사리 그리기 - 강한 불로 진행
어쩌면 계기
프로그램으로 고사리 그리기
앞서 여러분
프로그램으로 고사리 그리기 목록
솔직히 Groovy 아마추어이기 때문에, 조금도 Groovy답지 않을지도 모르지만 용서를.
# 실은 처음 Ruby + GD로 짜고 있었지만 어쩌면 루비 버전이 올라 있었기 때문에 Groovy로 다시 작성했다는 것은 비밀이다.
살아보자
drawfern.groovyimport java.awt.Color
import java.awt.image.BufferedImage
import java.io.File
import java.util.Random
import javax.imageio.ImageIO
class Fern {
def W1x = { x, y -> 0.836 * x + 0.044 * y }
def W1y = { x, y -> -0.044 * x + 0.836 * y + 0.169 }
def W2x = { x, y -> -0.141 * x + 0.302 * y }
def W2y = { x, y -> 0.302 * x + 0.141 * y + 0.127 }
def W3x = { x, y -> 0.141 * x - 0.302 * y }
def W3y = { x, y -> 0.302 * x + 0.141 * y + 0.169 }
def W4x = { x, y -> 0 }
def W4y = { x, y -> 0.175337 * y }
def drawer
def rnd
Fern() {
rnd = new Random()
}
def f(k, x, y) {
if (0 < k) {
f(k - 1, W1x(x, y), W1y(x, y))
if (rnd.nextDouble() < 0.3)
f(k - 1, W2x(x, y), W2y(x, y))
if (rnd.nextDouble() < 0.3)
f(k - 1, W3x(x, y), W3y(x, y))
if (rnd.nextDouble() < 0.3)
f(k - 1, W4x(x, y), W4y(x, y))
} else {
drawer(x, y)
}
}
def sprout(n, clos) {
drawer = clos
f(n, 0, 0)
}
}
class FernCanvas {
def width
def height
def allowed
def img
def fernColor = new Color(0.0F, 0.5F, 0.0F)
FernCanvas(size, padding) {
width = size
height = size
allowed = size - padding
img = new BufferedImage(
width, height, BufferedImage.TYPE_INT_RGB)
def g = null
try {
g = this.img.createGraphics()
g.setColor(Color.WHITE)
g.fillRect(0, 0, width, height)
} finally {
if (g != null) {
g.dispose()
}
}
}
def plot(x, y) {
def plotX = (int)( x * allowed + width * 0.5)
def plotY = (int)( height - y * allowed)
img.setRGB(plotX, plotY, fernColor.getRGB())
}
def save_png_to(fileName) {
ImageIO.write(img, "PNG", new File(fileName));
}
}
def N = 20
canvas = new FernCanvas(500, 10)
new Fern().sprout(N) { x, y ->
canvas.plot(x, y)
}
canvas.save_png_to("fern.png")
내면서
drawer = clos 근처가 뭔가 귀엽다 orz
Reference
이 문제에 관하여("프로그램으로 고사리 그리기"를 Groovy에서 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/doju_m/items/36477fd6403e91efa840
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
drawfern.groovy
import java.awt.Color
import java.awt.image.BufferedImage
import java.io.File
import java.util.Random
import javax.imageio.ImageIO
class Fern {
def W1x = { x, y -> 0.836 * x + 0.044 * y }
def W1y = { x, y -> -0.044 * x + 0.836 * y + 0.169 }
def W2x = { x, y -> -0.141 * x + 0.302 * y }
def W2y = { x, y -> 0.302 * x + 0.141 * y + 0.127 }
def W3x = { x, y -> 0.141 * x - 0.302 * y }
def W3y = { x, y -> 0.302 * x + 0.141 * y + 0.169 }
def W4x = { x, y -> 0 }
def W4y = { x, y -> 0.175337 * y }
def drawer
def rnd
Fern() {
rnd = new Random()
}
def f(k, x, y) {
if (0 < k) {
f(k - 1, W1x(x, y), W1y(x, y))
if (rnd.nextDouble() < 0.3)
f(k - 1, W2x(x, y), W2y(x, y))
if (rnd.nextDouble() < 0.3)
f(k - 1, W3x(x, y), W3y(x, y))
if (rnd.nextDouble() < 0.3)
f(k - 1, W4x(x, y), W4y(x, y))
} else {
drawer(x, y)
}
}
def sprout(n, clos) {
drawer = clos
f(n, 0, 0)
}
}
class FernCanvas {
def width
def height
def allowed
def img
def fernColor = new Color(0.0F, 0.5F, 0.0F)
FernCanvas(size, padding) {
width = size
height = size
allowed = size - padding
img = new BufferedImage(
width, height, BufferedImage.TYPE_INT_RGB)
def g = null
try {
g = this.img.createGraphics()
g.setColor(Color.WHITE)
g.fillRect(0, 0, width, height)
} finally {
if (g != null) {
g.dispose()
}
}
}
def plot(x, y) {
def plotX = (int)( x * allowed + width * 0.5)
def plotY = (int)( height - y * allowed)
img.setRGB(plotX, plotY, fernColor.getRGB())
}
def save_png_to(fileName) {
ImageIO.write(img, "PNG", new File(fileName));
}
}
def N = 20
canvas = new FernCanvas(500, 10)
new Fern().sprout(N) { x, y ->
canvas.plot(x, y)
}
canvas.save_png_to("fern.png")
내면서
drawer = clos 근처가 뭔가 귀엽다 orz
Reference
이 문제에 관하여("프로그램으로 고사리 그리기"를 Groovy에서 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/doju_m/items/36477fd6403e91efa840
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여("프로그램으로 고사리 그리기"를 Groovy에서 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/doju_m/items/36477fd6403e91efa840텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)