<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
  <channel>
     <title>RayGay blog</title>
     <link>http://jesper.kalliope.org/blog/</link>
     <language>da</language>
     <item>
  <title><![CDATA[Fontrendering]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2008&month=09#06]]></link>
  <description><![CDATA[
<p>Raytraceren kan nu rendere <a href="http://en.wikipedia.org/wiki/Truetype">truetype</a> fonte. Disse bliver renderet ved at udregne sk&aelig;ringerne mellem rays og de extrudede kvadratiske <a href="http://en.wikipedia.org/wiki/Bezier_curves">B&eacute;zier splines</a> som tegnene er bygget op af. Da tegnene ikke bliver omregnet til trekanter, er objekterne perfekte uanset hvor langt man zoomer ind.</p>
<p><a href="http://jesper.kalliope.org/blog/files/helvetica.png"><img border="0" src="http://jesper.kalliope.org/blog/files/helvetica_thumbnail.png"></a></p>
]]></description>
  <pubDate><![CDATA[06 Sep 2008 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Leget&oslash;jsflyver]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2008&month=08#04]]></link>
  <description><![CDATA[
<p>Brugte min f&oslash;rste sommerferieformiddag p&aring; at kode en importer til Wavefront OBJ meshes. Dette er et af de &aelig;ldste og mest udbredte 3D-filformater.</p>
<p>Nedenst&aring;ende billede bruger den geniale Gilles Trans gratis model af en <a href="http://www.oyonale.com/modeles.php?lang=en&page=56">leget&oslash;jsflyver</a>.</p>
<p><a href="http://jesper.kalliope.org/blog/files/toyplane.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/toyplane_thumbnail.png"></a></p>
]]></description>
  <pubDate><![CDATA[04 Aug 2008 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Boy surface]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2008&month=08#02]]></link>
  <description><![CDATA[
<p>Inspireret af <a href="http://mathworld.wolfram.com/BoySurface.html">skulpturen</a> af Boys overflade, har jeg lavet en wireframe udgave af overfladen.</p>
<p><a href="http://jesper.kalliope.org/blog/files/boy-surface-1.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/boy-surface-1_thumbnail.png"></a></p>
<p><a href="http://jesper.kalliope.org/blog/files/boy-surface-2.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/boy-surface-2_thumbnail.png"></a></p>
<p><a href="http://jesper.kalliope.org/blog/files/boy-surface-3.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/boy-surface-3_thumbnail.png"></a></p>
<p><a href="http://jesper.kalliope.org/blog/files/boy-surface-4.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/boy-surface-4_thumbnail.png"></a></p>
<p><a href="http://www.mirland.dk/">Mirland</a> lavede et nyt sexet skrivebordstapet:</p>
<p><a href="http://jesper.kalliope.org/blog/files/boy-surface-mirland.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/boy-surface-mirland_thumbnail.png"></a></p>
<p>Scenen er baseret p&aring; en simpel funktion som kan forvandle enhver 2D-parametrisering til en wireframe model.</p>
<div class="vim">;; Stroke a path with cylinders with spheres as joints 
;; A path is a function from [0,1] to R^3
(define (stroke-path path radius mat num)
  (let ((result '()))
    (dotimes i num
      (let* ((t1 (/ i num))
        (t2 (/ (+ i 1) num))
        (p1 (path t1))
        (p2 (path t2)))
   (set! result (cons (make-sphere p1 radius mat) result))
   (set! result (cons (make-cylinder p1 p2 radius mat) result))))
 result))  

;; Make a wiremesh out of a parametric surface.
;; @param surface-func the parametric description of the surface 
;;        as a function (u,v) -> R^3.
;; @param u-wires number of wires in the u-dimension.
;; @param v-wires number of wires in the v-dimension.
;; @param u-num number of cylinders to build each u-wire with. 
;; @param v-num number of cylinders to build each v-wire with. 
;; @param radius radius of the wires.
;; @param mat material of the wires.
(define (make-parametric-surface-as-wireframe 
	 surface-func u-wires v-wires u-num v-num radius mat)
 (define result '())
 (do ((u 0 (+ u 1))) ((= u u-wires))
  (set! result (append result
		(stroke-path
		 (lambda (t) (surface-func (/ u u-wires) t))
		 radius mat v-num))))
 (do ((v 0 (+ v 1))) ((= v v-wires))
  (set! result (append result
		(stroke-path
		 (lambda (t) (surface-func t (/ v v-wires)))
		 radius mat u-num))))
 result)
</div>	
]]></description>
  <pubDate><![CDATA[02 Aug 2008 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Project Euler - R6RS - Blandede billeder]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2008&month=04#13]]></link>
  <description><![CDATA[
<p>Har brugt en del tid p&aring; at l&oslash;se opgaver i <a href="http://projecteuler.net/">Project Euler</a>.  Dermed har jeg f&aring;et luget ud i en del bugs i min Scheme-implementation.</p>

<h>R6RS</h>
<p>Dette har ogs&aring; v&aelig;ret motivationen til at implementere store dele af <a href="http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib.html">standardbiblioteket</a> som den nye Scheme-standard kr&aelig;ver. Det har bla. medf&oslash;rt at alle source-filer forventes at v&aelig;re i UTF-8, hvormed man nu kan bruge symboler som <tt>&pi;</tt>, <tt>&lambda;</tt> eller <tt>vector&rarr;list</tt> istedet for <tt>PI</tt>, <tt>lambda</tt> og <tt>vector->list</tt>.</p>

<h>Blandede billeder</h>
<p>Nogle billeder som jeg har brugt til at debugge fejl i traceren med.</p> 
<p>Orthocircles i 16:10 format, dvs. kan bruges som baggrundstapet p&aring; widescreen-sk&aelig;rme.
	Orthocircles er en isosurface (her renderet via marchingcubes) med formlen:</p>
<p>((x<sup>2</sup> + y<sup>2</sup> - 1)<sup>2</sup> + z<sup>2</sup>) ((y<sup>2</sup> + z<sup>2</sup> - 1)<sup>2</sup> + x<sup>2</sup>) ((z<sup>2</sup> + x<sup>2</sup> - 1)<sup>2</sup> + y<sup>2</sup>) -  0.0375<sup>2</sup> (1 + 3 (x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup>)) = 0</p> 

<p><a href="http://jesper.kalliope.org/blog/files/orthocircles-2000-samples.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/orthocircles-2000-samples_thumbnail.png"></a></p>
<p>Den klassiske tepotte i 16:9 format.</p>
<p><a href="http://jesper.kalliope.org/blog/files/teapot.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/teapot_thumbnail.png"></a></p>
<p>Venii fra Milo i forskellige farver.</p>
<p><a href="http://jesper.kalliope.org/blog/files/venus.png"><img style="border:0px" src="http://jesper.kalliope.org/blog/files/venus_thumbnail.png"></a></p>
]]></description>
  <pubDate><![CDATA[13 Apr 2008 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Benchmarks]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2007&month=11#29]]></link>
  <description><![CDATA[
<p>Under udviklingen af min Scheme, har målet hele tiden været at slå GNUs Scheme <a href="http://www.gnu.org/software/guile/guile.html">Guile</a>, hvilket jeg endnu ikke gør. Guile er stadig over dobbelt så hurtig som min implementation.</p>
<p>Men hvor hurtig er Guile og min Scheme i forhold til at andre fortolkede sprog? Er <a href="http://www.perl.org/" title="The Perl Directory - perl.org">Perl</a> og <a href="http://www.python.org/" title="Python Programming Language -- Official Website">Python</a> og <a href="http://www.ruby-lang.org/" title="Ruby Programming Language">Ruby</a> to eller ti gange hurtigere end Guile? I hvert sprog kodede jeg en lille benchmark test, som udregner de første 36 Fibonacci tal. </p>
<p>Nedenstående er benchmarken i hhv. Ruby, Perl, Python og Scheme.</p>
<div class="vim">def fib(n)
  if n &lt; 2
    n
  else
    fib(n-1) + fib(n-2)
  end
end

36.times do |i|
  puts "#{i} : #{fib(i)}"
end
</div>
<br>
<div class="vim">sub fib {
    my $n = shift;
    if ($n &lt; 2) {
        return $n
    } else {
        return fib($n-1) + fib($n-2);
    }
}

foreach my $i (0..35) {
    print "$i : ".fib($i)."\n";
}
</div>
<br>
<div class="vim">def fib(n):
   if n &lt; 2:
      return n
   else:
      return fib(n-1) + fib(n-2)

for i in range(36):
    print "%d : %d" % (i, fib(i))
</div>
<br>
<div class="vim">(define (fib n)
  (if (&lt; n 2)
    n
    (+ (fib (- n 1)) 
       (fib (- n 2)))))

(do ((i 0 (+ i 1)))
  ((= i 36))
  (display i) (display " : ")
  (display (fib i)) (newline))
</div>
<br>
<p>Algorithen er meget dum og genererer en masse funktions-kald og garbage. En af Scheme's forcer er tail-call optimering, hvilket dog ikke er muligt i denne algoritme (da plus-operatoren venter på resultaterne), så sammenligningen er, omend ikke særlig videnskabelig, så ihvertfald fair i den sammenhæng. Algoritmen er ikke den smarteste måde at udregne Fibonacci tal på. En simpel iteration over <tt>n</tt> ville være meget meget hurtigere, men jeg gik efter noget langsomt til denne test. Udførselstiderne er som følger. Lavest tid er bedst.
<table>
	<tr><th>Sprog</th><th>Version</th><th>Tid</th></tr>
	<tr><td>Guile</td><td>1.8.1</td><td>30.73s</td></tr>
	<tr><td>Python</td><td>2.5.1</td><td>36.45s</td></tr>
	<tr><td>Raygay</td><td>0.5.0</td><td>72.50s</td></tr>
	<tr><td>Perl</td><td>5.8.8</td><td>74.30s</td></tr>
	<tr><td>Ruby</td><td>1.8.6</td><td>183.87s</td></tr>
</table>
<br>
</p>
<p>Min upræcise benchmark giver følgende upræcise konklusioner: min Scheme, Raygay, er hurtigere end Perl! Python er dobbelt så hurtigt som Perl - interessant. Så det passer at Ruby er sløvt. Guile er hurtigst af alle, så det giver heldigvis mening at have den som mål.</p>

]]></description>
  <pubDate><![CDATA[29 Nov 2007 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Mandelbrot]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2007&month=11#24]]></link>
  <description><![CDATA[
<p>Scheme er et fantastisk sprog til at lege med algoritmer. Her er et program som plotter <a href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot-mængden</a>:</p>
<div class="vim" id="scheme">(define max-iterations 100)

(define (mandelbrot c)
 (define (mandelbrot-inner z i)
  (cond ((&gt; (magnitude z) 4.0) 'escaped)
        ((= i max-iterations) 'did-not-escape)
	(else (mandelbrot-inner 
	        (+ c (* z z)) (+ 1 i)))))
 (mandelbrot-inner c 0))

(do ((y -1 (+ y 0.1)))
 ((&gt;= y 1))
 (do ((x -2 (+ x 0.05)))
  ((&gt;= x 1) (newline))
  (case (mandelbrot (make-rectangular x y))
    ((escaped) (display "."))
    ((did-not-escape) (display "#")))))
</div>
<br>
<div class="vim"><small>
............................................................
............................................................
....................................####....................
....................................####....................
..............................#..##########.................
..............................#################.............
............................###################.............
...........................#####################............
.................#######..######################............
................#########.######################............
.....#....####################################..............
................#########.######################............
.................#######..######################............
...........................#####################............
............................###################.............
..............................#################.............
..............................#..##########.................
....................................####....................
....................................####....................
............................................................
............................................................
</small>	
</div>]]></description>
  <pubDate><![CDATA[24 Nov 2007 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Uniformt fordelt kugleoverflade]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2007&month=10#27]]></link>
  <description><![CDATA[
<p>I Monte-Carlo pathtracing har man brug for punkter som er uniformt fordelte på enhedskuglen <i>S<sup>2</sup></i>.</p>
<p>Jeg har kode som finder perfekt uniformt fordelte punkter i [0,1]&times;[0,1] og har nu fundet en
uniform mapning derfra til <i>S<sup>2</sup></i>.</p>
<p>Den beror på, at hver af de tre koordinater for uniformt fordelte punkter på <i>S<sup>2</sup></i> faktisk er uniformt fordelte på [0,1]. De tre koordinater er selvfølgelig ikke uafhængige.</p>
<p>Man kan derfor vælge een akse (her z-aksen) og finde en uniformt fordelt værdi på den akse. Dermed skal de resterende to koordinater findes på en cirkel parallelt til XY-planet med almindeligt trigonometri.</p>
<p>Lad <i>(s,t)</i> tilhøre [0,1]&times;[0,1]. Fastlæg <i>z</i> med det samme som 2<i>s</i>-1.
Lad radius <i>r</i> = sqrt(1-<i>z</i><sup>2</sup>). Lad placeringen på cirklen være &phi; = 2 <i>t</i> &pi;. Så kan <i>(x,y,z)</i> udtrykkes som (<i>r</i> cos &phi;, <i>r</i> sin &phi;, <i>z</i>).</p>
<p>Sådan ser det ud i Scheme:</p>
<div class="vim" id="scheme">(define (plane->sphere p)
   (let* ((z (- (* 2 (car p)) 1))
          (t (* 2 PI (cadr p)))
          (r (sqrt (- 1 (* z z)))))
      (vector (* r (cos t)) (* r (sin t)) z)))
</div>
<br>
<p>Nedenstående viser omkr. 1000 Poisson-disk fordelte punkter mappet til en kugle.</p>
<p><a href="http://jesper.kalliope.org/blog/files/uniform-sphere.png"><img src="http://jesper.kalliope.org/blog/files/uniform-sphere_thumbnail.png"></a></p>
<p>Bemærk især, hvordan punkterne <i>ikke</i> klumper sammen omkring z-aksen.</p>]]></description>
  <pubDate><![CDATA[27 Oct 2007 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[&pi;]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2007&month=10#13]]></link>
  <description><![CDATA[
<p>
Jeg har længe ville prøve at udregne &pi; i et eller andet antal mange decimaler. Kiggede på det i dag og fandt den ret nye <a href="http://mathworld.wolfram.com/BBPFormula.html">Bailey-Borwein-Plouffe formel</a> fra 1995. På utrolig vis lader den een udtrække decimaler een ad gangen. Den udregner decimaler i base 16, dvs. hexadecimal, hvilket er helt fint. Det interessante er også at formlen er fundet af et computerprogram som kan manipulere symbolsk algebra.
</p>
<p>Der er endnu ikke fundet en tilsvarende formel til at udtrække decimaler i base 10. Nu vi alligevel springer rundt mellem baser, kan det gøres endnu simplere. Her en noget simplere formel som giver alle decimaler til &pi; - denne gang i base &pi;:</p>
<p style="text-align:center">&pi; = 10</p>]]></description>
  <pubDate><![CDATA[13 Oct 2007 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Peter de Jong - Masser af kasser]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2007&month=10#12]]></link>
  <description><![CDATA[
<p>
    Skrev for snart længe siden en <a href="http://local.wasp.uwa.edu.au/~pbourke/fractals/peterdejong/">Peter de Jong attractor</a>. Her er resultatet.
</p>	
<p><a href="http://jesper.kalliope.org/blog/files/jong.png"><img src="http://jesper.kalliope.org/blog/files/jong_thumbnail.png"></a></p>

<h>Masser af kasser</h>
<p>Et nyt baggrundstapet.</p>
<p><a href="http://jesper.kalliope.org/blog/files/boxes-blue.png"><img src="http://jesper.kalliope.org/blog/files/boxes-blue_thumbnail.png"></a></p>
]]></description>
  <pubDate><![CDATA[12 Oct 2007 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Seam Carving - Fyldte tegn]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2007&month=10#07]]></link>
  <description><![CDATA[
<p>Har på under <a href="http://jesper.kalliope.org/blog/files/image-retargeting.scm">100 linier</a> Scheme kodet en simpel udgave af <i>seam carving</i> som opfundet af Shai Avidan og <a href="http://www.faculty.idc.ac.il/arik/">Ariel Shamir</a> i deres artikel "Seam Carving for Content-Aware Image Resizing" fra <i>SIGGRAPH</i> 2007.
</p>	
<p><a href="http://jesper.kalliope.org/blog/files/sommerfugl.png"><img src="http://jesper.kalliope.org/blog/files/sommerfugl_thumbnail.png"></a></p>
<p>blev skaleret til</p>
<p><a href="http://jesper.kalliope.org/blog/files/sommerfugl2.png"><img src="http://jesper.kalliope.org/blog/files/sommerfugl2_thumbnail.png"></a></p>

<h>Fyldte tegn</h>
<p>Min truetype font plotter kan nu også fylde tegn ud.</p>
<p><a href="http://jesper.kalliope.org/blog/files/filled-text.png"><img src="http://jesper.kalliope.org/blog/files/filled-text_thumbnail.png"></a></p>
<p>Er snart klar med koden som renderer glyffer som extrudede 3D-objekter.</p>]]></description>
  <pubDate><![CDATA[07 Oct 2007 12:00:00 +0100]]></pubDate>
</item>
<item>
  <title><![CDATA[Halftone - GZIP]]></title>
  <link><![CDATA[http://jesper.kalliope.org/blog/?year=2007&month=09#01]]></link>
  <description><![CDATA[
<p>Konvertede en af mine animationer til <a href="http://en.wikipedia.org/wiki/Halftone">halftone</a>. Jeg gjorde det på 5 minutter med en Photoshop macro, men effekten er så fed, at jeg måske ender med at kode et postprocessing filter til traceren, som kan gøre det samme.</p>
<p><a href="http://jesper.kalliope.org/blog/files/caustics-halftone.mp4"><img src="http://jesper.kalliope.org/blog/files/caustics_halftone_thumbnail.png"></a></p>

<h>GZIP</h>
<p>Har kodet en GZIP decompressor efter <a href="http://tools.ietf.org/html/rfc1951">RFC 1951</a> og <a href="http://tools.ietf.org/html/rfc1952">RFC 1952</a>. Planen er lave et <a href="http://en.wikipedia.org/wiki/Ifstream">C++ ifstream</a>-interface ovenpå og så lade traceren automatisk pakke .gz filer ud. Det er f.eks. smart til store objekter, både <a href="http://en.wikipedia.org/wiki/PLY_%28file_format%29">PLY-format</a> eller mit Scheme-format.</p>]]></description>
  <pubDate><![CDATA[01 Sep 2007 12:00:00 +0100]]></pubDate>
</item>

  </channel>
</rss>
