Hilbert curve: Difference between revisions
Content added Content deleted
mNo edit summary |
No edit summary |
||
Line 2,244: | Line 2,244: | ||
(make-curve 500 6 7 30 (make-color 255 255 0) (make-color 0 0 0))</lang> |
(make-curve 500 6 7 30 (make-color 255 255 0) (make-color 0 0 0))</lang> |
||
=={{header|Ruby}}== |
|||
{{libheader|RubyGems}} |
|||
{{libheader|JRubyArt}} |
|||
<br/> |
|||
Implemented as a Lindenmayer System, depends on JRuby or JRubyComplete |
|||
<lang Ruby> |
|||
attr_reader :hilbert |
|||
def settings |
|||
size 600, 600 |
|||
end |
|||
def setup |
|||
sketch_title '2D Hilbert' |
|||
@hilbert = Hilbert.new |
|||
hilbert.create_grammar 5 |
|||
no_loop |
|||
end |
|||
def draw |
|||
background 0 |
|||
hilbert.render |
|||
end |
|||
class Grammar |
|||
attr_reader :axiom, :rules |
|||
def initialize(axiom, rules) |
|||
@axiom = axiom |
|||
@rules = rules |
|||
end |
|||
def apply_rules(prod) |
|||
prod.gsub(/./) { |token| rules.fetch(token, token) } |
|||
end |
|||
def generate(gen) |
|||
return axiom if gen.zero? |
|||
prod = axiom |
|||
gen.times do |
|||
prod = apply_rules(prod) |
|||
end |
|||
prod |
|||
end |
|||
end |
|||
class Hilbert |
|||
include Processing::Proxy |
|||
attr_accessor :grammar, :axiom, :draw_length, :production, :turtle |
|||
DELTA = Math::PI / 2 |
|||
XPOS = 0 # placeholders for turtle |
|||
YPOS = 1 |
|||
THETA = 2 |
|||
def initialize |
|||
@axiom = 'FL' |
|||
@grammar = Grammar.new( |
|||
axiom, |
|||
'L' => '+RF-LFL-FR+', |
|||
'R' => '-LF+RFR+FL-' |
|||
) |
|||
@draw_length = 200 |
|||
stroke 0, 255, 0 |
|||
stroke_weight 2 |
|||
@turtle = Array.new(3) # using an array as turtle |
|||
turtle[XPOS] = width / 9 |
|||
turtle[YPOS] = height / 9 |
|||
turtle[THETA] = 0 |
|||
end |
|||
def render |
|||
production.scan(/./) do |element| |
|||
case element |
|||
when 'F' # NB NOT using affine transforms |
|||
draw_line(turtle) |
|||
when '+' |
|||
@turtle[THETA] += DELTA |
|||
when '-' |
|||
@turtle[THETA] -= DELTA |
|||
when 'L' |
|||
when 'R' |
|||
else puts 'Grammar not recognized' |
|||
end |
|||
end |
|||
end |
|||
def draw_line(turtle) |
|||
x_temp = turtle[XPOS] |
|||
y_temp = turtle[YPOS] |
|||
@turtle[XPOS] += draw_length * Math.cos(turtle[THETA]) |
|||
@turtle[YPOS] += draw_length * Math.sin(turtle[THETA]) |
|||
line(x_temp, y_temp, turtle[XPOS], turtle[YPOS]) |
|||
end |
|||
def create_grammar(gen) |
|||
@draw_length *= 0.6**gen |
|||
@production = @grammar.generate gen |
|||
end |
|||
end |
|||
</lang> |
|||
=={{header|Scala}}== |
=={{header|Scala}}== |