2010年10月24日日曜日

Shibuya.lisp Hackathon #1に行ってきました。

Shibuya.lisp Hackathonに参戦してきました。

LISP自体、書くのが久しぶりで、
行く前に久しぶりにちょっと書いてみたら、全然書けなかったので(TT)
いい機会なので、勉強するつもりできました。

当日はもくもくとコードを書いていたので、
もうちょっといろんな人と話せばよかったと思いました。反省。
自分は引っ込み思案でなかなか話しかけられないので、もうちょっとここら辺を克服したいと思います。

最後に成果発表の時間がありましたが、
皆さんの発表見て、「やっぱ格が違うなー。すごいなー。」と思いました。
もっとがんばらないと。


一応テーマとして、
svgをパースして
gauche-glで描画するということをして
勉強しようと思いました。

とにかく、
rectを描画することを目標にがんばり、
なんとか描画するまで行きました(すごく簡単なことなんですけどね;)

以下にコードを晒します。

process_svg.scm

(use sxml.ssax)

(define (translation_rect data)
  (let ((x1 0)
(y1 0)
(x2 0)
(y2 0))
    (map (lambda (x)
  (cond
   ((equal? (car x) 'x)
    (set! x1 (string->number (cadr x)))
    (set! x2 (+ x2  (string->number (cadr x)))))
   ((equal? (car x) 'y)
    (set! y1 (string->number (cadr x)))
    (set! y2 (+ y2 (string->number (cadr x)))))
   ((equal? (car x) 'width)
    (set! x2 (+ x2 (string->number (cadr x)))))
   ((equal? (car x) 'height)
    (set! y2 (+ y2 (string->number (cadr x)))))
   ))
data)
    (list x1 y1 x2 y2)))

(define (get_x1 data)
  (car data))
(define (get_x2 data)
  (caddr data))
(define (get_y1 data)
  (cadr data))
(define (get_y2 data)
  (cadddr data))

(define (process_element elem)
  (case (car elem)
    ('rect (translation_rect (cdr (cadr elem))))
    ('circle (print "circle"))
    ('line (print "line"))))

(define (parser data)
  (process_element
   (car (cdr (car (cdr (ssax:xml->sxml (open-input-string data) '())))))))


main.scm

(use gl)

(use gl.glut)
(load "./process_svg.scm")

(define setup-data
  (map 
   (lambda (x) (/ x 250))
   (parser "<svg><rect height="100" width="100" x="10" y="10"></rect></svg>")))

(define (disp)
  (let ((x setup-data))    
    (print x)
    (gl-clear-color 0.0 0.0 0.0 0.0)
    (gl-clear GL_COLOR_BUFFER_BIT)
    (gl-color 1.0 0.0 0.0)
    (gl-ortho 0.0 1.0 1.0 0.0 -1.0 1.0)
    (gl-begin GL_POLYGON)
    (gl-vertex (get_x1 x) (get_y1 x) 0.0)
    (gl-vertex (get_x2 x) (get_y1 x) 0.0)
    (gl-vertex (get_x2 x) (get_y2 x) 0.0)
    (gl-vertex (get_x1 x) (get_y2 x) 0.0)
    (gl-end)
    (gl-flush)))
(define (keyboard key x y)
  (cond
   ((= key 27) (exit 0))
   ))

(define (main args)
    (glut-init args)
    (glut-init-display-mode GLUT_SINGLE)
    (glut-init-window-size 250 250)
    (glut-create-window "nil window")
    (glut-display-func disp)
    (glut-keyboard-func keyboard)
    (glut-main-loop)
    0)


だいぶ汚いコードですが;
もうちょっとうまく書けるような気がするなー。。。

実行結果は以下です。

とりあえずここまでできたので、
XMLをちゃんと扱えるようにする。
circleといったほかのプリミティブを秒かできるようにする。
アニメーションをできるようにする。
までやりたいなと思います。

早く初心者から脱却したいなー。

(10/30追記)
ソースをGithub に公開しました。 
 
本当はもっとちゃんとしたものになってから公開しようかと思ったんですけど、
そんなこと言ってたらやらないまま終わっちゃいますからね。

0 件のコメント: