PageSourceSearch

https://www.michaelfogleman.com/projects/

html michaelfogleman.com collected 2026-10-02 03:04:24 UTC 149,234 bytes, 4,345 lines download raw bytes

1
2
3<!DOCTYPE html>
4<html lang="en">
5<head>
6    <!-- Google tag (gtag.js) -->
vendor: 68 bytes, lines 6-7
6
7    <script async src="https://www.googletagmanager.com/gtag/js?id=
7G-9EB7SEMF70
vendor: 16 bytes, lines 7-8
7"></script>
8    
8<script>
9        
vendor: 151 bytes, lines 9-12
9window.dataLayer = window.dataLayer || [];
10        function gtag(){dataLayer.push(arguments);}
11        gtag('js', new Date());
12        gtag('config', '
12G-9EB7SEMF70
vendor: 8 bytes, lines 12-13
12');
13    
13</script>
13
14    <meta charset="utf-8">
15    <meta http-equiv="X-UA-Compatible" content="IE=edge">
16    <meta name="viewport" content="width=device-width, initial-scale=1">
17    <title>Michael Fogleman: Projects</title>
18    <link rel="icon" type="image/png" href="/static/favicon.png?bust=1496020346">
19    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Merriweather|Quicksand:400,500">
20    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
21    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
22    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.min.css">
23    <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/themes/prism.min.css" rel="stylesheet">
24    <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/plugins/line-numbers/prism-line-numbers.min.css" rel="stylesheet">
25    <link rel="stylesheet" href="/static/style.css?bust=1614013756">
26    
26<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
26
27    
27<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
27
28    
28<script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.min.js"></script>
28
29    
29<script src="/static/js/echo.min.js?bust=1495842393"></script>
29
30    
30<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/prism.min.js"></script>
30
31    
31<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/plugins/normalize-whitespace/prism-normalize-whitespace.min.js"></script>
31
32    
32<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
32
33    
33<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/components/prism-python.min.js"></script>
33
34    <!--[if lt IE 9]>
35        
35<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
35
36        
36<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
36
37    <![endif]-->
38    
39    
40</head>
41<body>
42
43    <div class="header">
44        <h1><a href="/">Michael Fogleman</a></h1>
45        <p class="lead">
46            <a href="/projects/">Projects</a> &bull;
47            <!-- <a href="/plotter/">Artwork</a> &bull; -->
48            <a href="/about/">About</a> &bull;
49            <a href="/resume/">Resume</a> &bull;
50            <a href="/more/">More</a>
51        </p>
52    </div>
53    <div class="content">
54        
55
56<div class="container">
57    <h2>
58        Projects
59        
60    </h2>
61    <p class="lead">This page highlights several of my personal software projects.</p>
62    <h4>Table of Contents</h4>
63    <div class="row hidden-xs">
64        
65            <div class="col-sm-3">
66                <ul class="list-unstyled">
67                    
68                        <li><a href="#pack3d">3D Packing</a></li>
69                    
70                        <li><a href="#allrgb">AllRGB</a></li>
71                    
72                        <li><a href="#axi">AxiDraw</a></li>
73                    
74                        <li><a href="#cellular-forms">Cellular Forms</a></li>
75                    
76                        <li><a href="#terrarium">Contour Maps</a></li>
77                    
78                        <li><a href="#craft">Craft</a></li>
79                    
80                        <li><a href="#dcpu-16">DCPU-16</a></li>
81                    
82                        <li><a href="#dlaf">DLA</a></li>
83                    
84                        <li><a href="#domain-coloring">Domain Coloring</a></li>
85                    
86                        <li><a href="#fauxgl">FauxGL</a></li>
87                    
88                        <li><a href="#feed-notifier">Feed Notifier</a></li>
89                    
90                </ul>
91            </div>
92        
93            <div class="col-sm-3">
94                <ul class="list-unstyled">
95                    
96                        <li><a href="#fireflies">Fireflies</a></li>
97                    
98                        <li><a href="#future-blocks">Future Blocks</a></li>
99                    
100                        <li><a href="#game-frame">Game Frame</a></li>
101                    
102                        <li><a href="#go-graphics">Go Graphics</a></li>
103                    
104                        <li><a href="#gps">GPS</a></li>
105                    
106                        <li><a href="#graph-layout">Graph Layout</a></li>
107                    
108                        <li><a href="#hmm">Heightmap Meshing</a></li>
109                    
110                        <li><a href="#hirise">HiRISE</a></li>
111                    
112                        <li><a href="#imeme">iMeme</a></li>
113                    
114                        <li><a href="#line-art">Line Art</a></li>
115                    
116                        <li><a href="#mapper">Mapper</a></li>
117                    
118                </ul>
119            </div>
120        
121            <div class="col-sm-3">
122                <ul class="list-unstyled">
123                    
124                        <li><a href="#mesh-simplification">Mesh Simplification</a></li>
125                    
126                        <li><a href="#mister-queen">Mister Queen</a></li>
127                    
128                        <li><a href="#nes">NES Emulator</a></li>
129                    
130                        <li><a href="#pac-man">Pac-Man</a></li>
131                    
132                        <li><a href="#path-tracer">Path Tracer</a></li>
133                    
134                        <li><a href="#physarum">Physarum Simulation</a></li>
135                    
136                        <li><a href="#piet">Piet</a></li>
137                    
138                        <li><a href="#pirate-maps">Pirate Maps</a></li>
139                    
140                        <li><a href="#point-maps">Point Maps</a></li>
141                    
142                        <li><a href="#primitive">Primitive</a></li>
143                    
144                        <li><a href="#quads">Quads</a></li>
145                    
146                </ul>
147            </div>
148        
149            <div class="col-sm-3">
150                <ul class="list-unstyled">
151                    
152                        <li><a href="#phrases">Random Phrases</a></li>
153                    
154                        <li><a href="#ribbon">Ribbon Diagrams</a></li>
155                    
156                        <li><a href="#ricochet-robot">Ricochet Robot</a></li>
157                    
158                        <li><a href="#rush">Rush Hour</a></li>
159                    
160                        <li><a href="#scale">Scale</a></li>
161                    
162                        <li><a href="#sdf">SDF Modeling</a></li>
163                    
164                        <li><a href="#star-rocket">Star Rocket</a></li>
165                    
166                        <li><a href="#tiling">Tiling</a></li>
167                    
168                        <li><a href="#traveling-pixel">Traveling Pixel</a></li>
169                    
170                        <li><a href="#word-warrior">Word Warrior</a></li>
171                    
172                </ul>
173            </div>
174        
175    </div>
176    <div class="row visible-xs">
177        
178            <div class="col-xs-6">
179                <ul class="list-unstyled">
180                    
181                        <li><a href="#pack3d">3D Packing</a></li>
182                    
183                        <li><a href="#allrgb">AllRGB</a></li>
184                    
185                        <li><a href="#axi">AxiDraw</a></li>
186                    
187                        <li><a href="#cellular-forms">Cellular Forms</a></li>
188                    
189                        <li><a href="#terrarium">Contour Maps</a></li>
190                    
191                        <li><a href="#craft">
191Craft</a></li>
192                    
193                        <li><a href="#dcpu-16">DCPU-16</a></li>
194                    
195                        <li><a href="#dlaf">DLA</a></li>
196                    
197                        <li><a href="#domain-coloring">Domain Coloring</a></li>
198                    
199                        <li><a href="#fauxgl">FauxGL</a></li>
200                    
201                        <li><a href="#feed-notifier">Feed Notifier</a></li>
202                    
203                        <li><a href="#fireflies">Fireflies</a></li>
204                    
205                        <li><a href="#future-blocks">Future Blocks</a></li>
206                    
207                        <li><a href="#game-frame">Game Frame</a></li>
208                    
209                        <li><a href="#go-graphics">Go Graphics</a></li>
210                    
211                        <li><a href="#gps">GPS</a></li>
212                    
213                        <li><a href="#graph-layout">Graph Layout</a></li>
214                    
215                        <li><a href="#hmm">Heightmap Meshing</a></li>
216                    
217                        <li><a href="#hirise">HiRISE</a></li>
218                    
219                        <li><a href="#imeme">iMeme</a></li>
220                    
221                        <li><a href="#line-art">Line Art</a></li>
222                    
223                        <li><a href="#mapper">Mapper</a></li>
224                    
225                </ul>
226            </div>
227        
228            <div class="col-xs-6">
229                <ul class="list-unstyled">
230                    
231                        <li><a href="#mesh-simplification">Mesh Simplification</a></li>
232                    
233                        <li><a href="#mister-queen">Mister Queen</a></li>
234                    
235                        <li><a href="#nes">NES Emulator</a></li>
236                    
237                        <li><a href="#pac-man">Pac-Man</a></li>
238                    
239                        <li><a href="#path-tracer">Path Tracer</a></li>
240                    
241                        <li><a href="#physarum">Physarum Simulation</a></li>
242                    
243                        <li><a href="#piet">Piet</a></li>
244                    
245                        <li><a href="#pirate-maps">Pirate Maps</a></li>
246                    
247                        <li><a href="#point-maps">Point Maps</a></li>
248                    
249                        <li><a href="#primitive">Primitive</a></li>
250                    
251                        <li><a href="#quads">Quads</a></li>
252                    
253                        <li><a href="#phrases">Random Phrases</a></li>
254                    
255                        <li><a href="#ribbon">Ribbon Diagrams</a></li>
256                    
257                        <li><a href="#ricochet-robot">Ricochet Robot</a></li>
258                    
259                        <li><a href="#rush">Rush Hour</a></li>
260                    
261                        <li><a href="#scale">Scale</a></li>
262                    
263                        <li><a href="#sdf">SDF Modeling</a></li>
264                    
265                        <li><a href="#star-rocket">Star Rocket</a></li>
266                    
267                        <li><a href="#tiling">Tiling</a></li>
268                    
269                        <li><a href="#traveling-pixel">Traveling Pixel</a></li>
270                    
271                        <li><a href="#word-warrior">Word Warrior</a></li>
272                    
273                </ul>
274            </div>
275        
276    </div>
277</div>
278
279
280    <div class="project-sort">
281        <ul class="nav nav-pills">
282            
283    <li class="active"><a href="/projects/by/date/"><i class="fa fa-calendar"></i>
284by Date</a></li>
285            
286    <li ><a href="/projects/by/stars/"><i class="fa fa-star-o"></i>
287by Stars</a></li>
288            
289    <li ><a href="/projects/by/name/"><i class="fa fa-sort-alpha-asc"></i>
290by Name</a></li>
291        </ul>
292    </div>
293
294
295
296    
297    <a name="sdf"></a>
298    
299    
300
301
302
303
304
305    
306    
307    
308    
309    
310
311
312<div class="project container">
313    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
314        
315        
316    </div>
317    
318        <h3><a href="/projects/sdf/">SDF Modeling</a> <small>January 2021</small></h3>
319    
320    
321        <p class="project-tags">
322            
323                <a href="https://github.com/fogleman/sdf"><span class="label label-warning"><i class="fa fa-star"></i> 1,748</span></a>
324            
325            
326                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
327            
328                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
329            
330                <a href="/projects/tagged/meshing/"><span class="label label-default">Meshing</span></a>
331            
332        </p>
333    
334    <div class="row project-images">
335        <div class="col col-sm-8">
336            <p class="lead">Generate 3D meshes based on signed distance functions with a dirt simple Python API.</p>
337            <div class="project-summary">
338                <p>The goal of this library is to provide a simple, fun, and easy-to-use API for generating 3D models in our favorite language Python. The code simply uses the <a href="https://en.wikipedia.org/wiki/Marching_cubes">Marching Cubes</a> algorithm to generate a mesh from a <a href="https://en.wikipedia.org/wiki/Signed_distance_function">signed distance function</a> (SDF). This would normally be abysmally slow in Python. However, numpy is used to evaluate the SDF on entire batches of points simultaneously. Furthermore, multiple threads are used to process batches in parallel. The result is surprisingly fast (for marching cubes). Supports text, 2D extrusion &amp; revolution, image masks, various file formats, and more!</p>
339
340<p>The code below is a complete example which generates the model shown in the image. This is the canonical <a href="https://en.wikipedia.org/wiki/Constructive_solid_geometry">Constructive Solid Geometry</a> example. Note the use of operators for intersection, union, and difference.</p>
341
342<pre><code class="language-python">
343from sdf import *
344
345f = sphere(1) & box(1.5)
346
347c = cylinder(0.5)
348f -= c.orient(X) | c.orient(Y) | c.orient(Z)
349
350f.save('out.stl')
351</code></pre>
352
353            </div>
354            
355            
356                <p class="project-links">
357                    Links:
358                    
359                        <a href="https://github.com/fogleman/sdf">GitHub</a>
360                    
361                </p>
362            
363        </div>
364        
365            
366                
367                
368                <div class="col col-sm-4">
369                    <a href="/static/img/project/sdf/1.png?bust=1614013756" class="project-image">
370                        
371                            <img src="/static/img/project/sdf/placeholder/1.png?bust=1614013767" data-echo="/static/img/project/sdf/thumbn
371ail/1.png?bust=1614013767" class="img-responsive center-block">
372                        
373                    </a>
374                </div>
375                
376                    <div class="clearfix"></div>
377                
378            
379        
380    </div>
381    
382</div>
383
384    
385        <hr>
386    
387    <a name="physarum"></a>
388    
389    
390
391
392
393
394
395    
396    
397    
398    
399    
400
401
402<div class="project container">
403    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
404        
405        
406    </div>
407    
408        <h3><a href="/projects/physarum/">Physarum Simulation</a> <small>November 2020</small></h3>
409    
410    
411        <p class="project-tags">
412            
413                <a href="https://github.com/fogleman/physarum"><span class="label label-warning"><i class="fa fa-star"></i> 898</span></a>
414            
415            
416                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
417            
418                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
419            
420                <a href="/projects/tagged/generative/"><span class="label label-default">Generative</span></a>
421            
422                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
423            
424        </p>
425    
426    <div class="row project-images">
427        <div class="col col-sm-12">
428            <p class="lead">Particle-based simulation of slime molds.</p>
429            <div class="project-summary">
430                <p>Inspired by <a href="https://sagejenson.com/physarum">Sage Jenson&#39;s article</a> on simulating the Physarum polycephalum slime mold. The algorithm is surprisingly simple, given how complex its outputs appear. That&#39;s the magic of generative algorithms! There are several configurable parameters, which are randomized for each run. This would be a great candidate for running on the GPU, but my implementation is purely CPU-based and written in Go. There is an OpenGL-based viewer, however, so you can watch the simulation as it runs. A lot more could be done here... food sources, life &amp; death, evolution, etc.</p>
431
432            </div>
433            
434            
435                <p class="project-links">
436                    Links:
437                    
438                        <a href="https://github.com/fogleman/physarum">GitHub</a>
439                    
440                </p>
441            
442        </div>
443        
444            
445                
446                
447                <div class="col col-sm-3">
448                    <a href="/static/img/project/physarum/1.png?bust=1607136649" class="project-image">
449                        
450                            <img src="/static/img/project/physarum/placeholder/1.png?bust=1607136658" data-echo="/static/img/project/physarum/thumbnail/1.png?bust=1607136658" class="img-responsive center-block">
451                        
452                    </a>
453                </div>
454                
455            
456        
457            
458                
459                
460                <div class="col col-sm-3 hidden-xs">
461                    <a href="/static/img/project/physarum/2.png?bust=1607136649" class="project-image">
462                        
463                            <img src="/static/img/project/physarum/placeholder/2.png?bust=1607136659" data-echo="/static/img/project/physarum/thumbnail/2.png?bust=1607136659" class="img-responsive center-block">
464                        
465                    </a>
466                </div>
467            
468        
469            
470                
471                
472                <div class="col col-sm-3 hidden-xs">
473                    <a href="/static/img/project/physarum/3.png?bust=1607136649" class="project-image">
474                        
475                            <img src="/static/img/project/physarum/placeholder/3.png?bust=1607136660" data-echo="/static/img/project/physarum/thumbnail/3.png?bust=1607136660" class="img-responsive center-block">
476                        
477                    </a>
478                </div>
479            
480        
481            
482                
483                
484                <div class="col col-sm-3 hidden-xs">
485                    <a href="/static/img/project/physarum/4.png?bust=1607136649" class="project-image">
486                        
487                            <img src="/static/img/project/physarum/placeholder/4.png?bust=1607136663" data-echo="/static/img/project/physarum/thumbn
487ail/4.png?bust=1607136663" class="img-responsive center-block">
488                        
489                    </a>
490                </div>
491            
492        
493    </div>
494    
495</div>
496
497    
498        <hr>
499    
500    <a name="hmm"></a>
501    
502    
503
504
505
506
507
508    
509    
510    
511    
512    
513
514
515<div class="project container">
516    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
517        
518        
519    </div>
520    
521        <h3><a href="/projects/hmm/">Heightmap Meshing</a> <small>August 2019</small></h3>
522    
523    
524        <p class="project-tags">
525            
526                <a href="https://github.com/fogleman/hmm"><span class="label label-warning"><i class="fa fa-star"></i> 601</span></a>
527            
528            
529                <a href="/projects/tagged/c/"><span class="label label-default">C++</span></a>
530            
531                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
532            
533                <a href="/projects/tagged/meshing/"><span class="label label-default">Meshing</span></a>
534            
535        </p>
536    
537    <div class="row project-images">
538        <div class="col col-sm-7">
539            <p class="lead">Convert any grayscale heightmap into a 3D triangle mesh.</p>
540            <div class="project-summary">
541                <p>This is a modern implementation of a nice algorithm from the 1995 paper <a href="http://mgarland.org/files/papers/scape.pdf">Fast Polygonal Approximation of Terrains and Height Fields</a> by Garland and Heckbert. The meshes produced by <code>hmm</code> satisfy the Delaunay condition and can satisfy a specified maximal error or maximal number of triangles or vertices. It&#39;s also very fast!</p>
542
543            </div>
544            
545                <p><a href="/projects/hmm/">Read more...</a></p>
546            
547            
548                <p class="project-links">
549                    Links:
550                    
551                        <a href="https://github.com/fogleman/hmm">GitHub</a>
552                    
553                </p>
554            
555        </div>
556        
557            
558                
559                
560                <div class="col col-sm-5">
561                    <a href="/static/img/project/hmm/1.png?bust=1567206773" class="project-image">
562                        
563                            <img src="/static/img/project/hmm/placeholder/1.png?bust=1567206833" data-echo="/static/img/project/hmm/thumbnail/1.png?bust=1567206833" class="img-responsive center-block">
564                        
565                    </a>
566                </div>
567                
568                    <div class="clearfix"></div>
569                
570            
571        
572            
573                
574                
575                <div class="col col-sm-12 hidden-xs">
576                    <a href="/static/img/project/hmm/2.png?bust=1567206773" class="project-image">
577                        
578                            <img src="/static/img/project/hmm/placeholder/2.png?bust=1567206836" data-echo="/static/img/project/hmm/thumbnail/2.png?bust=1567206836" class="img-responsive center-block">
579                        
580                    </a>
581                </div>
582            
583        
584    </div>
585    
586</div>
587
588    
589        <hr>
590    
591    <a name="cellular-forms"></a>
592    
593    
594
595
596
597
598
599    
600    
601    
602    
603    
604
605
606<div class="project container">
607    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
608        
609        
610    </div>
611    
612        <h3><a href="/projects/cellular-forms/">Cellular Forms</a> <small>June 2019</small></h3>
613    
614    
615        <p class="project-tags">
616            
617                <a href="https://github.com/fogleman/CellularForms"><span class="label label-warning"><i class="fa fa-star"></i> 156</span></a>
618            
619            
620                <a href="/projects/tagged/c/"><span class="label label-default">C++</span></a>
621            
622                <a href="/projects/tagged/generative/"><span class="label label-default">Generative</span></a>
623            
624                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
625            
626        </p>
627    
628    <div class="row project-images">
629        <div class="col col-sm-8">
630            <p class="lead">An implementation of Andy Lomas&#39; Cellular Forms.</p>
631            <div class="project-summary">
632                <p>This is an implementation of a generative algorithm by Andy Lomas, described 
632in his paper <a href="http://www.andylomas.com/extra/andylomas_paper_cellular_forms_aisb50.pdf">Cellular Forms: an Artistic Exploration of
633Morphogenesis</a>.</p>
634
635<p>While Andy implemented his algorithm on the GPU, my implementation is CPU-based. It includes a real-time viewer where you can watch the forms grow. It can also export STLs, which I used to then ray-trace the results. I found it interesting to &quot;chop&quot; the models in half, revealing their intricate inner structure as shown in the image here.</p>
636
637            </div>
638            
639            
640                <p class="project-links">
641                    Links:
642                    
643                        <a href="https://github.com/fogleman/CellularForms">GitHub</a>
644                    
645                </p>
646            
647        </div>
648        
649            
650                
651                
652                <div class="col col-sm-4">
653                    <a href="/static/img/project/cellular-forms/1.png?bust=1568314226" class="project-image">
654                        
655                            <img src="/static/img/project/cellular-forms/placeholder/1.png?bust=1568314233" data-echo="/static/img/project/cellular-forms/thumbnail/1.png?bust=1568314233" class="img-responsive center-block">
656                        
657                    </a>
658                </div>
659                
660                    <div class="clearfix"></div>
661                
662            
663        
664    </div>
665    
666</div>
667
668    
669        <hr>
670    
671    <a name="dlaf"></a>
672    
673    
674
675
676
677
678
679    
680    
681    
682    
683    
684
685
686<div class="project container">
687    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
688        
689        
690    </div>
691    
692        <h3><a href="/projects/dlaf/">DLA</a> <small>February 2019</small></h3>
693    
694    
695        <p class="project-tags">
696            
697                <a href="https://github.com/fogleman/dlaf"><span class="label label-warning"><i class="fa fa-star"></i> 190</span></a>
698            
699            
700                <a href="/projects/tagged/c/"><span class="label label-default">C++</span></a>
701            
702                <a href="/projects/tagged/generative/"><span class="label label-default">Generative</span></a>
703            
704                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
705            
706                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
707            
708        </p>
709    
710    <div class="row project-images">
711        <div class="col col-sm-8">
712            <p class="lead">Fast diffusion-limited aggregation in both 2D and 3D.</p>
713            <div class="project-summary">
714                <p>This is a small program that generates diffusion-limited aggregations in either 2D or 3D. The output is a CSV file containing the coordinates of the particles and their relationship to one another. Rendering is out of scope, but I have produced several example renders. The code is very configurable - there are a few parameters that you can tweak and there are also several code hooks that allow you to alter the algorithm&#39;s behavior.</p>
715
716            </div>
717            
718            
719                <p class="project-links">
720                    Links:
721                    
722                        <a href="https://github.com/fogleman/dlaf">GitHub</a>
723                    
724                </p>
725            
726        </div>
727        
728            
729                
730                
731                <div class="col col-sm-4">
732                    <a href="/static/img/project/dlaf/1.png?bust=1550177958" class="project-image">
733                        
734                            <img src="/static/img/project/dlaf/placeholder/1.png?bust=1550177967" data-echo="/static/img/project/dlaf/thumbnail/1.png?bust=1550177967" class="img-responsive center-block">
735                        
736                    </a>
737                </div>
738                
739                    <div class="clearfix"></div>
740                
741            
742        
743    </div>
744    
745</div>
746
747    
748        <hr>
749    
750    <a name="rush"></a>
751    
752    
753
754
755
756
757
758    
759    
760    
761    
762    
763
764
765<div class="project container">
766    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
767        
768        
769    </div>
770    
771        <h3><a href="/projects/rush/">Rush Hour</a> <small>June 2018</small></h3>
772    
773    
774        <p class="project-tags">
775            
776                <a href="https://github.com/fogleman/rush"><span class="label label-warning"><i class="fa fa-star"></i> 314</span></a>
777            
778            
779                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
780            
781                <a href="/projects/tagged/c/"><span class="label label-default">C++</span></a>
782            
783                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
784            
785                <a href="/projects/tagged/ai/"><span class="label label-default">AI</span></a>
786            
787        </p>
788    
789    <div class="row project-images">
790        <div class="col col-sm-8">
791            <p class="lead">I solved the Rush Hour puzzle game and created a database of every interesting starting position.</p>
792            <div class="project-summary">
793                <p><a href="https://www.amazon.com/Think-Fun-Traffic-Logic-Girls/dp/B00000DMER">Rush Hour</a> is a 6x6 sliding block puzzle invented by <a href="https://en.wikipedia.org/wiki/Nob_Yoshigahara">Nob Yoshigahara</a> in the 1970s. It was first sold in the United States in 1996.</p>
794
795<p>I played a clone of this game on my first iPhone several years ago. Recently, I stumbled on the physical incarnation of it and instantly bought it on Amazon for my kids to play. We&#39;ve been having fun with it, but naturally I was most interested in writing some code to solve the puzzles.</p>
796
797<p>I did more than write a simple puzzle solver. I ended up computing every possible puzzle and built a complete database of every &quot;interesting&quot; starting position. It was quite challenging (and exciting!) so I wrote a whole article about it. <a href="https://www.michaelfogleman.com/rush/">Check it out!</a></p>
798
799            </div>
800            
801            
802                <p class="project-links">
803                    Links:
804                    
805                        <a href="https://github.com/fogleman/rush">GitHub</a> &bull;
806                    
807                        <a href="https://www.michaelfogleman.com/rush/">Article</a> &bull;
808                    
809                        <a href="https://www.michaelfogleman.com/static/rush/">Play Online!</a>
810                    
811                </p>
812            
813        </div>
814        
815            
816                
817                
818                <div class="col col-sm-4">
819                    <a href="/static/img/project/rush/1.gif?bust=1531542023" class="project-image">
820                        
821                            <img src="/static/img/project/rush/placeholder/1.png?bust=1531542028" data-echo="/static/img/project/rush/1.gif?bust=1531542023" class="img-responsive center-block">
822                        
823                    </a>
824                </div>
825                
826                    <div class="clearfix"></div>
827                
828            
829        
830    </div>
831    
832</div>
833
834    
835        <hr>
836    
837    <a name="domain-coloring"></a>
838    
839    
840
841
842
843
844
845    
846    
847    
848    
849    
850
851
852<div class="project container">
853    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
854        
855        
856    </div>
857    
858        <h3><a href="/projects/domain-coloring/">Domain Coloring</a> <small>March 2018</small></h3>
859    
860    
861        <p class="project-tags">
862            
863                <a href="https://github.com/fogleman/domaincoloring"><span class="label label-warning"><i class="fa fa-star"></i> 52</span></a>
864            
865            
866                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
867            
868                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
869            
870                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
871            
872        </p>
873    
874    <div class="row project-images">
875        <div class="col col-sm-12">
876            <p class="lead">Visualize complex functions by coloring each point in the complex plane.</p>
877            <div class="project-summary">
878                <p>This was a quick experiment inspired by 3Blue1Brown&#39;s video called <a href="https://www.youtube.com/watch?v=b7FxPsqfkOY">How to solve 2D equations using color</a>. The colorings are based on the magnitude and/or phase of the complex numbers transformed by a function. The coloring algorithm can be as simple or as complicated as you can imagine, providing plenty of room for creativity.</p>
879
880            </div>
881            
882            
883                <p class="project-links">
884                    Links:
885                    
886                        <a href="https://github.com/fogleman/domaincoloring">GitHub</a>
887                    
888                </p>
889            
890        </div>
891        
892            
893                
894                
895                <div class="col col-sm-4">
896                    <a href="/static/img/project/domain-coloring/1.png?bust=1523583661" class="project-image">
897                        
898                            <img src="/static/img/project/domain-coloring/placeholder/1.png?bust=1523583665" data-echo="/static/img/project/domain-coloring/thumbnail/1.png?bust=1523583665" class="img-responsive center-block">
899                        
900                    </a>
901                </div>
902                
903            
904        
905            
906                
907                
908                <div class="col col-sm-4 hidden-xs">
909                    <a href="/static/img/project/domain-coloring/2.png?bust=1523646069" class="project-image">
910                        
911                            <img src="/static/img/project/domain-coloring/placeholder/2.png?bust=1523646076" data-echo="/static/img/project/domain-coloring/thumbnail/2.png?bust=1523646076" class="img-responsive center-block">
912                        
913                    </a>
914                </div>
915            
916        
917            
918                
919                
920                <div class="col col-sm-4 hidden-xs">
921                    <a href="/static/img/project/domain-coloring/3.png?bust=1523646069" class="project-image">
922                        
923                            <img src="/static/img/project/domain-coloring/placeholder/3.png?bust=1523646077" data-echo="/static/img/project/domain-coloring/thumbnail/3.png?bust=1523646077" class="img-responsive center-block">
924                        
925                    </a>
926                </div>
927            
928        
929    </div>
930    
931</div>
932
933    
934        <hr>
935    
936    <a name="terrarium"></a>
937    
938    
939
940
941
942
943
944    
945    
946    
947    
948    
949
950
951<div class="project container">
952    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
953        
954        
955    </div>
956    
957        <h3><a href="/projects/terrarium/">Contour Maps</a> <small>February 2018</small></h3>
958    
959    
960        <p class="project-tags">
961            
962                <a href="https://github.com/fogleman/terrarium"><span class="label label-warning"><i class="fa fa-star"></i> 229</span></a>
963            
964            
965                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
966            
967                <a href="/projects/tagged/vector/"><span class="label label-default">Vector</span></a>
968            
969                <a href="/projects/tagged/maps/"><span class="label label-default">Maps</span></a>
970            
971        </p>
972    
973    <div class="row project-images">
974        <div class="col col-sm-12">
975            <p class="lead">Generate vector-based contour maps using AWS terrain tiles.</p>
976            <div class="project-summary">
977                <p>This code generates <a href="https://en.wikipedia.org/wiki/Topographic_map">topographic maps</a> (using contour lines) based on elevation data. It can automatically fetch and cache <a href="https://aws.amazon.com/public-datasets/terrain/">terrain tiles from AWS</a>
977. It can render a region defined by a lat/lng bounding box or by a shapefile (such as for a given country or state). I used this code to draw topographic maps on my AxiDraw pen plotter.</p>
978
979<p>The example below shows the topography of the Grand Canyon and its surroundings with contour lines separated by 50 meters in elevation.</p>
980
981            </div>
982            
983            
984                <p class="project-links">
985                    Links:
986                    
987                        <a href="https://github.com/fogleman/terrarium">GitHub</a>
988                    
989                </p>
990            
991        </div>
992        
993            
994                
995                
996                <div class="col col-sm-12">
997                    <a href="/static/img/project/terrarium/1.png?bust=1523583206" class="project-image">
998                        
999                            <img src="/static/img/project/terrarium/placeholder/1.png?bust=1523583216" data-echo="/static/img/project/terrarium/thumbnail/1.png?bust=1523583216" class="img-responsive center-block">
1000                        
1001                    </a>
1002                </div>
1003                
1004            
1005        
1006    </div>
1007    
1008</div>
1009
1010    
1011        <hr>
1012    
1013    <a name="pack3d"></a>
1014    
1015    
1016
1017
1018
1019
1020
1021    
1022    
1023    
1024    
1025    
1026
1027
1028<div class="project container">
1029    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1030        
1031        
1032    </div>
1033    
1034        <h3><a href="/projects/pack3d/">3D Packing</a> <small>June 2017</small></h3>
1035    
1036    
1037        <p class="project-tags">
1038            
1039                <a href="https://github.com/fogleman/pack3d"><span class="label label-warning"><i class="fa fa-star"></i> 336</span></a>
1040            
1041            
1042                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1043            
1044                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
1045            
1046                <a href="/projects/tagged/optimization/"><span class="label label-default">Optimization</span></a>
1047            
1048        </p>
1049    
1050    <div class="row project-images">
1051        <div class="col col-sm-8">
1052            <p class="lead">Tightly pack 3D meshes into as small of a volume as possible.</p>
1053            <div class="project-summary">
1054                <p>Formlabs recently announced the <a href="https://formlabs.com/3d-printers/fuse-1/">Fuse 1</a>, a 3D printer that works via <a href="https://en.wikipedia.org/wiki/Selective_laser_sintering">Selective Laser Sintering</a>. This technique uses a nylon powder which conveniently supports the structures as they are printed. No scaffolding or supports are needed, so we can print as many objects as we can pack into the volume.</p>
1055
1056<p>This begs the question - how many <a href="http://www.3dbenchy.com/">3DBenchy boats</a> can the Fuse 1 print in a single batch? As soon as the printer was announced, I immediately gravitated toward this algorithmic challenge.</p>
1057
1058<p>With naive bin packing, 82 boats can be packed into the printer volume. But with some more advanced packing algorithms, 113 boats can fit - a 37.8% improvement!</p>
1059
1060<p><a href="/pack3d/">Read the article here.</a></p>
1061
1062            </div>
1063            
1064            
1065                <p class="project-links">
1066                    Links:
1067                    
1068                        <a href="https://github.com/fogleman/pack3d">GitHub</a> &bull;
1069                    
1070                        <a href="/pack3d/">Article</a>
1071                    
1072                </p>
1073            
1074        </div>
1075        
1076            
1077                
1078                
1079                <div class="col col-sm-4">
1080                    <a href="/static/img/project/pack3d/1.png?bust=1498257529" class="project-image">
1081                        
1082                            <img src="/static/img/project/pack3d/placeholder/1.png?bust=1498257534" data-echo="/static/img/project/pack3d/thumbnail/1.png?bust=1498257533" class="img-responsive center-block">
1083                        
1084                    </a>
1085                </div>
1086                
1087                    <div class="clearfix"></div>
1088                
1089            
1090        
1091    </div>
1092    
1093</div>
1094
1095    
1096        <hr>
1097    
1098    <a name="ribbon"></a>
1099    
1100    
1101
1102
1103
1104
1105
1106    
1107    
1108    
1109    
1110    
1111
1112
1113<div class="project container">
1114    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1115        
1116        
1117    </div>
1118    
1119        <h3><a href="/projects/ribbon/">Ribbon Diagrams</a> <small>February 2017</small></h3>
1120    
1121    
1122        <p class="project-tags">
1123            
1124                <a href="https://github.com/fogleman/ribbon"><span class="label label-warning"><i class="fa fa-star"></i> 249</span></a>
1125            
1126            
1127                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1128            
1129                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
1130            
1131                <a href="/projects/tagged/science/"><span class="label label-default">Science</span></a>
1132            
1133        </p>
1134    
1135    <div class="row project-images">
1136        <div class="col col-sm-12">
1137            <p class="lead">Parse PDB files and render ribbon diagrams of proteins.</p>
1138            <div class="project-summary">
1139                <p><a href="https://en.wikipedia.org/wiki/Ribbon_diagram">Ribbon diagrams</a> are 3D schematic representations of protein structure.</p>
1140
1141<p>You&#39;ve probably happened upon these before. I always thought they looked very complex and never figured I&#39;d know how to create such a diagram myself. After creating FauxGL, however, I was in search of interesting 3D visualizations and decided to research these interesting diagrams.</p>
1142
1143<p>Roughly, proteins are chains of amino acids that are pieced together while reading genetic code. As a protein is formed, these chains will fold in various ways, forming helixes, strands, and coils. A ribbon diagram depicts the 3D structure of the protein as well as these common secondary structures.</p>
1144
1145<p>The <a href="http://www.rcsb.org/pdb/home/home.do">Protein Data Bank</a> is an online database of over 130,000 PDB files. These files encode all of the information needed to produce a ribbon diagram. With this software, you can simply type <code>rcsb XXXX</code> where <code>XXXX</code> is the alphanumeric PDB code and a PNG will be generated in a few seconds.</p>
1146
1147            </div>
1148            
1149            
1150                <p class="project-links">
1151                    Links:
1152                    
1153                        <a href="https://github.com/fogleman/ribbon">GitHub</a> &bull;
1154                    
1155                        <a href="https://twitter.com/RibbonDiagrams">Twitter Bot</a> &bull;
1156                    
1157                        <a href="https://www.michaelfogleman.com/static/atp-synthase/">
1157Large Tiled Render</a>
1158                    
1159                </p>
1160            
1161        </div>
1162        
1163            
1164                
1165                
1166                <div class="col col-sm-4">
1167                    <a href="/static/img/project/ribbon/1.png?bust=1495842393" class="project-image">
1168                        
1169                            <img src="/static/img/project/ribbon/placeholder/1.png?bust=1496007712" data-echo="/static/img/project/ribbon/thumbnail/1.png?bust=1496007712" class="img-responsive center-block">
1170                        
1171                    </a>
1172                </div>
1173                
1174            
1175        
1176            
1177                
1178                
1179                <div class="col col-sm-4 hidden-xs">
1180                    <a href="/static/img/project/ribbon/2.png?bust=1495842393" class="project-image">
1181                        
1182                            <img src="/static/img/project/ribbon/placeholder/2.png?bust=1496007713" data-echo="/static/img/project/ribbon/thumbnail/2.png?bust=1496007713" class="img-responsive center-block">
1183                        
1184                    </a>
1185                </div>
1186            
1187        
1188            
1189                
1190                
1191                <div class="col col-sm-4 hidden-xs">
1192                    <a href="/static/img/project/ribbon/3.png?bust=1495842393" class="project-image">
1193                        
1194                            <img src="/static/img/project/ribbon/placeholder/3.png?bust=1496007714" data-echo="/static/img/project/ribbon/thumbnail/3.png?bust=1496007714" class="img-responsive center-block">
1195                        
1196                    </a>
1197                </div>
1198            
1199        
1200    </div>
1201    
1202</div>
1203
1204    
1205        <hr>
1206    
1207    <a name="fauxgl"></a>
1208    
1209    
1210
1211
1212
1213
1214
1215    
1216    
1217    
1218    
1219    
1220
1221
1222<div class="project container">
1223    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1224        
1225        
1226    </div>
1227    
1228        <h3><a href="/projects/fauxgl/">FauxGL</a> <small>January 2017</small></h3>
1229    
1230    
1231        <p class="project-tags">
1232            
1233                <a href="https://github.com/fogleman/fauxgl"><span class="label label-warning"><i class="fa fa-star"></i> 911</span></a>
1234            
1235            
1236                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1237            
1238                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
1239            
1240                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
1241            
1242        </p>
1243    
1244    <div class="row project-images">
1245        <div class="col col-sm-12">
1246            <p class="lead">3D software rendering in pure Go. No OpenGL, no C extensions, no nothin&#39;.</p>
1247            <div class="project-summary">
1248                <p>It&#39;s like OpenGL, but it&#39;s not. It&#39;s FauxGL.</p>
1249
1250<p>It doesn&#39;t use your graphics card, only your CPU. So it&#39;s slow and unsuitable for realtime rendering. But it&#39;s still pretty fast. It works the same way OpenGL works - <a href="https://en.wikipedia.org/wiki/Rasterisation">rasterization</a>.</p>
1251
1252<p>I mostly wrote this for fun and for learning, but I&#39;ve already found it useful in other projects.</p>
1253
1254<h4>Features</h4>
1255
1256<ul>
1257<li>STL, OBJ, PLY, 3DS file formats</li>
1258<li>triangle rasterization</li>
1259<li>vertex and fragment &quot;shaders&quot;</li>
1260<li>view volume clipping, face culling</li>
1261<li>alpha blending</li>
1262<li>textures</li>
1263<li>depth biasing</li>
1264<li>wireframe rendering</li>
1265<li>built-in shapes (plane, sphere, cube, cylinder, cone)</li>
1266<li>anti-aliasing (via supersampling)</li>
1267<li>parallel processing</li>
1268</ul>
1269
1270            </div>
1271            
1272            
1273                <p class="project-links">
1274                    Links:
1275                    
1276                        <a href="https://github.com/fogleman/fauxgl">GitHub</a>
1277                    
1278                </p>
1279            
1280        </div>
1281        
1282            
1283                
1284                
1285                <div class="col col-sm-12">
1286                    <a href="/static/img/project/fauxgl/1.png?bust=1495842393" class="project-image">
1287                        
1288                            <img src="/static/img/project/fauxgl/placeholder/1.png?bust=1496007711" data-echo="/static/img/project/fauxgl/thumbn
1288ail/1.png?bust=1496007711" class="img-responsive center-block">
1289                        
1290                    </a>
1291                </div>
1292                
1293            
1294        
1295    </div>
1296    
1297</div>
1298
1299    
1300        <hr>
1301    
1302    <a name="axi"></a>
1303    
1304    
1305
1306
1307
1308
1309
1310    
1311    
1312    
1313    
1314    
1315
1316
1317<div class="project container">
1318    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1319        
1320        
1321    </div>
1322    
1323        <h3><a href="/projects/axi/">AxiDraw</a> <small>January 2017</small></h3>
1324    
1325    
1326        <p class="project-tags">
1327            
1328                <a href="https://github.com/fogleman/axi"><span class="label label-warning"><i class="fa fa-star"></i> 281</span></a>
1329            
1330            
1331                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
1332            
1333                <a href="/projects/tagged/vector/"><span class="label label-default">Vector</span></a>
1334            
1335                <a href="/projects/tagged/hardware/"><span class="label label-default">Hardware</span></a>
1336            
1337        </p>
1338    
1339    <div class="row project-images">
1340        <div class="col col-sm-8">
1341            <p class="lead">Unofficial Python library for working with the AxiDraw pen plotter.</p>
1342            <div class="project-summary">
1343                <p>The AxiDraw is a very nice modern pen plotter. It ships with Inkscape-based software for controlling it, but I was more interested in programmatically controlling it myself. So I wrote this library that controls the plotter directly over the USB serial port.</p>
1344
1345<p>The most interesting part of this project, for me, was writing my own motion planning algorithm. I stuck with constant-acceleration for simplicity, and the code for the planner came out to just a couple hundred lines of Python!</p>
1346
1347<p>See the motion planning algorithm in action in this <a href="https://bl.ocks.org/fogleman/raw/240854789bd3603444a77667514d0f52/">web-based visualization</a>.</p>
1348
1349<h4>Features</h4>
1350
1351<ul>
1352<li>control the AxiDraw directly from Python with a simple API</li>
1353<li>convenient command-line utility</li>
1354<li>constant acceleration (trapezoidal velocity) motion planning</li>
1355<li>path drawing order optimization</li>
1356<li>drawing transformations</li>
1357<li>preview drawing (render to png)</li>
1358<li>turtle graphics</li>
1359<li>lindenmayer systems</li>
1360</ul>
1361
1362            </div>
1363            
1364            
1365                <p class="project-links">
1366                    Links:
1367                    
1368                        <a href="https://github.com/fogleman/axi">GitHub</a> &bull;
1369                    
1370                        <a href="https://medium.com/@fogleman/pen-plotter-programming-the-basics-ec0407ab5929">Medium Article</a>
1371                    
1372                </p>
1373            
1374        </div>
1375        
1376            
1377                
1378                
1379                <div class="col col-sm-4">
1380                    <a href="/static/img/project/axi/1.jpg?bust=1523309754" class="project-image">
1381                        
1382                            <img src="/static/img/project/axi/placeholder/1.png?bust=1523309848" data-echo="/static/img/project/axi/thumbnail/1.jpg?bust=1523309848" class="img-responsive center-block">
1383                        
1384                    </a>
1385                </div>
1386                
1387                    <div class="clearfix"></div>
1388                
1389            
1390        
1391    </div>
1392    
1393</div>
1394
1395    
1396        <hr>
1397    
1398    <a name="primitive"></a>
1399    
1400    
1401
1402
1403
1404
1405
1406    
1407    
1408    
1409    
1410    
1411
1412
1413<div class="project container">
1414    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1415        
1416        
1417    </div>
1418    
1419        <h3><a href="/projects/primitive/">Primitive</a> <small>September 2016</small></h3>
1420    
1421    
1422        <p class="project-tags">
1423            
1424                <a href="https://github.com/fogleman/primitive"><span class="label label-warning"><i class="fa fa-star"></i> 13,067</span></a>
1425            
1426            
1427                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1428            
1429                <a href="/projects/tagged/objective-c/"><span class="label label-default">Objective-C</span></a>
1430            
1431                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
1432            
1433                <a href="/projects/tagged/vector/"><span class="label label-default">Vector</span></a>
1434            
1435                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
1436            
1437                <a href="/projects/tagged/optimization/"><span class="label label-default">Optimization</span></a>
1438            
1439        </p>
1440    
1441    <div class="row project-images">
1442        <div class="col col-sm-12">
1443            <p class="lead">Recreate your photos with vector-based geometric primitives.</p>
1444            <div class="project-summary">
1445                <p>You provide an image as input. The app tries to find the most optimal shape that can be drawn to maximize the similarity between the target image and the drawn image. It repeats this process, adding one shape at a time. Using this process, the program can recreate a photo with surprisingly few shapes.</p>
1446
1447<p>This project was originally inspired by the popular and excellent work of Roger Johansson - <a href="https://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/">Genetic Programming: Evolution of Mona Lisa</a>. Since seeing that article when it was quite new, I&#39;ve tinkered with this problem here and there over the years. But only now am I satisfied with my results.</p>
1448
1449<p>The core is written in Go and is open source. A native macOS app is also available in the App Store, providing a nice UI on top of the engine as well as some additional features like &quot;drawing mode.&quot; To date, this has been my most successful paid app.</p>
1450
1451            </div>
1452            
1453            
1454                <p class="project-links">
1455                    Links:
1456                    
1457                        <a href="https://github.com/fogleman/primitive">GitHub</a> &bull;
1458                    
1459                        <a href="https://primitive.lol/">Website</a> &bull;
1460                    
1461                        <a href="https://itunes.apple.com/us/app/primitive/id1175103038?mt=12">App Store</a> &bull;
1462                    
1463                        <a href="https://twitter.com/PrimitivePic">Twitter Bot</a>
1464                    
1465                </p>
1466            
1467        </div>
1468        
1469            
1470                
1471                
1472                <div class="col col-sm-4">
1473                    <a href="/static/img/project/primitive/1.png?bust=1495842393" class="project-image">
1474                        
1475                            <img src="/static/img/project/primitive/placeholder/1.png?bust=1496007695" data-echo="/static/img/project/primitive/thumbn
1475ail/1.png?bust=1496007695" class="img-responsive center-block">
1476                        
1477                    </a>
1478                </div>
1479                
1480            
1481        
1482            
1483                
1484                
1485                <div class="col col-sm-4 hidden-xs">
1486                    <a href="/static/img/project/primitive/2.png?bust=1495842393" class="project-image">
1487                        
1488                            <img src="/static/img/project/primitive/placeholder/2.png?bust=1496007696" data-echo="/static/img/project/primitive/thumbnail/2.png?bust=1496007696" class="img-responsive center-block">
1489                        
1490                    </a>
1491                </div>
1492            
1493        
1494            
1495                
1496                
1497                <div class="col col-sm-4 hidden-xs">
1498                    <a href="/static/img/project/primitive/3.png?bust=1495842393" class="project-image">
1499                        
1500                            <img src="/static/img/project/primitive/placeholder/3.png?bust=1496007697" data-echo="/static/img/project/primitive/thumbnail/3.png?bust=1496007697" class="img-responsive center-block">
1501                        
1502                    </a>
1503                </div>
1504            
1505        
1506    </div>
1507    
1508</div>
1509
1510    
1511        <hr>
1512    
1513    <a name="mesh-simplification"></a>
1514    
1515    
1516
1517
1518
1519
1520
1521    
1522    
1523    
1524    
1525    
1526
1527
1528<div class="project container">
1529    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1530        
1531        
1532    </div>
1533    
1534        <h3><a href="/projects/mesh-simplification/">Mesh Simplification</a> <small>May 2016</small></h3>
1535    
1536    
1537        <p class="project-tags">
1538            
1539                <a href="https://github.com/fogleman/simplify"><span class="label label-warning"><i class="fa fa-star"></i> 261</span></a>
1540            
1541            
1542                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1543            
1544                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
1545            
1546                <a href="/projects/tagged/meshing/"><span class="label label-default">Meshing</span></a>
1547            
1548        </p>
1549    
1550    <div class="row project-images">
1551        <div class="col col-sm-8">
1552            <p class="lead">Simple command line tool for simplifying meshes in STL format.</p>
1553            <div class="project-summary">
1554                <p>This is a straight-forward implementation of <a href="http://cseweb.ucsd.edu/%7Eravir/190/2016/garland97.pdf">Surface Simplification Using Quadric Error Metrics, SIGGRAPH 97</a>, written in Go. Some problematic meshes don&#39;t simplify very well, but overall it works nicely. Watch the animation - the mesh is repeatedly simplified, starting with 86632 triangles and ending with just 64 triangles. The bunny remains recognizable for an impressive duration.</p>
1555
1556            </div>
1557            
1558            
1559                <p class="project-links">
1560                    Links:
1561                    
1562                        <a href="https://github.com/fogleman/simplify">GitHub</a>
1563                    
1564                </p>
1565            
1566        </div>
1567        
1568            
1569                
1570                
1571                <div class="col col-sm-4">
1572                    <a href="/static/img/project/mesh-simplification/1.gif?bust=1496073130" class="project-image">
1573                        
1574                            <img src="/static/img/project/mesh-simplification/placeholder/1.png?bust=1496007715" data-echo="/static/img/project/mesh-simplification/1.gif?bust=1496073130" class="img-responsive center-block">
1575                        
1576                    </a>
1577                </div>
1578                
1579                    <div class="clearfix"></div>
1580                
1581            
1582        
1583    </div>
1584    
1585</div>
1586
1587    
1588        <hr>
1589    
1590    <a name="point-maps"></a>
1591    
1592    
1593
1594
1595
1596
1597
1598    
1599    
1600    
1601    
1602    
1603
1604
1605<div class="project container">
1606    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1607        
1608        
1609    </div>
1610    
1611        <h3><a href="/projects/point-maps/">Point Maps</a> <small>April 2016</small></h3>
1612    
1613    
1614        <p class="project-tags">
1615            
1616                <a href="https://github.com/fogleman/density"><span class="label label-warning"><i class="fa fa-star"></i> 151</span></a>
1617            
1618            
1619                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1620            
1621                <a href="/projects/tagged/cassandra/"><span class="label label-default">Cassandra</span></a>
1622            
1623                <a href="/projects/tagged/maps/"><span class="label label-default">Maps</span></a>
1624            
1625        </p>
1626    
1627    <div class="row project-images">
1628        <div class="col col-sm-12">
1629            <p class="lead">Custom tile server for rendering millions of points on a map efficie
1629ntly.</p>
1630            <div class="project-summary">
1631                <p>I wrote this as a learning exercise for dealing with huge amounts of data on a map.</p>
1632
1633<p>The points are stored in Cassandra, where they are clustered by their tile coordinates at a predefined map zoom level. When a tile is requested, the tile server can then quickly fetch the correct points. The points are then rendered onto the tile in a way that looks nice but is very performant. The tile server also caches the tiles on disk.</p>
1634
1635            </div>
1636            
1637            
1638                <p class="project-links">
1639                    Links:
1640                    
1641                        <a href="https://github.com/fogleman/density">GitHub</a> &bull;
1642                    
1643                        <a href="https://www.michaelfogleman.com/static/density/">NYC Taxi Visualization</a>
1644                    
1645                </p>
1646            
1647        </div>
1648        
1649            
1650                
1651                
1652                <div class="col col-sm-12">
1653                    <a href="/static/img/project/point-maps/1.png?bust=1495842393" class="project-image">
1654                        
1655                            <img src="/static/img/project/point-maps/placeholder/1.png?bust=1496007716" data-echo="/static/img/project/point-maps/thumbnail/1.png?bust=1496007716" class="img-responsive center-block">
1656                        
1657                    </a>
1658                </div>
1659                
1660            
1661        
1662    </div>
1663    
1664</div>
1665
1666    
1667        <hr>
1668    
1669    <a name="go-graphics"></a>
1670    
1671    
1672
1673
1674
1675
1676
1677    
1678    
1679    
1680    
1681    
1682
1683
1684<div class="project container">
1685    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1686        
1687        
1688    </div>
1689    
1690        <h3><a href="/projects/go-graphics/">Go Graphics</a> <small>February 2016</small></h3>
1691    
1692    
1693        <p class="project-tags">
1694            
1695                <a href="https://github.com/fogleman/gg"><span class="label label-warning"><i class="fa fa-star"></i> 4,684</span></a>
1696            
1697            
1698                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1699            
1700                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
1701            
1702                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
1703            
1704        </p>
1705    
1706    <div class="row project-images">
1707        <div class="col col-sm-12">
1708            <p class="lead">Cairo-inspired 2D graphics library written in pure Go.</p>
1709            <div class="project-summary">
1710                <p>Go has an excellent set of image packages, but what do you do when you want to render 2D graphics? The golang freetype library implements nice anti-aliased rendering of paths, but is primarily for drawing text. So I built <code>gg</code> on top of it to provide a nice, general purpose 2D graphics API inspired by Cairo.</p>
1711
1712<h4>Features</h4>
1713
1714<ul>
1715<li>Anti-aliased rendering</li>
1716<li>Fill and stroke paths</li>
1717<li>Draw images and text</li>
1718<li>Built-in word wrapping</li>
1719<li>Line caps, joins, dashes</li>
1720<li>Gradients and patterns</li>
1721<li>Transformation matrix</li>
1722<li>Push and pop context state</li>
1723<li>Clipping regions</li>
1724</ul>
1725
1726            </div>
1727            
1728            
1729                <p class="project-links">
1730                    Links:
1731                    
1732                        <a href="https://github.com/fogleman/gg">GitHub</a>
1733                    
1734                </p>
1735            
1736        </div>
1737        
1738            
1739                
1740                
1741                <div class="col col-sm-12">
1742                    <a href="/static/img/project/go-graphics/1.png?bust=1495842393" class="project-image">
1743                        
1744                            <img src="/static/img/project/go-graphics/placeholder/1.png?bust=1496007705" data-echo="/static/img/project/go-graphics/thumbnail/1.png?bust=1496007705" class="img-responsive center-block">
1745                        
1746                    </a>
1747                </div>
1748                
1749            
1750        
1751    </div>
1752    
1753</div>
1754
1755    
1756        <hr>
1757    
1758    <a name="traveling-pixel"></a>
1759    
1760    
1761
1762
1763
1764
1765
1766    
1767    
1768    
1769    
1770    
1771
1772
1773<div class="project container">
1774    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1775        
1776        
1777    </div>
1778    
1779        <h3><a href="/projects/traveling-pixel/">Traveling Pixel</a> <small>January 2016</small></h3>
1780    
1781    
1782        <p class="project-tags">
1783            
1784                <a href="https://github.com/fogleman/pixsort"><span class="label label-warning"><i class="fa fa-star"></i> 58</span></a>
1785            
1786            
1787                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1788            
1789                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
1790            
1791                <a href="/projects/tagged/optimization/"><span class="label label-default">Optimization</span></a>
1792            
1793        </p>
1794    
1795    <div class="row project-images">
1796        <div class="col col-sm-9">
1797            <p class="lead">Applying the traveling salesman problem to pixel art.</p>
1798            <div class="project-summary">
1799                <p>This code uses simulated annealing to find the shortest path to visit all black pixels in an image. Then it generates an animated GIF showing the order of traversal.</p>
1800
1801            </div>
1802            
1803            
1804                <p class="project-links">
1805                    Links:
1806                    
1807                        <a href="https://github.com/fogleman/pixsort">GitHub</a>
1808                    
1809                </p>
1810            
1811        </div>
1812        
1813            
1814                
1815                
1816                <div class="col col-sm-3">
1817                    <a href="/static/img/project/traveling-pixel/1.gif?bust=1495842393" class="project-image">
1818                        
1819                            <img src="/static/img/project/traveling-pixel/placeholder/1.png?bust=1496007725" data-echo="/static/img/project/traveling-pixel/1.gif?bust=1495842393" class="img-responsive center-block">
1820                        
1821                    </a>
1822                </div>
1823                
1824                    <div class="clearfix"></div>
1825                
1826            
1827        
1828    </div>
1829    
1830</div>
1831
1832    
1833        <hr>
1834    
1835    <a name="line-art"></a>
1836    
1837    
1838
1839
1840
1841
1842
1843    
1844    
1845    
1846    
1847    
1848
1849
1850<div class="project container">
1851    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1852        
1853        
1854    </div>
1855    
1856        <h3><a href="/projects/line-art/">Line Art</a> <small>January 2016</small></h3>
1857    
1858    
1859        <p class="project-tags">
1860            
1861                <a href="https://github.com/fogleman/ln"><span class="label label-warning"><i class="fa fa-star"></i> 3,336</span></a>
1862            
1863            
1864                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
1865            
1866                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
1867            
1868                <a href="/projects/tagged/vector/"><span class="label label-default">Vector</span></a>
1869            
1870        </p>
1871    
1872    <div class="row project-images">
1873        <div class="col col-sm-12">
1874            <p class="lead">Rendering engine that produces 2D vector graphics (think SVGs) depicting 3D scenes.</p>
1875            <div class="project-summary">
1876                <p>Unlike OpenGL, where the output of the rendering pipeline is a rastered image, the output of <code>ln</code> is a set of 2D vector paths. It supports texturing, CSG, and more! I created this so I could plot 3D drawings with my pen plotter, which naturally requires vector input.</p>
1877
1878            </div>
1879            
1880            
1881                <p class="project-links">
1882                    Links:
1883                    
1884                        <a href="https://github.com/fogleman/ln">GitHub</a>
1885                    
1886                </p>
1887            
1888        </div>
1889        
1890            
1891                
1892                
1893                <div class="col col-sm-3">
1894                    <a href="/static/img/project/line-art/1.png?bust=1495842393" class="project-image">
1895                        
1896                            <img src="/static/img/project/line-art/placeholder/1.png?bust=1496435965" data-echo="/static/img/project/line-art/thumbnail/1.png?bust=1496435965" class="img-responsive center-block">
1897                        
1898                    </a>
1899                </div>
1900                
1901            
1902        
1903            
1904                
1905                
1906                <div class="col col-sm-3 hidden-xs">
1907                    <a href="/static/img/project/line-art/2.jpg?bust=1516799819" class="project-image">
1908                        
1909                            <img src="/static/img/project/line-art/placeholder/2.png?bust=1496435965" data-echo="/static/img/project/line-art/thumbnail/2.jpg?bust=1496435965" class="img-responsive center-block">
1910                        
1911                    </a>
1912                </div>
1913            
1914        
1915            
1916                
1917                
1918                <div class="col col-sm-3 hidden-xs">
1919                    <a href="/static/img/project/line-art/3.png?bust=1496435911" class="project-image">
1920                        
1921                            <img src="/static/img/project/line-art/placeholder/3.png?bust=1496435966" data-echo="/static/img/project/line-art/thumbnail/3.png?bust=1496435966" class="img-responsive center-block">
1922                        
1923                    </a>
1924                </div>
1925            
1926        
1927            
1928                
1929                
1930                <div class="col col-sm-3 hidden-xs">
1931                    <a href="/static/img/project/line-art/4.png?bust=1496435911" class="project-image">
1932                        
1933                            <img src="/static/img/project/line-art/placeholder/4.png?bust=1496435966" data-echo="/static/img/project/line-art/thumbnail/4.png?bust=1496435966" class="img-responsive center-block">
1934                        
1935                    </a>
1936                </div>
1937            
1938        
1939    </div>
1940    
1941</div>
1942
1943    
1944        <hr>
1945    
1946    <a name="pirate-maps"></a>
1947    
1948    
1949
1950
1951
1952
1953
1954    
1955    
1956    
1957    
1958    
1959
1960
1961<div class="project container">
1962    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
1963        
1964        
1965    </div>
1966    
1967        <h3><a href="/projects/pirate-maps/">Pirate Maps</a> <small>December 2015</small></h3>
1968    
1969    
1970        <p class="project-tags">
1971            
1972                <a href="https://github.com/fogleman/PirateMap"><span class="label label-warning"><i class="fa fa-star"></i> 271</span></a>
1973            
1974            
1975                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
1976            
1977                <a href="/projects/tagged/cairo/"><span class="label label-default">Cairo</span></a>
1978            
1979                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
1980            
1981                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
1982            
1983                <a href="/projects/tagged/maps/"><span class="label label-default">Maps</span></a>
1984            
1985        </p>
1986    
1987    <div class="row project-images">
1988        <div class="col col-sm-8">
1989            <p class="lead">Procedurally generated pirate treasure maps. X marks the spot!</p>
1990            <div class="project-summary">
1991                <p>This was my submission in the <a href="https://www.reddit.com/r/proceduralgeneration/">/r/proceduralgeneration</a> monthly challenge. I used several excellent third party libraries...</p>
1992
1993<ul>
1994<li><code>cairo</code> for rendering</li>
1995<li><code>colour</code> for color interpolation</li>
1996<li><code>noise</code> for simplex noise</li>
1997<li><code>Pillow</code> for saving debug images of noise layers</li>
1998<li><code>pyhull</code> for delaunay triangulation</li>
1999<li><code>Shapely</code> for all kinds of 2D geometry operations</li>
2000</ul>
2001
2002            </div>
2003            
2004            
2005                <p class="project-links">
2006                    Links:
2007                    
2008                        <a href="https://github.com/fogleman/PirateMap">GitHub</a>
2009                    
2010                </p>
2011            
2012        </div>
2013        
2014            
2015                
2016                
2017                <div class="col col-sm-4">
2018                    <a href="/static/img/project/pirate-maps/1.png?bust=1495842393" class="project-image">
2019                        
2020                            <img src="/static/img/project/pirate-maps/placeholder/1.png?bust=1496007714" data-echo="/static/img/project/pirate-maps/thumbnail/1.png?bust=1496007714" class="img-responsive center-block">
2021                        
2022                    </a>
2023                </div>
2024                
2025                    <div class="clearfix"></div>
2026                
2027            
2028        
2029    </div>
2030    
2031</div>
2032
2033    
2034        <hr>
2035    
2036    <a name="mapper"></a>
2037    
2038    
2039
2040
2041
2042
2043
2044    
2045    
2046    
2047    
2048    
2049
2050
2051<div class="project container">
2052    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2053        
2054        
2055    </div>
2056    
2057        <h3><a href="/projects/mapper/">Mapper</a> <small>August 2015</small></h3>
2058    
2059    
2060        <p class="project-tags">
2061            
2062                <a href="https://github.com/fogleman/Mapper"><span class="label label-warning"><i class="fa fa-star"></i> 15</span></a>
2063            
2064            
2065                <a href="/projects/tagged/javascript/"><span class="label label-default">JavaScript</span></a>
2066            
2067                <a href="/projects/tagged/maps/"><span class="label label-default">Maps</span></a>
2068            
2069        </p>
2070    
2071    <div class="row project-images">
2072        <div class="col col-sm-8">
2073            <p class="lead">Web app for quickly plotting markers, polylines, polygons, heatmaps, etc. on a map.</p>
2074            <div class="project-summary">
2075                <p>Got geocoordinates but don&#39;t know how to see them quickly? Just paste them into Mapper! Doesn&#39;t matter if it&#39;s comma-separated, whitespace-separated, or something else. You can add multiple datasets and each one can be configured to plot different symbols or styles. Once you&#39;re happy with the visualization, it even has a button that gives you a link for sharing.</p>
2076
2077            </div>
2078            
2079            
2080                <p class="project-links">
2081                    Links:
2082                    
2083                        <a href="https://github.com/fogleman/Mapper">GitHub</a> &bull;
2084                    
2085                        <a href="https://www.michaelfogleman.com/ma
2085pper/">Mapper</a>
2086                    
2087                </p>
2088            
2089        </div>
2090        
2091            
2092                
2093                
2094                <div class="col col-sm-4">
2095                    <a href="/static/img/project/mapper/1.png?bust=1495842393" class="project-image">
2096                        
2097                            <img src="/static/img/project/mapper/placeholder/1.png?bust=1496007728" data-echo="/static/img/project/mapper/thumbnail/1.png?bust=1496007728" class="img-responsive center-block">
2098                        
2099                    </a>
2100                </div>
2101                
2102                    <div class="clearfix"></div>
2103                
2104            
2105        
2106    </div>
2107    
2108</div>
2109
2110    
2111        <hr>
2112    
2113    <a name="nes"></a>
2114    
2115    
2116
2117
2118
2119
2120
2121    
2122    
2123    
2124    
2125    
2126
2127
2128<div class="project container">
2129    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2130        
2131        
2132    </div>
2133    
2134        <h3><a href="/projects/nes/">NES Emulator</a> <small>March 2015</small></h3>
2135    
2136    
2137        <p class="project-tags">
2138            
2139                <a href="https://github.com/fogleman/nes"><span class="label label-warning"><i class="fa fa-star"></i> 5,612</span></a>
2140            
2141            
2142                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
2143            
2144                <a href="/projects/tagged/emulator/"><span class="label label-default">Emulator</span></a>
2145            
2146                <a href="/projects/tagged/opengl/"><span class="label label-default">OpenGL</span></a>
2147            
2148        </p>
2149    
2150    <div class="row project-images">
2151        <div class="col col-sm-12">
2152            <p class="lead">Supports USB joysticks and has an awesome game selection screen.</p>
2153            <div class="project-summary">
2154                <p>I never had an NES as a kid, but I did have a Commodore 64. I played lots of games on it, including Mario ripoffs. Some of my friends had a Nintendo, so I did have some exposure and was always fond of SMB3. Writing an emulator sounded fun and now I can play old Mario classics whenever I want. And yes, it can generate animated GIFs!</p>
2155
2156            </div>
2157            
2158            
2159                <p class="project-links">
2160                    Links:
2161                    
2162                        <a href="https://github.com/fogleman/nes">GitHub</a> &bull;
2163                    
2164                        <a href="https://www.michaelfogleman.com/static/nes/">Title Screen Database</a> &bull;
2165                    
2166                        <a href="https://medium.com/@fogleman/i-made-an-nes-emulator-here-s-what-i-learned-about-the-original-nintendo-2e078c9b28fe">Medium Article</a>
2167                    
2168                </p>
2169            
2170        </div>
2171        
2172            
2173                
2174                
2175                <div class="col col-sm-4">
2176                    <a href="/static/img/project/nes/1.gif?bust=1495842393" class="project-image">
2177                        
2178                            <img src="/static/img/project/nes/placeholder/1.png?bust=1496007700" data-echo="/static/img/project/nes/1.gif?bust=1495842393" class="img-responsive center-block">
2179                        
2180                    </a>
2181                </div>
2182                
2183            
2184        
2185            
2186                
2187                
2188                <div class="col col-sm-4 hidden-xs">
2189                    <a href="/static/img/project/nes/2.gif?bust=1495842393" class="project-image">
2190                        
2191                            <img src="/static/img/project/nes/placeholder/2.png?bust=1496007700" data-echo="/static/img/project/nes/2.gif?bust=1495842393" class="img-responsive center-block">
2192                        
2193                    </a>
2194                </div>
2195            
2196        
2197            
2198                
2199                
2200                <div class="col col-sm-4 hidden-xs">
2201                    <a href="/static/img/project/nes/3.gif?bust=1495842393" class="project-image">
2202                        
2203                            <img src="/static/img/project/nes/placeholder/3.png?bust=1496007700" data-echo="/static/img/project/nes/3.gif?bust=1495842393" class="img-responsive center-block">
2204                        
2205                    </a>
2206                </div>
2207            
2208        
2209    </div>
2210    
2211</div>
2212
2213    
2214        <hr>
2215    
2216    <a name="path-tracer"></a>
2217    
2218    
2219
2220
2221
2222
2223
2224    
2225    
2226    
2227    
2228    
2229
2230
2231<div class="project container">
2232    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2233        
2234        
2235    </div>
2236    
2237        <h3><a href="/projects/path-tracer/">Path Tracer</a> <small>January 2015</small></h3>
2238    
2239    
2240        <p class="project-tags">
2241            
2242                <a href="https://github.com/fogleman/pt"><span class="label label-warning"><i class="fa fa-star"></i> 2,092</span></a>
2243            
2244            
2245                <a href="/projects/tagged/go/"><span class="label label-default">Go</span></a>
2246            
2247                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
2248            
2249                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
2250            
2251        </p>
2252    
2253    <div class="row project-images">
2254        <div class="col col-sm-12">
2255            <p class="lead">CPU-only, unidirectional path tracing engine written in Go.</p>
2256            <div class="project-summary">
2257                <p>This was the first thing that I wrote using Go and I&#39;ve been loving it ever since! The inspiration for this project came from Evan Wallace&#39;s <a href="http://madebyevan.com/webgl-path-tracing/">WebGL Path Tracing</a>.</p>
2258
2259<ul>
2260<li>Supports OBJ and STL file formats</li>
2261<li>Supports textures, bump maps and normal maps</li>
2262<li>Supports raymarching of signed distance fields</li>
2263<li>Supports volume rendering from image slices</li>
2264<li>Supports various material properties</li>
2265<li>Supports configurable depth of field</li>
2266<li>Supports iterative rendering</li>
2267<li>Supports adaptive sampling and firefly reduction</li>
2268<li>Uses k-d trees to accelerate ray intersection tests</li>
2269<li>Uses all CPU cores in parallel</li>
2270<li>
2270100% pure Go with no dependencies besides the standard library</li>
2271</ul>
2272
2273            </div>
2274            
2275            
2276                <p class="project-links">
2277                    Links:
2278                    
2279                        <a href="https://github.com/fogleman/pt">GitHub</a>
2280                    
2281                </p>
2282            
2283        </div>
2284        
2285            
2286                
2287                
2288                <div class="col col-sm-3">
2289                    <a href="/static/img/project/path-tracer/1.png?bust=1495842393" class="project-image">
2290                        
2291                            <img src="/static/img/project/path-tracer/placeholder/1.png?bust=1496007703" data-echo="/static/img/project/path-tracer/thumbnail/1.png?bust=1496007703" class="img-responsive center-block">
2292                        
2293                    </a>
2294                </div>
2295                
2296            
2297        
2298            
2299                
2300                
2301                <div class="col col-sm-3 hidden-xs">
2302                    <a href="/static/img/project/path-tracer/2.png?bust=1495842393" class="project-image">
2303                        
2304                            <img src="/static/img/project/path-tracer/placeholder/2.png?bust=1496007704" data-echo="/static/img/project/path-tracer/thumbnail/2.png?bust=1496007704" class="img-responsive center-block">
2305                        
2306                    </a>
2307                </div>
2308            
2309        
2310            
2311                
2312                
2313                <div class="col col-sm-3 hidden-xs">
2314                    <a href="/static/img/project/path-tracer/3.png?bust=1495842393" class="project-image">
2315                        
2316                            <img src="/static/img/project/path-tracer/placeholder/3.png?bust=1496007705" data-echo="/static/img/project/path-tracer/thumbnail/3.png?bust=1496007705" class="img-responsive center-block">
2317                        
2318                    </a>
2319                </div>
2320            
2321        
2322            
2323                
2324                
2325                <div class="col col-sm-3 hidden-xs">
2326                    <a href="/static/img/project/path-tracer/4.png?bust=1495842393" class="project-image">
2327                        
2328                            <img src="/static/img/project/path-tracer/placeholder/4.png?bust=1496007705" data-echo="/static/img/project/path-tracer/thumbnail/4.png?bust=1496007705" class="img-responsive center-block">
2329                        
2330                    </a>
2331                </div>
2332            
2333        
2334    </div>
2335    
2336</div>
2337
2338    
2339        <hr>
2340    
2341    <a name="mister-queen"></a>
2342    
2343    
2344
2345
2346
2347
2348
2349    
2350    
2351    
2352    
2353    
2354
2355
2356<div class="project container">
2357    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2358        
2359        
2360    </div>
2361    
2362        <h3><a href="/projects/mister-queen/">Mister Queen</a> <small>October 2014</small></h3>
2363    
2364    
2365        <p class="project-tags">
2366            
2367                <a href="https://github.com/fogleman/MisterQueen"><span class="label label-warning"><i class="fa fa-star"></i> 165</span></a>
2368            
2369            
2370                <a href="/projects/tagged/c/"><span class="label label-default">C</span></a>
2371            
2372                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
2373            
2374                <a href="/projects/tagged/ai/"><span class="label label-default">AI</span></a>
2375            
2376        </p>
2377    
2378    <div class="row project-images">
2379        <div class="col col-sm-10">
2380            <p class="lead">Mr. Queen is a nice little chess engine written in C.</p>
2381            <div class="project-summary">
2382                <p>I wrote my first chess engine back in college. It didn&#39;t play very well because I never really figured out the advanced search techniques. More recently, after a long hiatus, I tried my hand at writing a chess engine again, and Mister Queen is the result. It&#39;s pretty weak among computer chess engines, but it can beat me handily. Features include:</p>
2383
2384<ul>
2385<li>Bitboards and &quot;magic&quot; bitboards for board representation and super-fast move generation.</li>
2386<li>Custom, hash-based opening book based on over three million games from the FICS database.</li>
2387<li>Zobrist hashing and a transposition table storing exact values and the best move.</li>
2388<li>Null move pruning, aspiration windows, iterative deepening, quiescence search.</li>
2389<li>Supports the Universal Chess Interface (UCI).</li>
2390<li>Passes all perft tests.</li>
2391</ul>
2392
2393<p>
2393David Kopec used Mister Queen in a chess app for the Apple TV! Read what he wrote about that <a href="http://www.observationalhazard.com/2016/03/five-months-on-apple-tv-app-store.html">here</a>.</p>
2394
2395            </div>
2396            
2397            
2398                <p class="project-links">
2399                    Links:
2400                    
2401                        <a href="https://github.com/fogleman/MisterQueen">GitHub</a>
2402                    
2403                </p>
2404            
2405        </div>
2406        
2407            
2408                
2409                
2410                <div class="col col-sm-2">
2411                    <a href="/static/img/project/mister-queen/1.png?bust=1495842393" class="project-image">
2412                        
2413                            <img src="/static/img/project/mister-queen/placeholder/1.png?bust=1496007716" data-echo="/static/img/project/mister-queen/thumbnail/1.png?bust=1496007716" class="img-responsive center-block">
2414                        
2415                    </a>
2416                </div>
2417                
2418                    <div class="clearfix"></div>
2419                
2420            
2421        
2422    </div>
2423    
2424</div>
2425
2426    
2427        <hr>
2428    
2429    <a name="gps"></a>
2430    
2431    
2432
2433
2434
2435
2436
2437    
2438    
2439    
2440    
2441    
2442
2443
2444<div class="project container">
2445    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2446        
2447        
2448    </div>
2449    
2450        <h3><a href="/projects/gps/">GPS</a> <small>September 2014</small></h3>
2451    
2452    
2453        <p class="project-tags">
2454            
2455                <a href="https://github.com/fogleman/GPS"><span class="label label-warning"><i class="fa fa-star"></i> 67</span></a>
2456            
2457            
2458                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
2459            
2460                <a href="/projects/tagged/opengl/"><span class="label label-default">OpenGL</span></a>
2461            
2462                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
2463            
2464                <a href="/projects/tagged/hardware/"><span class="label label-default">Hardware</span></a>
2465            
2466        </p>
2467    
2468    <div class="row project-images">
2469        <div class="col col-sm-12">
2470            <p class="lead">Real-time 3D visualization of actual GPS satellite locations.</p>
2471            <div class="project-summary">
2472                <p>This code interfaces with a USB GPS receiver and produces a 3D visualization of GPS satellite positions for all of the satellites that are currently in view.</p>
2473
2474            </div>
2475            
2476                <p><a href="/projects/gps/">Read more...</a></p>
2477            
2478            
2479                <p class="project-links">
2480                    Links:
2481                    
2482                        <a href="https://github.com/fogleman/GPS">GitHub</a>
2483                    
2484                </p>
2485            
2486        </div>
2487        
2488            
2489                
2490                
2491                <div class="col col-sm-4">
2492                    <a href="/static/img/project/gps/1.png?bust=1495842393" class="project-image">
2493                        
2494                            <img src="/static/img/project/gps/placeholder/1.png?bust=1496007718" data-echo="/static/img/project/gps/thumbnail/1.png?bust=1496007718" class="img-responsive center-block">
2495                        
2496                    </a>
2497                </div>
2498                
2499            
2500        
2501            
2502                
2503                
2504                <div class="col col-sm-4 hidden-xs">
2505                    <a href="/static/img/project/gps/2.png?bust=1495842393" class="project-image">
2506                        
2507                            <img src="/static/img/project/gps/placeholder/2.png?bust=1496007719" data-echo="/static/img/project/gps/thumbnail/2.png?bust=1496007719" class="img-responsive center-block">
2508                        
2509                    </a>
2510                </div>
2511            
2512        
2513            
2514                
2515                
2516                <div class="col col-sm-4 hidden-xs">
2517                    <a href="/static/img/project/gps/3.png?bust=1495842393" class="project-image">
2518                        
2519                            <img src="/static/img/project/gps/placeholder/3.png?bust=1496007719" data-echo="/static/img/project/gps/thumbnail/3.png?bust=1496007719" class="img-responsive center-block">
2520                        
2521                    </a>
2522                </div>
2523            
2524        
2525    </div>
2526    
2527</div>
2528
2529    
2530        <hr>
2531    
2532    <a name="hirise"></a>
2533    
2534    
2535
2536
2537
2538
2539
2540    
2541    
2542    
2543    
2544    
2545
2546
2547<div class="project container">
2548    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2549        
2550        
2551    </div>
2552    
2553        <h3><a href="/projects/hirise/">HiRISE</a> <small>August 2014</small></h3>
2554    
2555    
2556        <p class="project-tags">
2557            
2558                <a href="https://github.com/fogleman/HiRISE"><span class="label label-warning"><i class="fa fa-star"></i> 24</span></a>
2559            
2560            
2561                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
2562            
2563                <a href="/projects/tagged/opengl/"><span class="label label-default">OpenGL</span></a>
2564            
2565                <a href="/projects/tagged/3d/"><span class="label label-default">3D</span></a>
2566            
2567        </p>
2568    
2569    <div class="row project-images">
2570        <div class="col col-sm-12">
2571            <p class="lead">Fly through real Martian landscapes using data released by HiRISE.</p>
2572            <div class="project-summary">
2573                <p>This code converts HiRISE DTMs from their PDS format to a 3D mesh in STL format with an accompanying normal map texture for high-resolution lighting. The visualizer was written using <code>pg</code>, my Python OpenGL library.</p>
2574
2575            </div>
2576            
2577                <p><a href="/projects/hirise/">Read more...</a></p>
2578            
2579            
2580                <p class="project-links">
2581                    Links:
2582                    
2583                        <a href="https://github.com/fogleman/HiRISE">GitHub</a>
2584                    
2585                </p>
2586            
2587        </div>
2588        
2589            
2590                
2591                
2592                <div class="col col-sm-4">
2593                    <a href="/static/img/project/hirise/1.png?bust=1495842393" class="project-image">
2594                        
2595                            <img src="/static/img/project/hirise/placeholder/1.png?bust=1496007723" data-echo="/static/img/project/hirise/thumbnail/1.png?bust=1496007723" class="img-responsive center-block">
2596                        
2597                    </a>
2598                </div>
2599                
2600            
2601        
2602            
2603                
2604                
2605                <div class="col col-sm-4 hidden-xs">
2606                    <a href="/static/img/project/hirise/2.png?bust=1495842393" class="project-image">
2607                        
2608                            <img src="/static/img/project/hirise/placeholder/2.png?bust=1496007724" data-echo="/static/img/project/hirise/thumbnail/2.png?bust=1496007724" class="img-responsive center-block">
2609                        
2610                    </a>
2611                </div>
2612            
2613        
2614            
2615                
2616                
2617                <div class="col col-sm-4 hidden-xs">
2618                    <a href="/static/img/project/hirise/3.png?bust=1495842393" class="project-image">
2619                        
2620                            <img src="/static/img/project/hirise/placeholder/3.png?bust=1496007724" data-echo="/static/img/project/hirise/thumbnail/3.png?bust=1496007724" class="img-responsive center-block">
2621                        
2622                    </a>
2623                </div>
2624            
2625        
2626    </div>
2627    
2628</div>
2629
2630    
2631        <hr>
2632    
2633    <a name="tiling"></a>
2634    
2635    
2636
2637
2638
2639
2640
2641    
2642    
2643    
2644    
2645    
2646
2647
2648<div class="project container">
2649    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2650        
2651        
2652    </div>
2653    
2654        <h3><a href="/projects/tiling/">Tiling</a> <small>June 2014</small></h3>
2655    
2656    
2657        <p class="project-tags">
2658            
2659                <a href="https://github.com/fogleman/Tiling"><span class="label label-warning"><i class="fa fa-star"></i> 488</span></a>
2660            
2661            
2662                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
2663            
2664                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
2665            
2666                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
2667            
2668        </p>
2669    
2670    <div class="row project-images">
2671        <div class="col col-sm-12">
2672            <p class="lead">Quickly construct tilings of regular polygons and their dual tilings using a simple API.</p>
2673            <div class="project-summary">
2674                <p>
2674This code provides an interesting API for constructing <a href="https://en.wikipedia.org/wiki/Euclidean_tilings_by_convex_regular_polygons">tilings of regular polygons</a>. It can also render the dual tilings.</p>
2675
2676            </div>
2677            
2678            
2679                <p class="project-links">
2680                    Links:
2681                    
2682                        <a href="https://github.com/fogleman/Tiling">GitHub</a>
2683                    
2684                </p>
2685            
2686        </div>
2687        
2688            
2689                
2690                
2691                <div class="col col-sm-3">
2692                    <a href="/static/img/project/tiling/1.png?bust=1495850350" class="project-image">
2693                        
2694                            <img src="/static/img/project/tiling/placeholder/1.png?bust=1496007708" data-echo="/static/img/project/tiling/thumbnail/1.png?bust=1496007708" class="img-responsive center-block">
2695                        
2696                    </a>
2697                </div>
2698                
2699            
2700        
2701            
2702                
2703                
2704                <div class="col col-sm-3 hidden-xs">
2705                    <a href="/static/img/project/tiling/2.png?bust=1495850350" class="project-image">
2706                        
2707                            <img src="/static/img/project/tiling/placeholder/2.png?bust=1496007708" data-echo="/static/img/project/tiling/thumbnail/2.png?bust=1496007708" class="img-responsive center-block">
2708                        
2709                    </a>
2710                </div>
2711            
2712        
2713            
2714                
2715                
2716                <div class="col col-sm-3 hidden-xs">
2717                    <a href="/static/img/project/tiling/3.png?bust=1495850350" class="project-image">
2718                        
2719                            <img src="/static/img/project/tiling/placeholder/3.png?bust=1496007709" data-echo="/static/img/project/tiling/thumbnail/3.png?bust=1496007709" class="img-responsive center-block">
2720                        
2721                    </a>
2722                </div>
2723            
2724        
2725            
2726                
2727                
2728                <div class="col col-sm-3 hidden-xs">
2729                    <a href="/static/img/project/tiling/4.png?bust=1495850350" class="project-image">
2730                        
2731                            <img src="/static/img/project/tiling/placeholder/4.png?bust=1496007709" data-echo="/static/img/project/tiling/thumbnail/4.png?bust=1496007709" class="img-responsive center-block">
2732                        
2733                    </a>
2734                </div>
2735            
2736        
2737    </div>
2738    
2739</div>
2740
2741    
2742        <hr>
2743    
2744    <a name="fireflies"></a>
2745    
2746    
2747
2748
2749
2750
2751
2752    
2753    
2754    
2755    
2756    
2757
2758
2759<div class="project container">
2760    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2761        
2762        
2763    </div>
2764    
2765        <h3><a href="/projects/fireflies/">Fireflies</a> <small>May 2014</small></h3>
2766    
2767    
2768        <p class="project-tags">
2769            
2770                <a href="https://github.com/fogleman/Fireflies"><span class="label label-warning"><i class="fa fa-star"></i> 10</span></a>
2771            
2772            
2773                <a href="/projects/tagged/javascript/"><span class="label label-default">JavaScript</span></a>
2774            
2775        </p>
2776    
2777    <div class="row project-images">
2778        <div class="col col-sm-8">
2779            <p class="lead">Simulating the behavior of synchronizing fireflies.</p>
2780            <div class="project-summary">
2781                <p>An experiment inspired by the book <a href="https://www.amazon.com/Sync-Order-Emerges-Universe-Nature/dp/0786887214">Sync: How Order Emerges From Chaos In the Universe, Nature, and Daily Life</a> by Steven H. Strogatz.</p>
2782
2783<p>Each cell flashes every few seconds. The cells influence each other in such a way that they will all eventually synchronize, as do some species of fireflies.</p>
2784
2785<p>The cells charge following a logarithmic curve similar to that of a charging capacitor, firing upon reaching a threshold. This affects neighboring cells by a factor proportional to the inverse of their squared distance. The cells need not have identical individual frequencies to reach sychronization.</p>
2786
2787            </div>
2788            
2789            
2790                <p class="project-links">
2791                    Links:
2792                    
2793                        <a href="https://github.com/fogleman/Fireflies">GitHub</a> &bull;
2794                    
2795                        <a href="https://www.michaelfogleman.com/static/fireflies/">Visualization</a>
2796                    
2797                </p>
2798            
2799        </div>
2800        
2801            
2802                
2803                
2804                <div class="col col-sm-4">
2805                    <a href="/static/img/project/fireflies/1.png?bust=1495842393" class="project-image">
2806                        
2807                            <img src="/static/img/project/fireflies/placeholder/1.png?bust=1496007725" data-echo="/static/img/project/fireflies/thumbnail/1.png?bust=1496007725" class="img-responsive center-block">
2808                        
2809                    </a>
2810                </div>
2811                
2812                    <div class="clearfix"></div>
2813                
2814            
2815        
2816    </div>
2817    
2818</div>
2819
2820    
2821        <hr>
2822    
2823    <a name="quads"></a>
2824    
2825    
2826
2827
2828
2829
2830
2831    
2832    
2833    
2834    
2835    
2836
2837
2838<div class="project container">
2839    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2840        
2841        
2842    </div>
2843    
2844        <h3><a href="/projects/quads/">Quads</a> <small>May 2014</small></h3>
2845    
2846    
2847        <p class="project-tags">
2848            
2849                <a href="https://github.com/fogleman/Quads"><span class="label label-warning"><i class="fa fa-star"></i>
2849 1,208</span></a>
2850            
2851            
2852                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
2853            
2854                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
2855            
2856        </p>
2857    
2858    <div class="row project-images">
2859        <div class="col col-sm-12">
2860            <p class="lead">Computer art based on quadtrees.</p>
2861            <div class="project-summary">
2862                <p>The program targets an input image. The input image is split into four quadrants. Each quadrant is assigned an averaged color based on the colors in the input image. The quadrant with the largest error is split into its four children quadrants to refine the image. This process is repeated N times.</p>
2863
2864            </div>
2865            
2866            
2867                <p class="project-links">
2868                    Links:
2869                    
2870                        <a href="https://github.com/fogleman/Quads">GitHub</a> &bull;
2871                    
2872                        <a href="https://www.michaelfogleman.com/static/quads/">Web Version</a>
2873                    
2874                </p>
2875            
2876        </div>
2877        
2878            
2879                
2880                
2881                <div class="col col-sm-4">
2882                    <a href="/static/img/project/quads/1.png?bust=1495842393" class="project-image">
2883                        
2884                            <img src="/static/img/project/quads/placeholder/1.png?bust=1496007707" data-echo="/static/img/project/quads/thumbnail/1.png?bust=1496007707" class="img-responsive center-block">
2885                        
2886                    </a>
2887                </div>
2888                
2889            
2890        
2891            
2892                
2893                
2894                <div class="col col-sm-4 hidden-xs">
2895                    <a href="/static/img/project/quads/2.gif?bust=1495842393" class="project-image">
2896                        
2897                            <img src="/static/img/project/quads/placeholder/2.png?bust=1496007707" data-echo="/static/img/project/quads/2.gif?bust=1495842393" class="img-responsive center-block">
2898                        
2899                    </a>
2900                </div>
2901            
2902        
2903            
2904                
2905                
2906                <div class="col col-sm-4 hidden-xs">
2907                    <a href="/static/img/project/quads/3.png?bust=1495842393" class="project-image">
2908                        
2909                            <img src="/static/img/project/quads/placeholder/3.png?bust=1496007708" data-echo="/static/img/project/quads/thumbnail/3.png?bust=1496007708" class="img-responsive center-block">
2910                        
2911                    </a>
2912                </div>
2913            
2914        
2915    </div>
2916    
2917</div>
2918
2919    
2920        <hr>
2921    
2922    <a name="game-frame"></a>
2923    
2924    
2925
2926
2927
2928
2929
2930    
2931    
2932    
2933    
2934    
2935
2936
2937<div class="project container">
2938    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
2939        
2940        
2941    </div>
2942    
2943        <h3><a href="/projects/game-frame/">Game Frame</a> <small>March 2014</small></h3>
2944    
2945    
2946        <p class="project-tags">
2947            
2948                <a href="https://github.com/fogleman/GameFrame"><span class="label label-warning"><i class="fa fa-star"></i> 19</span></a>
2949            
2950            
2951                <a href="/projects/tagged/objective-c/"><span class="label label-default">Objective-C</span></a>
2952            
2953        </p>
2954    
2955    <div class="row project-images">
2956        <div class="col col-sm-8">
2957            <p class="lead">Simulates the appearance of the Game Frame while you are busy pixel editing.</p>
2958            <div class="project-summary">
2959                <p>I backed the <a href="https://www.kickstarter.com/projects/jerware/game-frame-the-art-of-pixels">Game Frame</a> Kickstarter project. While waiting for it to ship, I wrote this macOS app that displays pixel art in a simulated view so you can see it as it will appear on the real hardware. It supports both static images and looped animations.</p>
2960
2961            </div>
2962            
2963            
2964                <p class="project-links">
2965                    Links:
2966                    
2967                        <a href="https://github.com/fogleman/GameFrame">GitHub</a>
2968                    
2969                </p>
2970            
2971        </div>
2972        
2973            
2974                
2975                
2976                <div class="col col-sm-4">
2977                    <a href="/static/img/project/game-frame/1.png?bust=1495842393" class="project-image">
2978                        
2979                            <img src="/static/img/project/game-frame/placeholder/1.png?bust=1496007722" data-echo="/static/img/project/game-frame/thumbn
2979ail/1.png?bust=1496007722" class="img-responsive center-block">
2980                        
2981                    </a>
2982                </div>
2983                
2984                    <div class="clearfix"></div>
2985                
2986            
2987        
2988    </div>
2989    
2990</div>
2991
2992    
2993        <hr>
2994    
2995    <a name="allrgb"></a>
2996    
2997    
2998
2999
3000
3001
3002
3003    
3004    
3005    
3006    
3007    
3008
3009
3010<div class="project container">
3011    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3012        
3013        
3014    </div>
3015    
3016        <h3><a href="/projects/allrgb/">AllRGB</a> <small>March 2014</small></h3>
3017    
3018    
3019        <p class="project-tags">
3020            
3021                <a href="https://github.com/fogleman/AllRGB"><span class="label label-warning"><i class="fa fa-star"></i> 60</span></a>
3022            
3023            
3024                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
3025            
3026                <a href="/projects/tagged/c/"><span class="label label-default">C</span></a>
3027            
3028                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
3029            
3030                <a href="/projects/tagged/graphics/"><span class="label label-default">Graphics</span></a>
3031            
3032        </p>
3033    
3034    <div class="row project-images">
3035        <div class="col col-sm-8">
3036            <p class="lead">Generate images that use all 16,777,216 RGB colors exactly once.</p>
3037            <div class="project-summary">
3038                <p>Efficiently create AllRGB images that target an input image. The input must be 4096x4096px. The output will also be 4096x4096px and will contain all 16,777,216 distinct RGB values once and only once.</p>
3039
3040<p>See <a href="http://allrgb.com/">allrgb.com</a> for details on the concept.</p>
3041
3042            </div>
3043            
3044                <p><a href="/projects/allrgb/">Read more...</a></p>
3045            
3046            
3047                <p class="project-links">
3048                    Links:
3049                    
3050                        <a href="https://github.com/fogleman/AllRGB">GitHub</a>
3051                    
3052                </p>
3053            
3054        </div>
3055        
3056            
3057                
3058                
3059                <div class="col col-sm-4">
3060                    <a href="/static/img/project/allrgb/1.jpg?bust=1516799819" class="project-image">
3061                        
3062                            <img src="/static/img/project/allrgb/placeholder/1.png?bust=1496007721" data-echo="/static/img/project/allrgb/thumbnail/1.jpg?bust=1496007721" class="img-responsive center-block">
3063                        
3064                    </a>
3065                </div>
3066                
3067                    <div class="clearfix"></div>
3068                
3069            
3070        
3071    </div>
3072    
3073</div>
3074
3075    
3076        <hr>
3077    
3078    <a name="scale"></a>
3079    
3080    
3081
3082
3083
3084
3085
3086    
3087    
3088    
3089    
3090    
3091
3092
3093<div class="project container">
3094    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3095        
3096        
3097    </div>
3098    
3099        <h3><a href="/projects/scale/">Scale</a> <small>March 2014</small></h3>
3100    
3101    
3102        <p class="project-tags">
3103            
3104                <a href="https://github.com/fogleman/Scale"><span class="label label-warning"><i class="fa fa-star"></i> 39</span></a>
3105            
3106            
3107                <a href="/projects/tagged/objective-c/"><span class="label label-default">Objective-C</span></a>
3108            
3109                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
3110            
3111        </p>
3112    
3113    <div class="row project-images">
3114        <div class="col col-sm-6">
3115            <p class="lead">Beautiful fractals for macOS.</p>
3116            <div class="project-summary">
3117                <p>Explore the mathematical beauty of fractals and create stunning fractal art with Scale. Scale is fast and a pleasure to use. It was designed from the ground up to be intuitive and user-friendly.</p>
3118
3119            </div>
3120            
3121            
3122                <p class="project-links">
3123                    Links:
3124                    
3125                        <a href="https://github.com/fogleman/Scale">GitHub</a> &bull;
3126                    
3127                        <a href="https://itunes.apple.com/us/app/scale-beautiful-fractals/id610187081?mt=12">App Store</a>
3128                    
3129                </p>
3130            
3131        </div>
3132        
3133            
3134                
3135                
3136                <div class="col col-sm-6">
3137                    <a href="/static/img/project/scale/0.png?bust=1495842393" class="project-image">
3138                        
3139                            <img src="/static/img/project/scale/placeholder/0.png?bust=1496007721" data-echo="/static/img/project/scale/thumbn
3139ail/0.png?bust=1496007721" class="img-responsive center-block">
3140                        
3141                    </a>
3142                </div>
3143                
3144                    <div class="clearfix"></div>
3145                
3146            
3147        
3148            
3149                
3150                
3151                <div class="col col-sm-3 hidden-xs">
3152                    <a href="/static/img/project/scale/1.jpg?bust=1516799819" class="project-image">
3153                        
3154                            <img src="/static/img/project/scale/placeholder/1.png?bust=1496007721" data-echo="/static/img/project/scale/thumbnail/1.jpg?bust=1496007721" class="img-responsive center-block">
3155                        
3156                    </a>
3157                </div>
3158            
3159        
3160            
3161                
3162                
3163                <div class="col col-sm-3 hidden-xs">
3164                    <a href="/static/img/project/scale/2.jpg?bust=1516799819" class="project-image">
3165                        
3166                            <img src="/static/img/project/scale/placeholder/2.png?bust=1496007721" data-echo="/static/img/project/scale/thumbnail/2.jpg?bust=1496007721" class="img-responsive center-block">
3167                        
3168                    </a>
3169                </div>
3170            
3171        
3172            
3173                
3174                
3175                <div class="col col-sm-3 hidden-xs">
3176                    <a href="/static/img/project/scale/3.jpg?bust=1516799819" class="project-image">
3177                        
3178                            <img src="/static/img/project/scale/placeholder/3.png?bust=1496007721" data-echo="/static/img/project/scale/thumbnail/3.jpg?bust=1496007721" class="img-responsive center-block">
3179                        
3180                    </a>
3181                </div>
3182            
3183        
3184            
3185                
3186                
3187                <div class="col col-sm-3 hidden-xs">
3188                    <a href="/static/img/project/scale/4.jpg?bust=1516799819" class="project-image">
3189                        
3190                            <img src="/static/img/project/scale/placeholder/4.png?bust=1496007721" data-echo="/static/img/project/scale/thumbnail/4.jpg?bust=1496007721" class="img-responsive center-block">
3191                        
3192                    </a>
3193                </div>
3194            
3195        
3196    </div>
3197    
3198</div>
3199
3200    
3201        <hr>
3202    
3203    <a name="graph-layout"></a>
3204    
3205    
3206
3207
3208
3209
3210
3211    
3212    
3213    
3214    
3215    
3216
3217
3218<div class="project container">
3219    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3220        
3221        
3222    </div>
3223    
3224        <h3><a href="/projects/graph-layout/">Graph Layout</a> <small>February 2014</small></h3>
3225    
3226    
3227        <p class="project-tags">
3228            
3229                <a href="https://github.com/fogleman/GraphLayout"><span class="label label-warning"><i class="fa fa-star"></i> 118</span></a>
3230            
3231            
3232                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
3233            
3234                <a href="/projects/tagged/c/"><span class="label label-default">C</span></a>
3235            
3236                <a href="/projects/tagged/graphs/"><span class="label label-default">Graphs</span></a>
3237            
3238                <a href="/projects/tagged/optimization/"><span class="label label-default">Optimization</span></a>
3239            
3240        </p>
3241    
3242    <div class="row project-images">
3243        <div class="col col-sm-8">
3244            <p class="lead">Experimenting with graph visualization using simulated annealing for layout.</p>
3245            <div class="project-summary">
3246                <p>Graphviz is the main player when it comes to graph visualization. But its output isn&#39;t very appealing, at least not by default. With this in mind, and being a fan of simulated annealing, I experimented with using annealing for graph layout. The results are pretty good, but it probably doesn&#39;t scale very well. The algorithm basically tries to minimize the following metrics, with different weights applied to each:</p>
3247
3248<ul>
3249<li>Node-Node Intersections</li>
3250<li>
3250Node-Edge Intersections</li>
3251<li>Edge-Edge Intersections</li>
3252<li>Edge Lengths</li>
3253<li>Total Graph Area</li>
3254<li>Node Rank Violations</li>
3255</ul>
3256
3257            </div>
3258            
3259            
3260                <p class="project-links">
3261                    Links:
3262                    
3263                        <a href="https://github.com/fogleman/GraphLayout">GitHub</a>
3264                    
3265                </p>
3266            
3267        </div>
3268        
3269            
3270                
3271                
3272                <div class="col col-sm-4">
3273                    <a href="/static/img/project/graph-layout/1.png?bust=1495842393" class="project-image">
3274                        
3275                            <img src="/static/img/project/graph-layout/placeholder/1.png?bust=1496007716" data-echo="/static/img/project/graph-layout/thumbnail/1.png?bust=1496007716" class="img-responsive center-block">
3276                        
3277                    </a>
3278                </div>
3279                
3280                    <div class="clearfix"></div>
3281                
3282            
3283        
3284    </div>
3285    
3286</div>
3287
3288    
3289        <hr>
3290    
3291    <a name="piet"></a>
3292    
3293    
3294
3295
3296
3297
3298
3299    
3300    
3301    
3302    
3303    
3304
3305
3306<div class="project container">
3307    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3308        
3309        
3310    </div>
3311    
3312        <h3><a href="/projects/piet/">Piet</a> <small>September 2013</small></h3>
3313    
3314    
3315        <p class="project-tags">
3316            
3317                <a href="https://github.com/fogleman/Piet"><span class="label label-warning"><i class="fa fa-star"></i> 99</span></a>
3318            
3319            
3320                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
3321            
3322                <a href="/projects/tagged/2d/"><span class="label label-default">2D</span></a>
3323            
3324        </p>
3325    
3326    <div class="row project-images">
3327        <div class="col col-sm-12">
3328            <p class="lead">Procedurally generating Images in the style of Piet Mondrian.</p>
3329            <div class="project-summary">
3330                <p>Piet Mondrian was a Dutch painter. His paintings with orthogonal lines and rectangular splashes of primary colors on white backgrounds are very recognizable. I wondered what it would take to programmatically generate Mondrian-esque images. Here&#39;s what I came up with.</p>
3331
3332            </div>
3333            
3334            
3335                <p class="project-links">
3336                    Links:
3337                    
3338                        <a href="https://github.com/fogleman/Piet">GitHub</a>
3339                    
3340                </p>
3341            
3342        </div>
3343        
3344            
3345                
3346                
3347                <div class="col col-sm-4">
3348                    <a href="/static/img/project/piet/1.png?bust=1496018337" class="project-image">
3349                        
3350                            <img src="/static/img/project/piet/placeholder/1.png?bust=1496018418" data-echo="/static/img/project/piet/thumbnail/1.png?bust=1496018418" class="img-responsive center-block">
3351                        
3352                    </a>
3353                </div>
3354                
3355            
3356        
3357            
3358                
3359                
3360                <div class="col col-sm-4 hidden-xs">
3361                    <a href="/static/img/project/piet/2.png?bust=1496018337" class="project-image">
3362                        
3363                            <img src="/static/img/project/piet/placeholder/2.png?bust=1496018418" data-echo="/static/img/project/piet/thumbnail/2.png?bust=1496018418" class="img-responsive center-block">
3364                        
3365                    </a>
3366                </div>
3367            
3368        
3369            
3370                
3371                
3372                <div class="col col-sm-4 hidden-xs">
3373                    <a href="/static/img/project/piet/3.png?bust=1496018337" class="project-image">
3374                        
3375                            <img src="/static/img/project/piet/placeholder/3.png?bust=1496018419" data-echo="/static/img/project/piet/thumbnail/3.png?bust=1496018419" class="img-responsive center-block">
3376                        
3377                    </a>
3378                </div>
3379            
3380        
3381    </div>
3382    
3383</div>
3384
3385    
3386        <hr>
3387    
3388    <a name="craft"></a>
3389    
3390    
3391
3392
3393
3394
3395
3396    
3397    
3398    
3399    
3400    
3401
3402
3403<div class="project container">
3404    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3405        
3406        
3407    </div>
3408    
3409        <h3><a href="/projects/craft/">
3409Craft</a> <small>April 2013</small></h3>
3410    
3411    
3412        <p class="project-tags">
3413            
3414                <a href="https://github.com/fogleman/Craft"><span class="label label-warning"><i class="fa fa-star"></i> 10,838</span></a>
3415            
3416            
3417                <a href="/projects/tagged/c/"><span class="label label-default">C</span></a>
3418            
3419                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
3420            
3421                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
3422            
3423                <a href="/projects/tagged/opengl/"><span class="label label-default">OpenGL</span></a>
3424            
3425        </p>
3426    
3427    <div class="row project-images">
3428        <div class="col col-sm-12">
3429            <p class="lead">Minecraft clone for Windows, Mac and Linux.</p>
3430            <div class="project-summary">
3431                <p>A very performant Minecraft clone written in just a few thousand lines of C using modern OpenGL (shaders). Online multiplayer support is included using a Python-based server. Many people have used this as a base upon which a more complex game was built.</p>
3432
3433<h4>Download</h4>
3434
3435<ul>
3436<li><a href="https://www.michaelfogleman.com/static/Craft.zip">Windows Download (2.2 MB)</a></li>
3437<li><a href="https://www.michaelfogleman.com/static/Craft.app.zip">Mac Download (733 KB)</a></li>
3438</ul>
3439
3440            </div>
3441            
3442                <p><a href="/projects/craft/">Read more...</a></p>
3443            
3444            
3445                <p class="project-links">
3446                    Links:
3447                    
3448                        <a href="https://github.com/fogleman/Craft">GitHub</a> &bull;
3449                    
3450                        <a href="https://www.michaelfogleman.com/static/Craft.zip">Windows</a> &bull;
3451                    
3452                        <a href="https://www.michaelfogleman.com/static/Craft.app.zip">Mac</a>
3453                    
3454                </p>
3455            
3456        </div>
3457        
3458            
3459                
3460                
3461                <div class="col col-sm-4">
3462                    <a href="/static/img/project/craft/1.png?bust=1495842393" class="project-image">
3463                        
3464                            <img src="/static/img/project/craft/placeholder/1.png?bust=1496007698" data-echo="/static/img/project/craft/thumbnail/1.png?bust=1496007698" class="img-responsive center-block">
3465                        
3466                    </a>
3467                </div>
3468                
3469            
3470        
3471            
3472                
3473                
3474                <div class="col col-sm-4 hidden-xs">
3475                    <a href="/static/img/project/craft/2.png?bust=1495842393" class="project-image">
3476                        
3477                            <img src="/static/img/project/craft/placeholder/2.png?bust=1496007699" data-echo="/static/img/project/craft/thumbnail/2.png?bust=1496007699" class="img-responsive center-block">
3478                        
3479                    </a>
3480                </div>
3481            
3482        
3483            
3484                
3485                
3486                <div class="col col-sm-4 hidden-xs">
3487                    <a href="/static/img/project/craft/3.png?bust=1495842393" class="project-image">
3488                        
3489                            <img src="/static/img/project/craft/placeholder/3.png?bust=1496007700" data-echo="/static/img/project/craft/thumbnail/3.png?bust=1496007700" class="img-responsive center-block">
3490                        
3491                    </a>
3492                </div>
3493            
3494        
3495    </div>
3496    
3497</div>
3498
3499    
3500        <hr>
3501    
3502    <a name="phrases"></a>
3503    
3504    
3505
3506
3507
3508
3509
3510    
3511    
3512    
3513    
3514    
3515
3516
3517<div class="project container">
3518    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3519        
3520        
3521    </div>
3522    
3523        <h3><a href="/projects/phrases/">Random Phrases</a> <small>December 2012</small></h3>
3524    
3525    
3526        <p class="project-tags">
3527            
3528                <a href="https://github.com/fogleman/Phrases"><span class="label label-warning"><i class="fa fa-star"></i> 21</span></a>
3529            
3530            
3531                <a href="/projects/tagged/javascript/"><span class="label label-default">JavaScript</span></a>
3532            
3533                <a href="/projects/tagged/words/"><span class="label label-default">Words</span></a>
3534            
3535        </p>
3536    
3537    <div class="row project-images">
3538        <div class="col col-sm-12">
3539            <p class="lead">Useful for creative thinking, code names, password phrases, band names, etc.</p>
3540            <div class="project-summary">
3541                <p>
3541This simple app uses lists of nouns, verbs, adjectives, and &quot;mnemonics&quot; to generate random two-word phrases.</p>
3542
3543            </div>
3544            
3545            
3546                <p class="project-links">
3547                    Links:
3548                    
3549                        <a href="https://github.com/fogleman/Phrases">GitHub</a> &bull;
3550                    
3551                        <a href="/phrases">Random Phrases</a>
3552                    
3553                </p>
3554            
3555        </div>
3556        
3557    </div>
3558    
3559</div>
3560
3561    
3562        <hr>
3563    
3564    <a name="dcpu-16"></a>
3565    
3566    
3567
3568
3569
3570
3571
3572    
3573    
3574    
3575    
3576    
3577
3578
3579<div class="project container">
3580    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3581        
3582        
3583    </div>
3584    
3585        <h3><a href="/projects/dcpu-16/">DCPU-16</a> <small>April 2012</small></h3>
3586    
3587    
3588        <p class="project-tags">
3589            
3590                <a href="https://github.com/fogleman/DCPU-16"><span class="label label-warning"><i class="fa fa-star"></i> 71</span></a>
3591            
3592            
3593                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
3594            
3595                <a href="/projects/tagged/c/"><span class="label label-default">C</span></a>
3596            
3597                <a href="/projects/tagged/emulator/"><span class="label label-default">Emulator</span></a>
3598            
3599        </p>
3600    
3601    <div class="row project-images">
3602        <div class="col col-sm-12">
3603            <p class="lead">An assembler, disassembler and emulator for the virtual DCPU-16 written in Python and C.</p>
3604            <div class="project-summary">
3605                <p>The DCPU-16 was intended to form the basis of a video game by Mojang called 0x10c. Work on the game has since discontinued, but at the time there was a lot of excitement around this virtual hardware.</p>
3606
3607<h4>Implemented Specifications</h4>
3608
3609<ul>
3610<li>DCPU-16 1.7</li>
3611<li>LEM1802</li>
3612<li>Generic Keyboard</li>
3613<li>Generic Clock</li>
3614</ul>
3615
3616            </div>
3617            
3618            
3619                <p class="project-links">
3620                    Links:
3621                    
3622                        <a href="https://github.com/fogleman/DCPU-16">GitHub</a>
3623                    
3624                </p>
3625            
3626        </div>
3627        
3628            
3629                
3630                
3631                <div class="col col-sm-4">
3632                    <a href="/static/img/project/dcpu-16/1.png?bust=1496019479" class="project-image">
3633                        
3634                            <img src="/static/img/project/dcpu-16/placeholder/1.png?bust=1496007718" data-echo="/static/img/project/dcpu-16/thumbnail/1.png?bust=1496019482" class="img-responsive center-block">
3635                        
3636                    </a>
3637                </div>
3638                
3639            
3640        
3641            
3642                
3643                
3644                <div class="col col-sm-4 hidden-xs">
3645                    <a href="/static/img/project/dcpu-16/2.png?bust=1496019479" class="project-image">
3646                        
3647                            <img src="/static/img/project/dcpu-16/placeholder/2.png?bust=1496019482" data-echo="/static/img/project/dcpu-16/thumbnail/2.png?bust=1496019482" class="img-responsive center-block">
3648                        
3649                    </a>
3650                </div>
3651            
3652        
3653            
3654                
3655                
3656                <div class="col col-sm-4 hidden-xs">
3657                    <a href="/static/img/project/dcpu-16/3.png?bust=1496019479" class="project-image">
3658                        
3659                            <img src="/static/img/project/dcpu-16/placeholder/3.png?bust=1496019483" data-echo="/static/img/project/dcpu-16/thumbnail/3.png?bust=1496019483" class="img-responsive center-block">
3660                        
3661                    </a>
3662                </div>
3663            
3664        
3665    </div>
3666    
3667</div>
3668
3669    
3670        <hr>
3671    
3672    <a name="imeme"></a>
3673    
3674    
3675
3676
3677
3678
3679
3680    
3681    
3682    
3683    
3684    
3685
3686
3687<div class="project container">
3688    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3689        
3690        
3691    </div>
3692    
3693        <h3><a href="/projects/imeme/">iMeme</a> <small>February 2012</small></h3>
3694    
3695    
3696        <p class="project-tags">
3697            
3698                <a href="https://github.com/fogleman/iMeme"><span class="label label-warning"><i class="fa fa-star"></i> 72</span></a>
3699            
3700            
3701                <a href="/projects/tagged/objective-c/"><span class="label label-default">Objective-C</span></a>
3702            
3703                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
3704            
3705        </p>
3706    
3707    <div class="row project-images">
3708        <div class="col col-sm-7">
3709            <p class="lead">Meme generator for Windows and Mac that lets you quickly add captions to popular internet memes.</p>
3710            <div class="project-summary">
3711                <h4>Download</h4>
3712
3713<ul>
3714<li><a href="https://www.michaelfogleman.com/static/iMeme-setup.exe">Windows Download (11.2 MB)</a></li>
3715<li><a href="https://www.michaelfogleman.com/static/iMeme.app.zip">Mac Download (5.6 MB)</a></li>
3716</ul>
3717
3718<h4>Features</h4>
3719
3720<ul>
3721<li>Over 100 built-in templates.</li>
3722<li>Enter your own header and footer text.</li>
3723<li>Adjustable text size and alignment.</li>
3724<li>Use your own images.</li>
3725<li>Save as PNG or copy to the clipboard.</li>
3726<li>Print directly from the app.</li>
3727<li>Automatically upload to imgur.</li>
3728<li>Automatically post to reddit.</li>
3729</ul>
3730
3731            </div>
3732            
3733            
3734                <p class="project-links">
3735                    Links:
3736                    
3737                        <a href="https://github.com/fogleman/iMeme">GitHub</a> &bull;
3738                    
3739                        <a href="https://www.michaelfogleman.com/static/iMeme-setup.exe">Windows</a> &bull;
3740                    
3741                        <a href="https://www.michaelfogleman.com/static/iMeme.app.zip">Mac</a>
3742                    
3743                </p>
3744            
3745        </div>
3746        
3747            
3748                
3749                
3750                <div class="col col-sm-5">
3751                    <a href="/static/img/project/imeme/1.png?bust=1495842393" class="project-image">
3752                        
3753                            <img src="/static/img/project/imeme/placeholder/1.png?bust=1496007715" data-echo="/static/img/project/imeme/thumbn
3753ail/1.png?bust=1496007715" class="img-responsive center-block">
3754                        
3755                    </a>
3756                </div>
3757                
3758                    <div class="clearfix"></div>
3759                
3760            
3761        
3762    </div>
3763    
3764</div>
3765
3766    
3767        <hr>
3768    
3769    <a name="ricochet-robot"></a>
3770    
3771    
3772
3773
3774
3775
3776
3777    
3778    
3779    
3780    
3781    
3782
3783
3784<div class="project container">
3785    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3786        
3787        
3788    </div>
3789    
3790        <h3><a href="/projects/ricochet-robot/">Ricochet Robot</a> <small>February 2012</small></h3>
3791    
3792    
3793        <p class="project-tags">
3794            
3795                <a href="https://github.com/fogleman/Ricochet"><span class="label label-warning"><i class="fa fa-star"></i> 55</span></a>
3796            
3797            
3798                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
3799            
3800                <a href="/projects/tagged/c/"><span class="label label-default">C</span></a>
3801            
3802                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
3803            
3804                <a href="/projects/tagged/ai/"><span class="label label-default">AI</span></a>
3805            
3806        </p>
3807    
3808    <div class="row project-images">
3809        <div class="col col-sm-8">
3810            <p class="lead">Implementation of a board game called Ricochet Robot including a GUI and a very fast solver.</p>
3811            <div class="project-summary">
3812                <p>My friend introduced me to a board game called <a href="https://en.wikipedia.org/wiki/Ricochet_Robot">Ricochet Robot</a> (or Rasende Roboter in its original German form). It&#39;s a fun game, but I found it even more fun as a programming problem. I implemented the game in Python, including a user interface and a solver. After that, I sped up the solver tremendously by porting it to C. My solver includes several &quot;tricks&quot; that make it quite fast. See these <a href="https://speakerdeck.com/fogleman/ricochet-robots-solver-algorithms">slides</a> for more details.</p>
3813
3814            </div>
3815            
3816            
3817                <p class="project-links">
3818                    Links:
3819                    
3820                        <a href="https://github.com/fogleman/Ricochet">GitHub</a> &bull;
3821                    
3822                        <a href="https://speakerdeck.com/fogleman/ricochet-robots-solver-algorithms">Slides</a>
3823                    
3824                </p>
3825            
3826        </div>
3827        
3828            
3829                
3830                
3831                <div class="col col-sm-4">
3832                    <a href="/static/img/project/ricochet-robot/1.png?bust=1495842393" class="project-image">
3833                        
3834                            <img src="/static/img/project/ricochet-robot/placeholder/1.png?bust=1496007719" data-echo="/static/img/project/ricochet-robot/thumbnail/1.png?bust=1496007719" class="img-responsive center-block">
3835                        
3836                    </a>
3837                </div>
3838                
3839                    <div class="clearfix"></div>
3840                
3841            
3842        
3843    </div>
3844    
3845</div>
3846
3847    
3848        <hr>
3849    
3850    <a name="star-rocket"></a>
3851    
3852    
3853
3854
3855
3856
3857
3858    
3859    
3860    
3861    
3862    
3863
3864
3865<div class="project container">
3866    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
3867        
3868        
3869    </div>
3870    
3871        <h3><a href="/projects/star-rocket/">Star Rocket</a> <small>February 2011</small></h3>
3872    
3873    
3874        <p class="project-tags">
3875            
3876                <a href="https://github.com/fogleman/StarRocket"><span class="label label-warning"><i class="fa fa-star"></i> 6</span></a>
3877            
3878            
3879                <a href="/projects/tagged/objective-c/"><span class="label label-default">Objective-C</span></a>
3880            
3881                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
3882            
3883                <a href="/projects/tagged/ios/"><span class="label label-default">iOS</span></a>
3884            
3885        </p>
3886    
3887    <div class="row project-images">
3888        <div class="col col-sm-12">
3889            <p class="lead">A cartoon-themed space game with over 120 action-packed levels!</p>
3890            <div class="project-summary">
3891                <p>Navigate your rocket through a universe filled with planets, asteroids, bumpers, teleports and items... collecting all of the stars as you go!</p>
3892
3893<h4>Objectives</h4>
3894
3895<ul>
3896<li>Collect all of the stars in each level.</li>
3897<li>Complete each level as quickly as possible. You will be rewarded 1, 2 or 3 stars for each level, depending on your time.</li>
3898</ul>
3899
3900<h4>Details</h4>
3901
3902<ul>
3903<li>Planets exert gravity on your rocket - don&#39;t get too close or you won&#39;t be able to escape the pull of the gravity!</li>
3904<li>Magnets let you attract and collect stars from a greater distance!</li>
3905<li>Shields let you plow through and destroy asteroids!</li>
3906<li>Flames give you an instant boost in the direction you are pointing.</li>
3907<li>Your rocket will bounce off of bumpers. Try it - it&#39;s fun (but not always helpful)!</li>
3908<li>Teleports instantly transport you to another teleport location.</li>
3909</ul>
3910
3911            </div>
3912            
3913                <p><a href="/projects/star-rocket/">Read more...</a></p>
3914            
3915            
3916                <p class="project-links">
3917                    Links:
3918                    
3919                        <a href="https://github.com/fogleman/StarRocket">GitHub</a> &bull;
3920                    
3921                        <a href="https://itunes.apple.com/us/app/star-rocket/id419027792?mt=8">App Store</a>
3922                    
3923                </p>
3924            
3925        </div>
3926        
3927            
3928                
3929                
3930                <div class="col col-sm-3">
3931                    <a href="/static/img/project/star-rocket/1.png?bust=1495842393" class="project-image">
3932                        
3933                            <img src="/static/img/project/star-rocket/placeholder/1.png?bust=1496007726" data-echo="/static/img/project/star-rocket/thumbnail/1.png?bust=1496007726" class="img-responsive center-block">
3934                        
3935                    </a>
3936                </div>
3937                
3938            
3939        
3940            
3941                
3942                
3943                <div class="col col-sm-3 hidden-xs">
3944                    <a href="/static/img/project/star-rocket/2.png?bust=1495842393" class="project-image">
3945                        
3946                            <img src="/static/img/project/star-rocket/placeholder/2.png?bust=1496007726" data-echo="/static/img/project/star-rocket/thumbnail/2.png?bust=1496007726" class="img-responsive center-block">
3947                        
3948                    </a>
3949                </div>
3950            
3951        
3952            
3953                
3954                
3955                <div class="col col-sm-3 hidden-xs">
3956                    <a href="/static/img/project/star-rocket/3.png?bust=1495842393" class="project-image">
3957                        
3958                            <img src="/static/img/project/star-rocket/placeholder/3.png?bust=1496007727" data-echo="/static/img/project/star-rocket/thumbnail/3.png?bust=1496007727" class="img-responsive center-block">
3959                        
3960                    </a>
3961                </div>
3962            
3963        
3964            
3965                
3966                
3967                <div class="col col-sm-3 hidden-xs">
3968                    <a href="/static/img/project/star-rocket/4.png?bust=1495842393" class="project-image">
3969                        
3970                            <img src="/static/img/project/star-rocket/placeholder/4.png?bust=1496007727" data-echo="/static/img/project/star-rocket/thumbnail/4.png?bust=1496007727" class="img-responsive center-block">
3971                        
3972                    </a>
3973                </div>
3974            
3975        
3976    </div>
3977    
3978</div>
3979
3980    
3981        <hr>
3982    
3983    <a name="feed-notifier"></a>
3984    
3985    
3986
3987
3988
3989
3990
3991    
3992    
3993    
3994    
3995    
3996
3997
3998<div class="project container">
3999    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
4000        
4001        
4002    </div>
4003    
4004        <h3><a href="/projects/feed-notifier/">Feed Notifier</a> <small>January 2010</small></h3>
4005    
4006    
4007        <p class="project-tags">
4008            
4009                <a href="https://github.com/fogleman/FeedNotifier"><span class="label label-warning"><i class="fa fa-star"></i> 165</span></a>
4010            
4011            
4012                <a href="/projects/tagged/python/"><span class="label label-default">Python</span></a>
4013            
4014                <a href="/projects/tagged/objective-c/"><span class="label label-default">Objective-C</span></a>
4015            
4016                <a href="/projects/tagged/rss/"><span class="label label-default">RSS</span></a>
4017            
4018        </p>
4019    
4020    <div class="row project-images">
4021        <div class="col col-sm-12">
4022            <p class="lead"> Real-time popup notifications for RSS and Atom Feeds on Windows and macOS.</p>
4023            <div class="project-summary">
4024                <p>Feed Notifier is an application for Windows and macOS that resides in the system tray or menu bar and displays pop-up notifications on your desktop when new items arrive in your subscribed RSS or Atom feeds.<
4024/p>
4025
4026<p>Feed Notifier is for you if you want a news aggregator that focuses on real-time feed notifications and leaves out all the other stuff that comes with most news readers.</p>
4027
4028            </div>
4029            
4030                <p><a href="/projects/feed-notifier/">Read more...</a></p>
4031            
4032            
4033                <p class="project-links">
4034                    Links:
4035                    
4036                        <a href="https://github.com/fogleman/FeedNotifier">GitHub</a> &bull;
4037                    
4038                        <a href="https://itunes.apple.com/us/app/feed-notifier/id571150542?mt=12">App Store</a>
4039                    
4040                </p>
4041            
4042        </div>
4043        
4044    </div>
4045    
4046</div>
4047
4048    
4049        <hr>
4050    
4051    <a name="word-warrior"></a>
4052    
4053    
4054
4055
4056
4057
4058
4059    
4060    
4061    
4062    
4063    
4064
4065
4066<div class="project container">
4067    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
4068        
4069        
4070    </div>
4071    
4072        <h3><a href="/projects/word-warrior/">Word Warrior</a> <small>April 2006</small></h3>
4073    
4074    
4075        <p class="project-tags">
4076            
4077                <a href="https://github.com/fogleman/WordWarrior"><span class="label label-warning"><i class="fa fa-star"></i> 3</span></a>
4078            
4079            
4080                <a href="/projects/tagged/java/"><span class="label label-default">Java</span></a>
4081            
4082                <a href="/projects/tagged/words/"><span class="label label-default">Words</span></a>
4083            
4084                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
4085            
4086                <a href="/projects/tagged/ai/"><span class="label label-default">AI</span></a>
4087            
4088        </p>
4089    
4090    <div class="row project-images">
4091        <div class="col col-sm-8">
4092            <p class="lead">An alternative client for the Internet Scrabble Club.</p>
4093            <div class="project-summary">
4094                <p>In the mid 2000s, I often played Scrabble on the Internet Scrabble Club, which was not an official Scrabble website. Thousands of people played online there, but the client was horrible and buggy. I took it upon myself to write my own client, which involved reverse engineering the protocol to communicate with the server. I discovered many security issues (cheating vectors) while doing this. But I just wanted a nice client for playing Scrabble online. I pretty much finished the client, and it worked quite nicely, but it never went much further than that and who knows if it still works.</p>
4095
4096            </div>
4097            
4098            
4099                <p class="project-links">
4100                    Links:
4101                    
4102                        <a href="https://github.com/fogleman/WordWarrior">GitHub</a>
4103                    
4104                </p>
4105            
4106        </div>
4107        
4108            
4109                
4110                
4111                <div class="col col-sm-4">
4112                    <a href="/static/img/project/word-warrior/1.png?bust=1496109861" class="project-image">
4113                        
4114                            <img src="/static/img/project/word-warrior/placeholder/1.png?bust=1496109864" data-echo="/static/img/project/word-warrior/thumbnail/1.png?bust=1496109863" class="img-responsive center-block">
4115                        
4116                    </a>
4117                </div>
4118                
4119                    <div class="clearfix"></div>
4120                
4121            
4122        
4123    </div>
4124    
4125</div>
4126
4127    
4128        <hr>
4129    
4130    <a name="pac-man"></a>
4131    
4132    
4133
4134
4135
4136
4137
4138    
4139    
4140    
4141    
4142    
4143
4144
4145<div class="project container">
4146    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
4147        
4148        
4149    </div>
4150    
4151        <h3><a href="/projects/pac-man/">Pac-Man</a> <small>January 2005</small></h3>
4152    
4153    
4154        <p class="project-tags">
4155            
4156                <a href="https://github.com/fogleman/SwtPacMan"><span class="label label-warning"><i class="fa fa-star"></i> 20</span></a>
4157            
4158            
4159                <a href="/projects/tagged/java/"><span class="label label-default">Java</span></a>
4160            
4161                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
4162            
4163        </p>
4164    
4165    <div class="row project-images">
4166        <div class="col col-sm-8">
4167            <p class="lead">Simple Pac-Man clone written in Java.</p>
4168            <div class="project-summary">
4169                <p>I remember that I had a cold when I started writing this Pac-Man clone. One cool aspect of it was that levels were defined in ASCII, with different symbols representing walls, dots, pills, etc. I used SWT for the GUI. Unfortunately, I never got around to implementing the fruits that would appear in the real game.</p>
4170
4171            </div>
4172            
4173            
4174                <p class="project-links">
4175                    Links:
4176                    
4177                        <a href="https://github.com/fogleman/SwtPacMan">GitHub</a>
4178                    
4179                </p>
4180            
4181        </div>
4182        
4183            
4184                
4185                
4186                <div class="col col-sm-4">
4187                    <a href="/static/img/project/pac-man/1.png?bust=1496109861" class="project-image">
4188                        
4189                            <img src="/static/img/project/pac-man/placeholder/1.png?bust=1496109863" data-echo="/static/img/project/pac-man/thumbnail/1.png?bust=1496109863" class="img-responsive center-block">
4190                        
4191                    </a>
4192                </div>
4193                
4194                    <div class="clearfix"></div>
4195                
4196            
4197        
4198    </div>
4199    
4200</div>
4201
4202    
4203        <hr>
4204    
4205    <a name="future-blocks"></a>
4206    
4207    
4208
4209
4210
4211
4212
4213    
4214    
4215    
4216    
4217    
4218
4219
4220<div class="project container">
4221    <div class="btn-toolbar pull-right" style="margin-top: 20px;">
4222        
4223        
4224    </div>
4225    
4226        <h3><a href="/projects/future-blocks/">Future Blocks</a> <small>April 2000</small></h3>
4227    
4228    
4229        <p class="project-tags">
4230            
4231                <a href="https://github.com/fogleman/FutureBlocks"><span class="label label-warning"><i class="fa fa-star"></i> 27</span></a>
4232            
4233            
4234                <a href="/projects/tagged/qbasic/"><span class="label label-default">QBasic</span></a>
4235            
4236                <a href="/projects/tagged/game/"><span class="label label-default">Game</span></a>
4237            
4238                <a href="/projects/tagged/ai/"><span class="label label-default">AI</span></a>
4239            
4240        </p>
4241    
4242    <div class="row project-images">
4243        <div class="col col-sm-12">
4244            <p class="lead">Tetris clone that I wrote long ago in high school.</p>
4245            <div class="project-summary">
4246                <p>I wrote TONS of programs in QBasic throughout high school. Most of them are lost forever, but a few have survived. I&#39;ve put a couple programs, including this one, on the Internet Archive for eternal posterity, and there you can play them in the browser. This is a simple Tetris clone but it even includes a computer player that plays quite well!</p>
4247
4248            </div>
4249            
4250            
4251                <p class="project-links">
4252                    Links:
4253                    
4254                        <a href="https://github.com/fogleman/FutureBlocks">GitHub</a> &bull;
4255                    
4256                        <a href="https://archive.org/details/TETRIS.EXE">Play Online!</a>
4257                    
4258                </p>
4259            
4260        </div>
4261        
4262            
4263                
4264                
4265                <div class="col col-sm-4">
4266                    <a href="/static/img/project/future-blocks/1.png?bust=1496106423" class="project-image">
4267                        
4268                            <img src="/static/img/project/future-blocks/placeholder/1.png?bust=1496106426" data-echo="/static/img/project/future-blocks/thumbnail/1.png?bust=1496106426" class="img-responsive center-block">
4269                        
4270                    </a>
4271                </div>
4272                
4273            
4274        
4275            
4276                
4277                
4278                <div class="col col-sm-4 hidden-xs">
4279                    <a href="/static/img/project/future-blocks/2.png?bust=1496106423" class="project-image">
4280                        
4281                            <img src="/static/img/project/future-blocks/placeholder/2.png?bust=1496106426" data-echo="/static/img/project/future-blocks/thumbnail/2.png?bust=1496106426" class="img-responsive center-block">
4282                        
4283                    </a>
4284                </div>
4285            
4286        
4287            
4288                
4289                
4290                <div class="col col-sm-4 hidden-xs">
4291                    <a href="/static/img/project/future-blocks/3.png?bust=1496106423" class="project-image">
4292                        
4293                            <img src="/static/img/project/future-blocks/placeholder/3.png?bust=1496106426" data-echo="/static/img/project/future-blocks/thumbnail/3.png?bust=1496106426" class="img-responsive center-block">
4294                        
4295                    </a>
4296                </div>
4297            
4298        
4299    </div>
4300    
4301</div>
4302
4303
4304<script>
4305$(function() {
4306    $('.project-images').each(function() {
4307        $(this).magnificPopup({
4308            delegate: '.project-image',
4309            type:'image',
4310            gallery: {
4311                enabled: true
4312            }
4313        });
4314    });
4315    echo.init({
4316        offset: 1000,
4317        throttle: 100,
4318        debounce: false,
4319    });
4320});
4321</script>
4321
4322
4323
4324    </div>
4325    <div class="footer">
4326        <p class="social-icons">
4327            <a href="https://www.facebook.com/michael.fogleman"><i class="fa fa-facebook"></i></a>
4328            <a href="https://github.com/fogleman"><i class="fa fa-github"></i></a>
4329            <a href="https://www.instagram.com/michael.fogleman/"><i class="fa fa-instagram"></i></a>
4330            <a href="https://www.linkedin.com/in/michael-fogleman-5854341/"><i class="fa fa-linkedin"></i></a>
4331            <a href="https://medium.com/@fogleman"><i class="fa fa-medium"></i></a>
4332            <a href="https://www.reddit.com/user/FogleMonster/"><i class="fa fa-reddit"></i></a>
4333            <a href="https://stackoverflow.com/users/90308/foglebird"><i class="fa fa-stack-overflow"></i></a>
4334            <a href="https://twitter.com/FogleBird"><i class="fa fa-twitter"></i></a>
4335            <a href="https://www.youtube.com/user/FogleBird"><i class="fa fa-youtube"></i></a>
4336            <a href="mailto:[email protected]"><i class="fa fa-envelope"></i></a>
4337            <a rel="me" href="https://mastodon.social/@fogleman" style="display: none;">Mastodon</a>
4338        </p>
4339        <p class="social-note">
4340            find me elsewhere on the web
4341        </p>
4342    </div>
4343
4344</body>
4345</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.