
๊ทธ๋ฆฌ๊ธฐ ๋ช
๋ น์ Drawer ๊ฐ์ฒด๋ก ํธ์ถํ๋ค ๋ณด๋ฉด ๊ฒฉ์๋ ๋ฐฉ์ฌํ ๋ฐฐ์น์ฒ๋ผ ๊ฐ์ ๊ณ์ฐ์ด ๋ฐ๋ณต๋ฉ๋๋ค.
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.circle(400.0, 400.0, 100.0)
}
๊ฒฉ์๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ง์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
extend {
for (x in 0 until 10) {
for (y in 0 until 10) {
val px = x * 80.0
val py = y * 80.0
drawer.circle(px, py, 20.0)
}
}
}
๊ฐ์ ๋ฐฐ์น ๊ท์น์ ์ฌ๋ฌ ์ํ์์ ์ด๋ค๋ฉด ๊ณ์ฐ์ ํ์ฅ ํจ์๋ก ๋ฌถ์ ์ ์์ต๋๋ค.
extend {
drawer.grid(10, 10, 80.0, 20.0)
}
Drawer๋ฅผ ๋ฆฌ์๋ฒ๋ก ์ ์ธํ ํ์ฅ ํจ์๋ฅผ ์ ์ํ๋ฉด drawer.grid(...)์ฒ๋ผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด ํธ์ถ ๋ฌธ๋ฒ์ ๋ฉค๋ฒ ๋ฉ์๋์ ๋น์ทํ์ง๋ง, Drawer ํด๋์ค ์์ฒด์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ์ง๋ ์์ต๋๋ค.
ํ์ฅ ํจ์๋ ๊ธฐ์กด ํ์ ์ ๋ฆฌ์๋ฒ๋ก ๋ฐ๋ ํจ์๋ฅผ ์ ์ธํด ๊ทธ ํ์ ์ ๊ฐ์์ ๋ฉ์๋์ฒ๋ผ ํธ์ถํ๊ฒ ํฉ๋๋ค. ํ์ ์ ์์ค๋ ๋ฐํ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ, ์ ๊ทผํ ์ ์๋ ๋ฉค๋ฒ๋ ํด๋น ์์น์์ ์๋ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฒ์๋ก ์ ํ๋ฉ๋๋ค.
// ์ ์ ํด๋์ค์ ์ ๋ฉ์๋ ์ถ๊ฐ
fun Int.isEven(): Boolean {
return this % 2 == 0
}
// ์ฌ์ฉ
val num = 10
println(num.isEven()) // true
๊ตฌ์กฐ:
fun ํด๋์ค์ด๋ฆ.๋ฉ์๋์ด๋ฆ(ํ๋ผ๋ฏธํฐ): ๋ฐํํ์
{
// this๋ ์๋์ผ๋ก ํด๋์ค์ ์ธ์คํด์ค
}
// String ํด๋์ค์ "๋จ์ด ๊ฐ์ ์ธ๊ธฐ" ๋ฉ์๋ ์ถ๊ฐ
fun String.wordCount(): Int {
return this.split(" ").size
}
val text = "Hello World OPENRNDR"
println(text.wordCount()) // 3
ํ์ฅ ํจ์ ๋ณธ๋ฌธ์์ this๋ ๋ฆฌ์๋ฒ์ธ String ๊ฐ์
๋๋ค. ํ์ฅ ํจ์๋ ์ ์ ์ผ๋ก ํด์๋๋ฏ๋ก, ๊ฐ์ ๊ฐ์ฒด๋ผ๋ ์ปดํ์ผ ์์ ์ ์๋ ค์ง ๋ณ์ ํ์
์ ๋ฐ๋ผ ํธ์ถ๋๋ ํ์ฅ ํจ์๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ค์ ๋ฉค๋ฒ ํจ์๊ฐ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์์ผ๋ฉด ๋ฉค๋ฒ๊ฐ ์ฐ์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ธฐ์ ์ขํ ๊ณ์ฐ์ ๋ฐ๋ณต๋๋ ํจํด์ ์ด๋ฆ ์๋ ํจ์๋ก ๋ฌถ์ผ๋ฉด ํธ์ถ๋ถ์์ ๋งค๊ฐ๋ณ์์ ๋ชฉ์ ์ ์ฝ๊ธฐ ์ฝ์ต๋๋ค.
// 1๋จ๊ณ: ๋ฐ๋ณต๋๋ ์ฝ๋ ๋ฐ๊ฒฌ
extend {
// ๊ฒฉ์ ํจํด์ ๋งค๋ฒ ์ด๋ ๊ฒ ์ด๋ค
for (x in 0 until 10) {
for (y in 0 until 10) {
drawer.circle(x * 80.0, y * 80.0, 20.0)
}
}
}
// 2๋จ๊ณ: Extension ํจ์๋ก ์ถ์ํ
fun Drawer.grid(cols: Int, rows: Int, spacing: Double, radius: Double = 20.0) {
for (x in 0 until cols) {
for (y in 0 until rows) {
circle(x * spacing, y * spacing, radius)
}
}
}
// 3๋จ๊ณ: ๊ฐ๋จํ๊ฒ ์ฌ์ฉ
extend {
drawer.grid(10, 10, 80.0)
}
p5.js์์๋ ์ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค:
function drawGrid(cols, rows, spacing) {
for (let x = 0; x < cols; x++) {
for (let y = 0; y < rows; y++) {
circle(x * spacing, y * spacing, 20);
}
}
}
function draw() {
background(0);
drawGrid(10, 10, 80);
}
drawGrid๋ ์ ์ญ ํจ์๋ก ์ ์๋ฉ๋๋ค. ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ํจ์ ์ด๋ฆ๊ณผ ๊ทธ๋ฆฌ๊ธฐ ๋์์ ๊ด๊ณ๋ฅผ ์์ฑ์๊ฐ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
fun Drawer.grid(cols: Int, rows: Int, spacing: Double) {
for (x in 0 until cols) {
for (y in 0 until rows) {
circle(x * spacing, y * spacing, 20.0)
}
}
}
extend {
drawer.grid(10, 10, 80.0) // Drawer์ ๋ฉ์๋์ฒ๋ผ!
}
ํ์ฅ ํจ์์ ๋ฆฌ์๋ฒ ํ์
์ด Drawer์ด๋ฏ๋ก ํธ์ถ๋ถ์ drawer.grid(...)์์ ๊ทธ๋ฆฌ๊ธฐ ๋์๊ณผ ํจํด ํจ์์ ๊ด๊ณ๋ฅผ ํจ๊ป ์ฝ์ ์ ์์ต๋๋ค. grid๋ Drawer์ ๋ฉค๋ฒ ํจ์๊ฐ ์๋๋ฉฐ, ํ์ฅ ํจ์๊ฐ ์ ์ธ๋ ํ์ผ์ด๋ ํจํค์ง ๋ฒ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// Extension ํจ์ ์ ์
fun Drawer.grid(
cols: Int,
rows: Int,
spacing: Double,
radius: Double = 20.0
) {
for (x in 0 until cols) {
for (y in 0 until rows) {
circle(x * spacing, y * spacing, radius)
}
}
}
program {
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.WHITE
drawer.grid(12, 12, 60.0, 15.0)
}
}
์ฌ์ฉ์ ํธ์์ฑ:
drawer.grid(12, 12, 60.0, 15.0) ํธ์ถ๋ก ์ด์ค ๋ฐ๋ณต๊ณผ ์ขํ ๊ณ์ฐ์ ์จ๊น๋๋ค.// ์ค์ฌ ์ฃผ์์ ์ํ์ผ๋ก ๋ฐฐ์น
fun Drawer.radialLayout(
count: Int,
distance: Double,
radius: Double = 20.0,
centerX: Double = 400.0,
centerY: Double = 400.0
) {
require(count > 0) { "count must be positive" }
for (i in 0 until count) {
val angle = TWO_PI * i / count
val x = centerX + distance * cos(angle)
val y = centerY + distance * sin(angle)
circle(x, y, radius)
}
}
program {
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.PINK
// ํ๋ฉด ์ค์์์ 12๊ฐ ์์ 150 ํฝ์
๊ฑฐ๋ฆฌ์ ๋ฐฐ์น
drawer.radialLayout(12, 150.0, 15.0)
}
}
// ๋์ ํจํด
fun Drawer.spiral(
count: Int,
spacing: Double,
rotation: Double = 0.0,
centerX: Double = 400.0,
centerY: Double = 400.0
) {
for (i in 0 until count) {
val angle = rotation + i * 0.2
val radius = i * spacing
val x = centerX + radius * cos(angle)
val y = centerY + radius * sin(angle)
point(x, y)
}
}
program {
var t = 0.0
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.strokeWeight = 2.0
drawer.stroke = ColorRGBa.CYAN
drawer.spiral(500, 0.5, t) // ํ์ ํ๋ ๋์
t += 0.02
}
}
Drawer + Vector2 Extension// Vector2์ ๊ฐ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ์ป๊ธฐ
fun Vector2.angle(): Double {
return atan2(y, x)
}
fun Vector2.magnitude(): Double {
return sqrt(x * x + y * y)
}
// ์ฌ์ฉ
val v = Vector2(3.0, 4.0)
println(v.magnitude()) // 5.0
println(v.angle()) // ~0.93 ๋ผ๋์
// Vector2 ๋ฆฌ์คํธ๋ฅผ ๊ฒฝ๋ก๋ก ๊ทธ๋ฆฌ๊ธฐ
fun Drawer.path(points: List<Vector2>, closed: Boolean = false) {
if (points.isEmpty()) return
for (i in 0 until points.size - 1) {
lineSegment(points[i], points[i + 1])
}
if (closed) {
lineSegment(points.last(), points.first())
}
}
program {
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.stroke = ColorRGBa.WHITE
val triangle = listOf(
Vector2(400.0, 200.0),
Vector2(600.0, 400.0),
Vector2(200.0, 400.0)
)
drawer.path(triangle, closed = true) // ์ผ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
}
}
Extension ํจ์์์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค:
// ๋ฐ์ง๋ฆ์ ๊ธฐ๋ณธ๊ฐ ์ค์
fun Drawer.grid(
cols: Int,
rows: Int,
spacing: Double,
radius: Double = 20.0 // ๊ธฐ๋ณธ๊ฐ
) {
for (x in 0 until cols) {
for (y in 0 until rows) {
circle(x * spacing, y * spacing, radius)
}
}
}
// ์ฌ์ฉ
extend {
drawer.grid(10, 10, 80.0) // radius = 20.0 (๊ธฐ๋ณธ๊ฐ)
drawer.grid(10, 10, 80.0, 30.0) // radius = 30.0 (๋ช
์)
}
์ข์ ๊ธฐ๋ณธ๊ฐ ์ค๊ณ:
// ๋์ฌ์(concentric circles)
fun Drawer.concentricCircles(
count: Int,
startRadius: Double,
spacing: Double,
centerX: Double = 400.0,
centerY: Double = 400.0
) {
for (i in 0 until count) {
val radius = startRadius + i * spacing
circle(centerX, centerY, radius)
}
}
// ๊ฒฉ์ + ๋์ฌ์ ์กฐํฉ
program {
var t = 0.0
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.WHITE
// ๊ฒฉ์
for (x in 0 until 5) {
for (y in 0 until 5) {
val cx = 100.0 + x * 160.0
val cy = 100.0 + y * 160.0
drawer.concentricCircles(
count = 3,
startRadius = 20.0,
spacing = 15.0,
centerX = cx,
centerY = cy
)
}
}
t += 0.01
}
}
Extension ํจ์๋ ๋ค๋ฅธ Extension ํจ์ ์์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค:
// ๊ธฐ๋ณธ Extension
fun Drawer.box(
x: Double,
y: Double,
width: Double,
height: Double,
cornerRadius: Double = 0.0
) {
rectangle(x, y, width, height)
// ๋ชจ์๋ฆฌ ์ฒ๋ฆฌ ๋ฑ...
}
// ๋ค๋ฅธ Extension์ ์ฌ์ฉํ๋ ์๋ก์ด Extension
fun Drawer.tiled(
cols: Int,
rows: Int,
width: Double,
height: Double
) {
for (x in 0 until cols) {
for (y in 0 until rows) {
val px = x * width
val py = y * height
box(px, py, width, height) // ๋ค๋ฅธ Extension ์ฌ์ฉ
}
}
}
extend {
drawer.tiled(5, 5, 100.0, 100.0)
}
์์ฃผ ์ฐ๋ Extension๋ค์ ํ ํ์ผ์ ๋ชจ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
// DrawerExtensions.kt (๋๋ ์๋ฌด ํ์ผ)
// ๊ฒฉ์
fun Drawer.grid(cols: Int, rows: Int, spacing: Double, radius: Double = 20.0) {
for (x in 0 until cols) {
for (y in 0 until rows) {
circle(x * spacing, y * spacing, radius)
}
}
}
// ์ํ ๋ฐฐ์น
fun Drawer.radialLayout(
count: Int,
distance: Double,
radius: Double = 20.0,
centerX: Double = 400.0,
centerY: Double = 400.0
) {
require(count > 0)
for (i in 0 until count) {
val angle = TWO_PI * i / count
val x = centerX + distance * cos(angle)
val y = centerY + distance * sin(angle)
circle(x, y, radius)
}
}
// ๊ฒฝ๋ก ๊ทธ๋ฆฌ๊ธฐ
fun Drawer.path(points: List<Vector2>, closed: Boolean = false) {
if (points.isEmpty()) return
for (i in 0 until points.size - 1) {
lineSegment(points[i], points[i + 1])
}
if (closed) {
lineSegment(points.last(), points.first())
}
}
// ๋์
fun Drawer.spiral(
count: Int,
spacing: Double,
rotation: Double = 0.0,
centerX: Double = 400.0,
centerY: Double = 400.0
) {
for (i in 0 until count) {
val angle = rotation + i * 0.2
val radius = i * spacing
val x = centerX + radius * cos(angle)
val y = centerY + radius * sin(angle)
point(x, y)
}
}
// --------- ๋ฉ์ธ ํ์ผ์์ ์ฌ์ฉ ---------
program {
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.WHITE
// ๋ชจ๋ Extension ๋ฉ์๋ ์ฌ์ฉ ๊ฐ๋ฅ
drawer.grid(10, 10, 80.0)
drawer.radialLayout(8, 150.0)
drawer.spiral(200, 1.0)
}
}
// ์ ๊ทํ๋ ๋ฒกํฐ (๋ฐฉํฅ๋ง, ๊ฑฐ๋ฆฌ๋ 1)
fun Vector2.normalized(): Vector2 {
val len = sqrt(x * x + y * y)
if (len == 0.0) return Vector2(0.0, 0.0)
return Vector2(x / len, y / len)
}
// ๋ฒกํฐ์ ํ์
fun Vector2.rotated(angleRadians: Double): Vector2 {
val cos = cos(angleRadians)
val sin = sin(angleRadians)
return Vector2(
x * cos - y * sin,
x * sin + y * cos
)
}
// ์ฌ์ฉ
val v = Vector2(1.0, 1.0)
val rotated = v.rotated(PI / 4) // 45๋ ํ์
val norm = v.normalized() // ์ ๊ทํ
program {
extend {
drawer.clear(ColorRGBa.BLACK)
val center = Vector2(400.0, 400.0)
val direction = (mouse.position - center).normalized()
// direction ๋ฐฉํฅ์ผ๋ก ์ ๊ทธ๋ฆฌ๊ธฐ
drawer.lineSegment(center, center + direction * 150.0)
}
}
// ๋ง์ฐ์ค๋ฅผ ๋ฐ๋ผ๋ค๋๋ ๋์
fun Drawer.spiralTowards(
count: Int,
spacing: Double,
targetPosition: Vector2,
rotation: Double = 0.0
) {
for (i in 0 until count) {
val angle = rotation + i * 0.2
val radius = i * spacing
val x = radius * cos(angle)
val y = radius * sin(angle)
val point = Vector2(x, y) + targetPosition
circle(point.x, point.y, 2.0)
}
}
program {
var t = 0.0
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.CYAN
spiralTowards(200, 0.8, mouse.position, t)
t += 0.02
}
}
// ๊ฒฉ์ + ์ ํ์ ํํฐ๋ง
fun Drawer.selectiveGrid(
cols: Int,
rows: Int,
spacing: Double,
radius: Double = 20.0,
shouldDraw: (Int, Int) -> Boolean = { _, _ -> true } // ๊ธฐ๋ณธ: ๋ชจ๋ ๊ทธ๋ฆฌ๊ธฐ
) {
for (x in 0 until cols) {
for (y in 0 until rows) {
if (shouldDraw(x, y)) {
circle(x * spacing, y * spacing, radius)
}
}
}
}
// ์ฌ์ฉ 1: ๊ธฐ๋ณธ (๋ชจ๋ ๊ทธ๋ฆฌ๊ธฐ)
extend {
drawer.selectiveGrid(10, 10, 80.0)
}
// ์ฌ์ฉ 2: ์ฒด์คํ ํจํด
extend {
drawer.selectiveGrid(10, 10, 80.0) { x, y ->
(x + y) % 2 == 0
}
}
// ์ฌ์ฉ 3: ๋๊ฐ์ ํจํด
extend {
drawer.selectiveGrid(10, 10, 80.0) { x, y ->
x == y
}
}
๊ณ ๊ธ ๊ธฐ๋ฅ:
| ์ด์ | ์ค๋ช |
|---|---|
| ์ฌ์ฌ์ฉ์ฑ | ๋ฐ๋ณต๋๋ ํจํด์ ํ ๋ฒ๋ง ์ ์ |
| ๋ช ํ์ฑ | ์ฝ๋์ ์๋๊ฐ ๋ช ํํจ |
| ๊ฐ๋ ์ฑ | ๋ณต์กํ ๋ก์ง์ ๊ฐ๋จํ ๋ฉ์๋ ํธ์ถ๋ก |
| ์ ์ง๋ณด์ | ํจํด ์์ ์ ํ ๊ณณ๋ง ๋ณ๊ฒฝ |
| ์กฐํฉ | ์์ ๊ทธ๋ฆฌ๊ธฐ ํจ์๋ฅผ ํธ์ถํด ๋ ํฐ ํจํด ๊ตฌ์ฑ |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌํ | ์ ํธ๋ฆฌํฐ ํจ์๋ค์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌ |
function drawGrid(cols, rows, spacing) {
for (let x = 0; x < cols; x++) {
for (let y = 0; y < rows; y++) {
circle(x * spacing, y * spacing, 20);
}
}
}
function draw() {
drawGrid(10, 10, 80);
}
๋ฌธ์ : ์ ์ญ ๋ค์์คํ์ด์ค ์ค์ผ, ์๋ ๋ถ๋ช ํ
fun Drawer.grid(cols: Int, rows: Int, spacing: Double) {
for (x in 0 until cols) {
for (y in 0 until rows) {
circle(x * spacing, y * spacing, 20.0)
}
}
}
extend {
drawer.grid(10, 10, 80.0)
}
์ฅ์ : ๋ช ํํ ๊ด๊ณ, ์ฒด๊ณ์ ์กฐ์ง, ๋ฉ์๋์ฒ๋ผ ์ฌ์ฉ
when ์กฐ๊ฑด ๋ถ๊ธฐ๋ค์ ๊ธ์์๋ when ๋ฌธ๋ฒ์ ๋ค๋ฃน๋๋ค.
if-else๋ณด๋ค ํจ์ฌ ๊ฐ๋ ฅํ ์กฐ๊ฑด ๋ถ๊ธฐ:
val mode = 1 // ์ ๋จ๊ณ์์ ์ ํํ ๋ชจ๋
when (mode) {
0 -> drawer.grid(10, 10, 80.0)
1 -> drawer.radialLayout(12, 150.0)
2 -> drawer.spiral(200, 1.0)
else -> drawer.clear(ColorRGBa.BLACK)
}
์ด๊ฒ์ด ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ํจํด์ ๊ทธ๋ฆฌ๋ ์ธํฐ๋ํฐ๋ธ ์ํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
// ์ ์์ "2๋ฐฐ๊ฐ ๋๋๊ฐ" ๋ฉ์๋ ์ถ๊ฐ
fun Int.isDouble(other: Int): Boolean {
return this == other * 2
}
// ํ
์คํธ
println(10.isDouble(5)) // true
println(10.isDouble(3)) // false
// ์ ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ (์ค์ฌ ๊ธฐ์ค)
fun Drawer.square(
centerX: Double,
centerY: Double,
size: Double
) {
val half = size / 2
rectangle(centerX - half, centerY - half, size, size)
}
extend {
drawer.square(400.0, 400.0, 100.0)
}
radius๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ถ๊ฐํ๊ณ ๊ธฐ๋ณธ๊ฐ์ 20.0์ผ๋ก ์ง์ ํฉ๋๋ค. ํธ์ถํ ๋ ์๋ตํ๋ฉด ๋ฐ์ง๋ฆ 20์ ์, ๋ค ๋ฒ์งธ ์ธ์๋ฅผ ์ฃผ๋ฉด ์ง์ ํ ๋ฐ์ง๋ฆ์ ์์ด ๊ทธ๋ ค์ง๋๋ค.
fun Drawer.grid(
cols: Int,
rows: Int,
spacing: Double,
radius: Double = 20.0
) {
for (x in 0 until cols) {
for (y in 0 until rows) {
circle(x * spacing, y * spacing, radius)
}
}
}
program {
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.WHITE
drawer.grid(12, 12, 60.0) // ๊ธฐ๋ณธ ๋ฐ์ง๋ฆ 20.0
drawer.grid(12, 12, 60.0, 8.0) // ๋ฐ์ง๋ฆ 8.0
}
}
๋ ๊ฒฉ์๋ ๊ฐ์ ๊ฐ๊ฒฉ์ผ๋ก ๊ทธ๋ ค์ง๋ฉฐ, ๋ ๋ฒ์งธ ํธ์ถ์ ๋ฐ์ง๋ฆ์ด ๋ ์์ต๋๋ค. ๋ ํธ์ถ์ ํจ๊ป ๋๋ฉด ๋ํ์ด ๊ฒน์น๋ฏ๋ก ๋น๊ตํ ๋๋ ํ ๋ฒ์ ํ ํธ์ถ๋ง ๋จ๊ฒจ๋ ๋ฉ๋๋ค.
// Vector2 ๋ฆฌ์คํธ๋ฅผ ์๊ฐํ
fun Drawer.visualizePoints(points: List<Vector2>, radius: Double = 5.0) {
for (point in points) {
circle(point.x, point.y, radius)
}
}
program {
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.PINK
val points = (0 until 20)
.map { Vector2(it * 40.0, 200.0 + 100.0 * sin(it.toDouble())) }
drawer.visualizePoints(points, 10.0)
}
}
์กฐ๊ฑด ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ผ๋ฉด ๊ฒฉ์์์ ๊ทธ๋ฆด ์ ์ ์ ํํ ์ ์์ต๋๋ค. ์๋ ํธ์ถ์ ํ ๋๋ฆฌ์ ์ฃผ๋๊ฐ์ ์ ๋์ธ ์๋ง ๊ทธ๋ฆฝ๋๋ค.
fun Drawer.selectiveGrid(
cols: Int,
rows: Int,
spacing: Double,
shouldDraw: (Int, Int) -> Boolean
) {
for (x in 0 until cols) {
for (y in 0 until rows) {
if (shouldDraw(x, y)) {
circle(x * spacing, y * spacing, 12.0)
}
}
}
}
program {
extend {
drawer.clear(ColorRGBa.BLACK)
drawer.fill = ColorRGBa.CYAN
val cols = 10
val rows = 10
drawer.selectiveGrid(cols, rows, 60.0) { x, y ->
x == 0 || y == 0 || x == cols - 1 || y == rows - 1 || x == y
}
}
}
์กฐ๊ฑด์ ||๋ ์
์ x ๋๋ y๊ฐ ๊ฐ์ฅ์๋ฆฌ์ด๊ฑฐ๋, ๋ ์ธ๋ฑ์ค๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ฆ
๋๋ค. ํ
๋๋ฆฌ์ ์ผ์ชฝ ์์์ ์ค๋ฅธ์ชฝ ์๋๋ก ์ด์ด์ง๋ ๋๊ฐ์ ์ด ๋จ์ต๋๋ค. ์ฒด์คํ ๋ฌด๋ฌ๋ ์กฐ๊ฑด์๋ง (x + y) % 2 == 0์ผ๋ก ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค.