added NaturalTree
This commit is contained in:
parent
0e46e1a292
commit
e6ec271afd
93
src/logo/NaturalTree.scala
Normal file
93
src/logo/NaturalTree.scala
Normal file
@ -0,0 +1,93 @@
|
||||
package logo
|
||||
|
||||
import java.awt.{Color, Point}
|
||||
import scala.util.Random
|
||||
|
||||
class NaturalTree(width: Int, height: Int, angleStep_ : Double) extends Tree(width, height, angleStep_) {
|
||||
val MIN_STRAW_ANGLE: Double = 60
|
||||
val MAX_STRAW_ANGLE: Double = 100
|
||||
val MIN_N_STRAWS: Int = 90
|
||||
val MAX_N_STRAWS: Int = 200
|
||||
//val STRAW_COLOR1: Color = new Color(230, 188, 43)
|
||||
//val STRAW_COLOR2: Color = new Color(255, 226, 71)
|
||||
//val STRAW_COLOR1: Color = new Color(96, 163, 67)
|
||||
//val STRAW_COLOR2: Color = new Color(112, 198, 76)
|
||||
val STRAW_COLOR1: Color = new Color(108, 83, 61)
|
||||
val STRAW_COLOR2: Color = new Color(174, 105, 44)
|
||||
val TRUNK_COLOR: Color = new Color(65, 61, 64)
|
||||
|
||||
override def drawTree(n: Int, length: Double): Unit = {
|
||||
var n2: Int = n
|
||||
val r: Double = math.random()
|
||||
if (r < 0.25) {
|
||||
n2 -= 1
|
||||
} else if (r > 0.9) {
|
||||
if (n2 < 2) {
|
||||
n2 += 3
|
||||
}
|
||||
}
|
||||
turn(angleStep * (math.random() - 0.5) * 2)
|
||||
val a: Double = angleStep
|
||||
angleStep -= math.random() * angleStep / 10
|
||||
super.drawTree(n2, length)
|
||||
angleStep = a
|
||||
}
|
||||
|
||||
override def drawBranch(length: Double): Unit = {
|
||||
setPenWidth((length / 10).toFloat)
|
||||
setColor(TRUNK_COLOR)
|
||||
super.drawBranch(length)
|
||||
}
|
||||
|
||||
override def drawLeaf(length: Double): Unit = {
|
||||
val angle: Double = getTurtleAngle()
|
||||
val pos: Point = getPosition()
|
||||
val nStraws: Int = Random.between(MIN_N_STRAWS, MAX_N_STRAWS)
|
||||
val strawsAngle: Double = Random.between(MIN_STRAW_ANGLE, MAX_STRAW_ANGLE)
|
||||
val step: Double = strawsAngle / (nStraws - 1)
|
||||
val oAngle: Double = angle - strawsAngle / 2
|
||||
val strawLen: Double = length * 20
|
||||
|
||||
setPenWidth(1f)
|
||||
for (i: Int <- 0 until nStraws) {
|
||||
setPenWidth(0.5f + (nStraws - i) / (nStraws - 1f) / 10)
|
||||
setColor(lerpCol((nStraws - i) / (nStraws - 1.0)))
|
||||
//val a: Double = oAngle + i * step + (math.random() * 2 -1) * step / 5
|
||||
val a: Double = oAngle + math.random() * strawsAngle
|
||||
var l: Double = strawLen * (nStraws.toDouble - i) / nStraws
|
||||
l += (math.random() * 2 - 1) * l / 2
|
||||
setAngle(a)
|
||||
jump(pos.x, pos.y)
|
||||
//forward(strawLen + (math.random() * 2 - 1) * strawLen / 2)
|
||||
forward(l)
|
||||
}
|
||||
jump(pos.x, pos.y)
|
||||
setAngle(angle)
|
||||
}
|
||||
|
||||
def lerpCol(f: Double): Color = {
|
||||
val r: Int = ((STRAW_COLOR2.getRed - STRAW_COLOR1.getRed) * f + STRAW_COLOR1.getRed).toInt
|
||||
val g: Int = ((STRAW_COLOR2.getGreen - STRAW_COLOR1.getGreen) * f + STRAW_COLOR1.getGreen).toInt
|
||||
val b: Int = ((STRAW_COLOR2.getBlue - STRAW_COLOR1.getBlue) * f + STRAW_COLOR1.getBlue).toInt
|
||||
return new Color(
|
||||
math.min(255, math.max(0, r)),
|
||||
math.min(255, math.max(0, g)),
|
||||
math.min(255, math.max(0, b))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
object NaturalTree {
|
||||
def main(args: Array[String]): Unit = {
|
||||
val tree: NaturalTree = new NaturalTree(600, 600, 25)
|
||||
tree.jump(300, 600)
|
||||
tree.setAngle(-90)
|
||||
tree.drawTree(8, 80)
|
||||
|
||||
for (i: Int <- 0 until 10) {
|
||||
tree.jump(Random.between(0, 600), 600)
|
||||
tree.setAngle(-90)
|
||||
tree.drawTree(3, 20)
|
||||
}
|
||||
}
|
||||
}
|
@ -4,14 +4,14 @@ import hevs.graphics.TurtleGraphics
|
||||
|
||||
import java.awt.Point
|
||||
|
||||
class Tree(width: Int, height: Int, val angleStep: Double) extends TurtleGraphics(width, height) {
|
||||
class Tree(width: Int, height: Int, var angleStep: Double) extends TurtleGraphics(width, height) {
|
||||
def drawTree(n: Int, length: Double): Unit = {
|
||||
if (n > 1) {
|
||||
drawBranch(length)
|
||||
val pos: Point = getPosition()
|
||||
val angle: Double = getTurtleAngle()
|
||||
|
||||
turn(-angleStep )
|
||||
turn(-angleStep)
|
||||
drawTree(n - 1, length * 0.8)
|
||||
jump(pos.x, pos.y)
|
||||
setAngle(angle)
|
||||
@ -19,12 +19,17 @@ class Tree(width: Int, height: Int, val angleStep: Double) extends TurtleGraphic
|
||||
drawTree(n - 1, length * 0.8)
|
||||
} else {
|
||||
drawBranch(length)
|
||||
drawLeaf(length / 10)
|
||||
}
|
||||
}
|
||||
|
||||
def drawBranch(length: Double): Unit = {
|
||||
forward(length)
|
||||
}
|
||||
|
||||
def drawLeaf(length: Double): Unit = {
|
||||
|
||||
}
|
||||
}
|
||||
object Tree {
|
||||
def main(args: Array[String]): Unit = {
|
||||
|
Loading…
Reference in New Issue
Block a user