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}}==