SICPã®å³å½¢è¨èªã JavaScript+html5ã®canvasã§è§£ã
SICPã®2ç« ã«å³å½¢è¨èªã¨ããã»ã¯ã·ã§ã³ããã£ã¦ãç°å¢ãç¨æããã®ãé¢åãªã®ã§ã¹ã«ã¼ãã¦ããï¼é常coLinux+gaucheã¨ãDrSchemeã¨ãã§ãã£ã¦ãã®ã ãã©ãæç»ã®ããã«Linuxå´ã«gauche+GLãWindowså´ã«Xãµã¼ããå
¥ãã¦çªãXã§é£ã°ãã¨ãé¢åã ãããã以å¤ã®ç®çã«ä½¿ãããã«ãªãï¼ã
ããããcanvasã使ã£ã¦æ¬æä¸ã®Schemeããã°ã©ã ãJavaScriptã§è¨è¿°ãã¦ããã°ã§ããããããªããï¼ã¨æã£ã¦ãã£ã¦ã¿ãã
ãªãåæ¥ã¯æ¬å½ã¯ææSICPã®ããã«ambã¤ã³ã¿ããªã¿ãæ¸ããªããã°ãããªãã£ãã®ã ããå³å½¢è¨èªã«ãã¾ãã¦ãã¦äºç¿ããã£ã¦ãªããã§ãåã«éãã§ããããã§ã¯ãªããã ãã¨ããã¢ãªãã¤å·¥ä½ã®ããã«ãã®ãããªè¨äºãæ¸ãã¦ã¿ãã
SICPã§ã¯Schemeã使ãã¨ã¯ãã£ã¦ãããã¯ãã¨ãã¯åãæ±ã£ã¦ããªããSICPã®ç¯å²å ã§ä½¿ãããSchemeå¦çç³»ã®æ©è½ã§ãJavaScriptå¦çç³»ãæã£ã¦ãªãã®ã¯quoteãããã®ãã®ã§ãããå³å½¢è¨èªã®ã»ã¯ã·ã§ã³ã§ã¯quoteã¯å°å ¥ããã¦ããªãã®ã§ãã»ã¨ãã©ä¸åä¸å¥ãã®ã¾ã¾JavaScriptã«ååå¯è½ã§ããããã ãJavaScriptã¨ãã¦ã®è¨è¿°ã®ç°¡æ½ãã®ããã«ãç°¡æãªãã¼ã¿æ§é ã®æ§ç¯å/鏿åã®çµã¯JavaScriptã®ãªãã¸ã§ã¯ãã使ããã¨ã«ããããã¨ãã°æ¬¡ã®ããã«ã
//ãã¯ãã«ã®æ§ç¯å&æ¼ç® //æ§ç¯å㯠make_XXX ã®ãããªããªãã£ãã¯ã¹ããããã function vect(x, y){ return {x:x, y:y} } //鏿å㯠åã«ãªãã¸ã§ã¯ãããããã£ã®ã¢ã¯ã»ã¹ã¨ãã function add_vect(a, b){ return vect(a.x+b.x, a.y+b.y) } function sub_vect(a, b){ return vect(a.x-b.x, a.y-b.y) } function scale_vect(s, v){ return vect(s*v.x, s*v.y) }
ãã¨ã¯ãé©åãªç®æã«returnãèªåã§ããã¦ãããªããã°ãªããªãç¨åº¦ã§ãã»ã¨ãã©SICPã½ã¼ã¹ãã®ã¾ã¾ç§»æ¤å¯è½ã ããããªå ·åã«ã
//ãã¬ã¼ã å ã¸ãã¯ã¿ãåå function frame_coord_map(f){ return function(v){ return add_vect( f.origin, add_vect( scale_vect(v.x, f.edge1), scale_vect(v.y, f.edge2))) } } //ç·åãæç»ããdraw_lineæç¶ããæä¸ã§ããã¨ãã¦ãç·åã®ãªã¹ããæç»ãããã¤ã³ã¿ãè¿ã function segment2painter(ls){ return function(f){ var map = frame_coord_map(f); for( var i=0, len=ls.length; i<len; i++ ){ draw_line( map(ls[i].start), map(ls[i].end) ); } } }
canvasã®APIã«ä¾åããã®ã¯ã絶対座æ¨ã«ããç·åãæç»ããã¨ãã(ã¢ãã£ã³å¤æ+å¹³è¡ç§»åããä¸ã§)ç»åãæç»ããã¨ãã®ããªããã£ããªå¦çãããã ã
var ctx = document.getElementById("canvas").getContext("2d"); function draw_line(start, end){ ctx.beginPath(); ctx.moveTo(start.x, start.y); ctx.lineTo(end.x, end.y); ctx.stroke(); } function draw_image(id){ var img = document.getElementById(id); return function(f){ var w = img.width; var h = img.height; ctx.setTransform( f.edge1.x/w, f.edge1.y/h, f.edge2.x/w, f.edge2.y/h, f.origin.x, f.origin.y); ctx.drawImage(img, 0, 0); ctx.setTransform(1, 0, 0, 1, 0, 0); } }
ãããªæãããã¨ã¯å®éã«åãã¦ããã¨ããã§ã確èªãï¼IEã§canvasã使ããããã«ããã©ã¤ãã©ãªã¯å
¥ãã¦ãªãã®ã§ãã¢ãã³ãªãã©ã¦ã¶ã§ã©ããï¼ã
ãã®å³å½¢è¨èªæ½è±¡ã¯ãªããªãé¢ç½ããªã¨æã£ããããã¡ããåã£ããã¨ãã§ãããããã¯ã¾ãä»åº¦ã