<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:media="http://search.yahoo.com/mrss/"
	
	>

<channel>
	<title>David Jihwan</title>
	<link>https://yijihwan.com</link>
	<description>David Jihwan</description>
	<pubDate>Fri, 16 Oct 2026 00:17:39 +0000</pubDate>
	<generator>https://yijihwan.com</generator>
	<language>en</language>
	
		
	<item>
		<title>Lee Mullican Floppy Disks</title>
				
		<link>https://yijihwan.com/Lee-Mullican-Floppy-Disks</link>

		<pubDate>Fri, 16 Oct 2026 00:17:39 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Lee-Mullican-Floppy-Disks</guid>

		<description>Lee Mullican Floppy Disk Imaging &#38;amp; Conservation

&#60;img width="2000" height="1506" width_o="2000" height_o="1506" data-src="https://freight.cargo.site/t/original/i/46373a99f261ebaf6a9c9a4421965a314848a12f0f1a823a2f559d47bc6542d4/mullican.png" data-mid="253427145" border="0"  src="https://freight.cargo.site/w/1000/i/46373a99f261ebaf6a9c9a4421965a314848a12f0f1a823a2f559d47bc6542d4/mullican.png" /&#62;&#60;img width="2837" height="2863" width_o="2837" height_o="2863" data-src="https://freight.cargo.site/t/original/i/884404ad98aabcfcf00a1f5082bfff3199485c2d4d3c4b01221096256ff3dbb2/mullican-drive.png" data-mid="253427151" border="0"  src="https://freight.cargo.site/w/1000/i/884404ad98aabcfcf00a1f5082bfff3199485c2d4d3c4b01221096256ff3dbb2/mullican-drive.png" /&#62;</description>
		
	</item>
		
		
	<item>
		<title>Websites Websites Websites! (WWW!)</title>
				
		<link>https://yijihwan.com/Websites-Websites-Websites-WWW</link>

		<pubDate>Thu, 15 Oct 2026 23:07:06 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Websites-Websites-Websites-WWW</guid>

		<description>Websites Websites Websites! (WWW!)
&#60;img width="2730" height="1820" width_o="2730" height_o="1820" data-src="https://freight.cargo.site/t/original/i/39d2c85860be42d5daed6e23e152ff2e3f532444edc39b8a13f4adb11d41fee8/www.jpg" data-mid="253426452" border="0"  src="https://freight.cargo.site/w/1000/i/39d2c85860be42d5daed6e23e152ff2e3f532444edc39b8a13f4adb11d41fee8/www.jpg" /&#62;&#60;img width="2730" height="1820" width_o="2730" height_o="1820" data-src="https://freight.cargo.site/t/original/i/626039369028bc1a3861bdb66d2437e64050dbf6d536473dc2eb115e692ea782/www-2.jpg" data-mid="253426707" border="0"  src="https://freight.cargo.site/w/1000/i/626039369028bc1a3861bdb66d2437e64050dbf6d536473dc2eb115e692ea782/www-2.jpg" /&#62;&#60;img width="2730" height="1820" width_o="2730" height_o="1820" data-src="https://freight.cargo.site/t/original/i/8791e65a3e3bbe64a5866073e365c95ccd1f6bb906308e2e38e9d2cf4c1d3fae/www-3.jpg" data-mid="253426714" border="0"  src="https://freight.cargo.site/w/1000/i/8791e65a3e3bbe64a5866073e365c95ccd1f6bb906308e2e38e9d2cf4c1d3fae/www-3.jpg" /&#62;&#60;img width="2730" height="1820" width_o="2730" height_o="1820" data-src="https://freight.cargo.site/t/original/i/e9be75c57dc6a956adb098bd1f87009094c55ec57dcdbf25dde27593dff0bd74/www-5.jpg" data-mid="253426716" border="0"  src="https://freight.cargo.site/w/1000/i/e9be75c57dc6a956adb098bd1f87009094c55ec57dcdbf25dde27593dff0bd74/www-5.jpg" /&#62;&#60;img width="2730" height="1820" width_o="2730" height_o="1820" data-src="https://freight.cargo.site/t/original/i/a522a673c9d495ae4e72d419d2f5ec930fb1bdd086d27ff5d77c912f32dac8d5/www-6.jpg" data-mid="253426717" border="0"  src="https://freight.cargo.site/w/1000/i/a522a673c9d495ae4e72d419d2f5ec930fb1bdd086d27ff5d77c912f32dac8d5/www-6.jpg" /&#62;&#60;img width="2178" height="1362" width_o="2178" height_o="1362" data-src="https://freight.cargo.site/t/original/i/1a9396d91ca34b97d687933fe3e40127fef9d6f1684445ce2988feda2583618b/www-poster-merged.png" data-mid="253427086" border="0"  src="https://freight.cargo.site/w/1000/i/1a9396d91ca34b97d687933fe3e40127fef9d6f1684445ce2988feda2583618b/www-poster-merged.png" /&#62;</description>
		
	</item>
		
		
	<item>
		<title>Vibe Shift</title>
				
		<link>https://yijihwan.com/Vibe-Shift</link>

		<pubDate>Thu, 15 Oct 2026 23:06:54 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Vibe-Shift</guid>

		<description>Vibe Shift&#60;img width="950" height="635" width_o="950" height_o="635" data-src="https://freight.cargo.site/t/original/i/6e61b526c740aaf740625f1431fd36e22d9cdc8acd1420007e5b33084d4b1acf/vibe-shift.jpg" data-mid="253426705" border="0"  src="https://freight.cargo.site/w/950/i/6e61b526c740aaf740625f1431fd36e22d9cdc8acd1420007e5b33084d4b1acf/vibe-shift.jpg" /&#62;</description>
		
	</item>
		
		
	<item>
		<title>Rhizome World</title>
				
		<link>https://yijihwan.com/Rhizome-World</link>

		<pubDate>Thu, 15 Oct 2026 23:05:14 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Rhizome-World</guid>

		<description>Rhizome World&#60;img width="1440" height="1440" width_o="1440" height_o="1440" data-src="https://freight.cargo.site/t/original/i/8292d3fb5d6b99e41fc26f7db6a9d5e8b996d7f4114a36ae7a3f8c4a38e35520/rhizome-world-2.jpg" data-mid="253427115" border="0"  src="https://freight.cargo.site/w/1000/i/8292d3fb5d6b99e41fc26f7db6a9d5e8b996d7f4114a36ae7a3f8c4a38e35520/rhizome-world-2.jpg" /&#62;&#60;img width="1440" height="1440" width_o="1440" height_o="1440" data-src="https://freight.cargo.site/t/original/i/20d49a703a243192763247c4c810478f9695d7d49b07ba14125195952eda6a2d/rhizome-world-6.jpg" data-mid="253427119" border="0"  src="https://freight.cargo.site/w/1000/i/20d49a703a243192763247c4c810478f9695d7d49b07ba14125195952eda6a2d/rhizome-world-6.jpg" /&#62;&#60;img width="1440" height="1440" width_o="1440" height_o="1440" data-src="https://freight.cargo.site/t/original/i/63676454c72e314299e8b23f58b6d3ebb939c6269351d1c7e90c0409e25804c4/rhizome-world-4.jpg" data-mid="253427117" border="0"  src="https://freight.cargo.site/w/1000/i/63676454c72e314299e8b23f58b6d3ebb939c6269351d1c7e90c0409e25804c4/rhizome-world-4.jpg" /&#62;&#60;img width="1440" height="1440" width_o="1440" height_o="1440" data-src="https://freight.cargo.site/t/original/i/0b1cb0bcde6e366e579d636cff0d34d126707b18c8fc881ef9d845bcc30aefac/rhizome-world-1.jpg" data-mid="253427114" border="0"  src="https://freight.cargo.site/w/1000/i/0b1cb0bcde6e366e579d636cff0d34d126707b18c8fc881ef9d845bcc30aefac/rhizome-world-1.jpg" /&#62;&#60;img width="1440" height="1440" width_o="1440" height_o="1440" data-src="https://freight.cargo.site/t/original/i/fc2930efbf7bcdc0c371ad837f1c4777b25611768e9f6f884282aa9ed03e727a/rhizome-world-3.jpg" data-mid="253427116" border="0"  src="https://freight.cargo.site/w/1000/i/fc2930efbf7bcdc0c371ad837f1c4777b25611768e9f6f884282aa9ed03e727a/rhizome-world-3.jpg" /&#62;&#60;img width="2048" height="1365" width_o="2048" height_o="1365" data-src="https://freight.cargo.site/t/original/i/4060aa253cd5f9137f53547d2df5750832964d45f03ceed7f6beec8f632f6f5f/rhizome-world-7.jpg" data-mid="253427125" border="0"  src="https://freight.cargo.site/w/1000/i/4060aa253cd5f9137f53547d2df5750832964d45f03ceed7f6beec8f632f6f5f/rhizome-world-7.jpg" /&#62;</description>
		
	</item>
		
		
	<item>
		<title>eInk Camera</title>
				
		<link>https://yijihwan.com/eInk-Camera</link>

		<pubDate>Wed, 09 Oct 2024 14:22:25 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/eInk-Camera</guid>

		<description>eInk CameraDec 13 2024
Arduino/Adafruit Grand Central (C++)

&#60;img width="3311" height="2348" width_o="3311" height_o="2348" data-src="https://freight.cargo.site/t/original/i/a15fd8a343e228c8f1c0a740d498e28cadb8892812f3f1ab1550ca9f1d75400c/ProjectPic.png" data-mid="223347260" border="0"  src="https://freight.cargo.site/w/1000/i/a15fd8a343e228c8f1c0a740d498e28cadb8892812f3f1ab1550ca9f1d75400c/ProjectPic.png" /&#62;
Github: https://github.com/davidjihwan/eInk_CameraThis installation was exhibited at the Elinor Bunin Munroe Center in Lincoln Center &#38;amp; the Grace Exhibition Space.
Exhibit wall text:“This conceptualization of a surveillance camera attempts
to capture our greatly conditioned reactions to being
observed remotely. The act of uploading pictures of
oneself to platforms that enable remote and anonymous
observation has become an integral part of how we
communicate with others.

Click the red button to take a selfie.“
Installation view at Grace Exhibition Space:&#60;img width="6240" height="4160" width_o="6240" height_o="4160" data-src="https://freight.cargo.site/t/original/i/f76cf9f62f12ee0e0443db3db2f29e4c8bf544ebe68df02c266604eb7db04bdc/_elijacobson-16-1.jpg" data-mid="228015774" border="0"  src="https://freight.cargo.site/w/1000/i/f76cf9f62f12ee0e0443db3db2f29e4c8bf544ebe68df02c266604eb7db04bdc/_elijacobson-16-1.jpg" /&#62;

Installation view at Lincoln Center:&#60;img width="612" height="792" width_o="612" height_o="792" data-src="https://freight.cargo.site/t/original/i/cc1eb51084885facc319d0dc199dbd8176d915abd9df6fdce3a3de9086c653e1/eink1.jpg" data-mid="244688356" border="0"  src="https://freight.cargo.site/w/612/i/cc1eb51084885facc319d0dc199dbd8176d915abd9df6fdce3a3de9086c653e1/eink1.jpg" /&#62;

&#60;img width="612" height="792" width_o="612" height_o="792" data-src="https://freight.cargo.site/t/original/i/dc2da1522bedfa823715c4bca1c1c3104e03a30389a0ded5b5accf9f29ec7f33/eink2.jpg" data-mid="244688355" border="0"  src="https://freight.cargo.site/w/612/i/dc2da1522bedfa823715c4bca1c1c3104e03a30389a0ded5b5accf9f29ec7f33/eink2.jpg" /&#62;&#60;img width="612" height="792" width_o="612" height_o="792" data-src="https://freight.cargo.site/t/original/i/e4fa615dfacdccb194a29f34c9460b32dbc229588c85f104cd81a2a4f89c9211/eink6.jpg" data-mid="244688353" border="0"  src="https://freight.cargo.site/w/612/i/e4fa615dfacdccb194a29f34c9460b32dbc229588c85f104cd81a2a4f89c9211/eink6.jpg" /&#62;

&#60;img width="972" height="1306" width_o="972" height_o="1306" data-src="https://freight.cargo.site/t/original/i/748da264d6c0d423c36e9e623909aa13518e6035ffb13df7f9a135f20648d8c5/installationView.png" data-mid="223348096" border="0" data-scale="50" src="https://freight.cargo.site/w/972/i/748da264d6c0d423c36e9e623909aa13518e6035ffb13df7f9a135f20648d8c5/installationView.png" /&#62;
 

Taking a picture:&#60;img width="310" height="552" width_o="310" height_o="552" data-src="https://freight.cargo.site/t/original/i/78a913fffa5005cf7dc8029c674a8b4e9795c7565d9078709e2812b184bd026c/fullInteraction.gif" data-mid="223347265" border="0"  src="https://freight.cargo.site/w/310/i/78a913fffa5005cf7dc8029c674a8b4e9795c7565d9078709e2812b184bd026c/fullInteraction.gif" /&#62;A closer view:&#38;nbsp;
&#60;img width="816" height="458" width_o="816" height_o="458" data-src="https://freight.cargo.site/t/original/i/ef2a66ae765c66aa17f36f82ab22c5d22e1140979f48028dce937f6f1d145f09/eInkCloseup.gif" data-mid="223347264" border="0" data-scale="79" src="https://freight.cargo.site/w/816/i/ef2a66ae765c66aa17f36f82ab22c5d22e1140979f48028dce937f6f1d145f09/eInkCloseup.gif" /&#62;


Full Description
Surveillance Camera is a conceptualization of a surveillance camera that attempts to capture our conditioned reactions to being observed and our trained self-selection into it. The act of uploading pictures of oneself to platforms that enable remote and disembodied observation has become an integral part of how we communicate with others. Being surveilled has morphed from a domineering, oppressive force into a sedative. In the installation, the viewer can elect to click a button to take a selfie, projecting it onto the display and becoming the subject of the piece. 
The willing participant consumes the right to become the subject of the piece, at the cost (or added enjoyment) of being watched and observed by others. As expected, this isn’t much of a burden to bear for most people at present; in my last installation of the piece, everyone who took a photo walked away without looking back, with the full knowledge that their image would remain there for others to look at (even though I offered to wipe their images). In some cases, viewers would return multiple times to take selfies and remain the main subject of observation. I don’t believe that there is a ‘correct answer’ in how to interact with the piece. There’s nothing wrong with those who interact with the piece and have their picture taken (I know I would have done so too); the installation is more about noticing our willingness, or apathy, of being observed in ways unimaginable a few decades prior. 
The technology used in the piece is bare. A screen, a camera, and a couple wires, and a microcontroller joining them together, the piece distills the idea of surveillance into its simplest and most symbolic parts. While the representation of such is antiquated in the face of the sophistication of modern surveillance technologies and means, the camera and the screen have traditionally been viewed as the chief organs of the surveillance state. 
It was important to use an eInk display for the piece, as images written on eInk displays remain there even if powered off. The only real way for an image to disappear is if someone else takes an image, replacing it. 
The image on the eInk display will theoretically far outlast the functionality of the piece as a camera, as the more fragile electronic parts break down. Once the interaction stops working, or when the piece is unplugged for the last time, the last person to have successfully taken their image will theoretically remain on the screen.&#38;nbsp;The implication that participating users could have their image stay on the screen forever highlights the dilemma between the fear of permanence and the thrill of perception that we face online.&#38;nbsp;


Ideation &#38;amp; Vision
This project was created as a final project for my “Creative Embedded Systems” and “New Media Art” classes. The final project theme of my Media Art class was “surveillance”. I wanted to create a piece that explored our greatly placated reactions to being observed and having pictures taken of ourselves in the advent of communication and social media technologies. I settled on the idea of an eink camera, where the user could take a picture of themselves, becoming the main subject of observation in the piece until the next person took a picture.&#38;nbsp;
Here’s a quick sketch I came up with:&#38;nbsp;&#60;img width="584px;" height="354px;" src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdVJQQsGX1GpfgCNkKXu1De9P_28go3iBEApIktpNHZyc65AMo3b50aojFHX0IxSL3SQANvoTV2y01_XIqNfvYej7byVY4o65DotcBNWz4cOjdEa1TXNW-9IzcWmc79nP62EEmn8g=s2048?key=tVjTFhepO88jt0Vge30bwNVG" style="width: 584px; height: 354px;" data-scale="58"&#62;
Although I had been accustomed to working with the ESP-32, I realized that I wouldn’t have enough pins to interface with both the ESP-32 and eink screen, so I used an Adafruit Grand Central for the project.&#38;nbsp;Here are the initial componenets laid out:&#60;img width="4032" height="3024" width_o="4032" height_o="3024" data-src="https://freight.cargo.site/t/original/i/d0b07f922bd44a6c6ba244eb164ffe0f27ea22ec3444b31c791507088975f694/Components.png" data-mid="223347475" border="0" data-scale="55" src="https://freight.cargo.site/w/1000/i/d0b07f922bd44a6c6ba244eb164ffe0f27ea22ec3444b31c791507088975f694/Components.png" /&#62;

As you might notice in the picture, I initially used a&#38;nbsp;Adafruit OV5640 Camera Breakout, and was planning to code in CircuitPython. I soon discovered that the Grand Central specifically tended to freeze up when using this camera module in CircuitPython. As the&#38;nbsp;OV5640 didn’t have an Arduino library written for it, I opted to use the OV7670 camera modules instead, which are far cheaper and have an Arduino library written for them.The OV7670 did also have its fair share of issues, mainly having to do with the messy soldering job that it needed in order to interface with the Grand Central:
&#60;img width="781" height="1040" width_o="781" height_o="1040" data-src="https://freight.cargo.site/t/original/i/6ffd6164aa7cfb2d720d48105a983a766d34e503379145c9f75e3f9233bea10c/CameraSoldering2.png" data-mid="223347518" border="0" data-scale="39" src="https://freight.cargo.site/w/781/i/6ffd6164aa7cfb2d720d48105a983a766d34e503379145c9f75e3f9233bea10c/CameraSoldering2.png" /&#62;
This connection ended up being pretty fragile, especially as I had to clip part of the ends of the wires in order to make them fit into the holes that were shared with resistors. I would highly recommending soldering a couple of these at once, as well as finding thinner wires (only cut them as I did as a last resort).
Here’s my first test of the eink display (using the Adafruit example).&#38;nbsp;
&#60;img width="3024" height="4032" width_o="3024" height_o="4032" data-src="https://freight.cargo.site/t/original/i/8f367f5252865c94070cc072f171e21f0e986375b4937590fa160d42440673aa/EInkTest.png" data-mid="223347262" border="0" data-scale="38" src="https://freight.cargo.site/w/1000/i/8f367f5252865c94070cc072f171e21f0e986375b4937590fa160d42440673aa/EInkTest.png" /&#62;

DebuggingI was stuck for quite a while on an issue I had where the eink display wouldn’t respond to any input, even though it could print to serial output. At one point, it somehow flashed the error message that I ran into, and then wouldn’t respond again.&#38;nbsp;&#60;img width="1553" height="1283" width_o="1553" height_o="1283" data-src="https://freight.cargo.site/t/original/i/74193ea6d6410b5185335206507b477001a6ca5c639d19c01dc65ae8ce2b733a/EinkError.png" data-mid="223347548" border="0" data-scale="47" src="https://freight.cargo.site/w/1000/i/74193ea6d6410b5185335206507b477001a6ca5c639d19c01dc65ae8ce2b733a/EinkError.png" /&#62;
After a lot of trial and error, I discovered that taking out the camera from the board allowed the display to start working as expected. Of course, having the camera in shouldn’t normally be an issue, which meant that I was using a subpar data cable. Please make sure to check that you are using a proper data cable!
After getting the display and camera working, I had to figure out how to process the image.&#38;nbsp;
An image test from the camera:&#60;img width="320" height="240" width_o="320" height_o="240" data-src="https://freight.cargo.site/t/original/i/60fe681165d93ea652449f83f9475533d4b72aff5793efb5c9a7c06a9fb61027/CamTest1.png" data-mid="223347761" border="0" data-scale="39" src="https://freight.cargo.site/w/320/i/60fe681165d93ea652449f83f9475533d4b72aff5793efb5c9a7c06a9fb61027/CamTest1.png" /&#62;I started by trying to implement a basic thresholded image, where pixel values below a certain threshold would be black, and pixels above that threshold would be white. Even getting to the point where I was outputting nonsense images took a while, as I had to figure out how to format 24-bit BMP images correctly (as Adafruit eink displays require this format). After a while, I was outputting images like this:
Nonsense output:
&#60;img width="200" height="200" width_o="200" height_o="200" data-src="https://freight.cargo.site/t/original/i/5d508c166be1b64091d4fbac8cc0f5b2eb8ef4e7ebcb34964049591ed8fe7855/CamBug1.png" data-mid="223347756" border="0" data-scale="100" src="https://freight.cargo.site/w/200/i/5d508c166be1b64091d4fbac8cc0f5b2eb8ef4e7ebcb34964049591ed8fe7855/CamBug1.png" /&#62;
Messing around with some inputs, I started to get a couple more distinct shapes in the image, but still nothing coherent.

Garbled output (a little better):
&#60;img width="200" height="200" width_o="200" height_o="200" data-src="https://freight.cargo.site/t/original/i/c4aa42fd1ac768ba4b23f20b8712e55c4f0653245ec92ce4f9b3feb0b061e7c8/CamBug2.png" data-mid="223347757" border="0"  src="https://freight.cargo.site/w/200/i/c4aa42fd1ac768ba4b23f20b8712e55c4f0653245ec92ce4f9b3feb0b061e7c8/CamBug2.png" /&#62;
Noticig the seemingly tiling patterns, I realized that I was probably indexing the rows incorrectly. After rewriting how I was accessing the rows and columns of the image, I finally started to get a recognizable image.&#38;nbsp;

Getting somewhere:&#60;img width="320" height="240" width_o="320" height_o="240" data-src="https://freight.cargo.site/t/original/i/909ea0f695d422654c3e2a7f0dd8734c20e56d84c3eae69d940676595368597a/CamBug3.png" data-mid="223347758" border="0"  src="https://freight.cargo.site/w/320/i/909ea0f695d422654c3e2a7f0dd8734c20e56d84c3eae69d940676595368597a/CamBug3.png" /&#62;Almost there:

&#60;img width="320" height="240" width_o="320" height_o="240" data-src="https://freight.cargo.site/t/original/i/3cc1cf0cfd122755e73670737fb04682528add351c603d2fd5cff10e620dc828/CamBug4.png" data-mid="223347759" border="0"  src="https://freight.cargo.site/w/320/i/3cc1cf0cfd122755e73670737fb04682528add351c603d2fd5cff10e620dc828/CamBug4.png" /&#62;
If you look closely, both of the images above have some sort of vertical banding going on. I realized after debugging for a while that I was accidentally indexing the UV byte of the YUV pixel, instead of the Y byte which corresponds to the greyscale information. Correcting this finally gave me the output I wanted.Fixed!:&#60;img width="200" height="200" width_o="200" height_o="200" data-src="https://freight.cargo.site/t/original/i/93b0a41dc2a938d44fe1c845e4afa3d135029b7f8e0ec5dadeca547071c6f7fd/CamBug5.png" data-mid="223347760" border="0"  src="https://freight.cargo.site/w/200/i/93b0a41dc2a938d44fe1c845e4afa3d135029b7f8e0ec5dadeca547071c6f7fd/CamBug5.png" /&#62;
On the display:&#60;img width="524" height="742" width_o="524" height_o="742" data-src="https://freight.cargo.site/t/original/i/74070f610d2a9038f038f3c9922c70660efa5c6ec0c1ae99f557a96d06f39aab/threshold.gif" data-mid="223347267" border="0" data-scale="40" src="https://freight.cargo.site/w/524/i/74070f610d2a9038f038f3c9922c70660efa5c6ec0c1ae99f557a96d06f39aab/threshold.gif" /&#62;
I wanted to implement some form of dithering in order to have more detail in the final image. From here, it was relatively painless to get Floyd-Steinberg dithering working.

Dithered image:&#60;img width="200" height="200" width_o="200" height_o="200" data-src="https://freight.cargo.site/t/original/i/db5cd45a16ba13d79c844aa0f7201c13ad1e3267765553e145763f33d7893c95/img0001.png" data-mid="223347779" border="0"  src="https://freight.cargo.site/w/200/i/db5cd45a16ba13d79c844aa0f7201c13ad1e3267765553e145763f33d7893c95/img0001.png" /&#62;
On the display:
&#60;img width="448" height="764" width_o="448" height_o="764" data-src="https://freight.cargo.site/t/original/i/c4f496935056a5337ac9359f7440630905da07d3814555617245c97bd7ed1fc8/dither1.gif" data-mid="223347266" border="0" data-scale="40" src="https://freight.cargo.site/w/448/i/c4f496935056a5337ac9359f7440630905da07d3814555617245c97bd7ed1fc8/dither1.gif" /&#62;
Enclosure
I initially built an enclosure out of cardboard for the camera, as I wanted to create a relatively large and complex structure, and cardboard allowed me to quickly interate and build the enclosure. I decided I liked the raw look of the electronics more, so I didn’t end up using it.

Progress pictures:

&#60;img width="3024" height="4032" width_o="3024" height_o="4032" data-src="https://freight.cargo.site/t/original/i/16271b3b9aa4a8e4cf771edfca6a896ccd49850f0b67a36699d72cc9d2822f60/EnclosureBuild1.png" data-mid="223347256" border="0" data-scale="31" src="https://freight.cargo.site/w/1000/i/16271b3b9aa4a8e4cf771edfca6a896ccd49850f0b67a36699d72cc9d2822f60/EnclosureBuild1.png" /&#62;
&#60;img width="3024" height="4032" width_o="3024" height_o="4032" data-src="https://freight.cargo.site/t/original/i/5bd2d0e565883ca4d025abdf4f681508508883aeb2831b7ec44838e42d486e33/EnclosureBuild2.png" data-mid="223347257" border="0" data-scale="31" src="https://freight.cargo.site/w/1000/i/5bd2d0e565883ca4d025abdf4f681508508883aeb2831b7ec44838e42d486e33/EnclosureBuild2.png" /&#62;
The finished build:
&#60;img width="3024" height="4032" width_o="3024" height_o="4032" data-src="https://freight.cargo.site/t/original/i/0d3a9bebb95712b2c7933778e30f6d6ec99dbb3955dc79c87f2bf2028440ee7a/CardboardEnclosure.png" data-mid="223347253" border="0" data-scale="43" src="https://freight.cargo.site/w/1000/i/0d3a9bebb95712b2c7933778e30f6d6ec99dbb3955dc79c87f2bf2028440ee7a/CardboardEnclosure.png" /&#62;

The 3D model:
&#60;img width="1120" height="1072" width_o="1120" height_o="1072" data-src="https://freight.cargo.site/t/original/i/1c7d0e4524e341df09f99fc0492bf8af90f016ec367329a81cb8e6e0340eed1d/EnclosureModel.png" data-mid="223347889" border="0" data-scale="29" src="https://freight.cargo.site/w/1000/i/1c7d0e4524e341df09f99fc0492bf8af90f016ec367329a81cb8e6e0340eed1d/EnclosureModel.png" /&#62;
I also couldn’t find any M2 screws at any nearby hardware stores, but here’s what it should look like when installed:
&#60;img width="3024" height="4032" width_o="3024" height_o="4032" data-src="https://freight.cargo.site/t/original/i/e6e24dcd8b072e429c6448b4de7e4d6a5d04bf7d79aa59637f3cf130af447f64/Enclosure1.png" data-mid="223347254" border="0" data-scale="36" src="https://freight.cargo.site/w/1000/i/e6e24dcd8b072e429c6448b4de7e4d6a5d04bf7d79aa59637f3cf130af447f64/Enclosure1.png" /&#62;
&#60;img width="3024" height="4032" width_o="3024" height_o="4032" data-src="https://freight.cargo.site/t/original/i/991ab7ab46343cc5088a07ee39933be49f5651bf0a814442d57fe70343dd96e1/Enclosure2.png" data-mid="223347255" border="0" data-scale="36" src="https://freight.cargo.site/w/1000/i/991ab7ab46343cc5088a07ee39933be49f5651bf0a814442d57fe70343dd96e1/Enclosure2.png" /&#62;</description>
		
	</item>
		
		
	<item>
		<title>Multi-State Automata</title>
				
		<link>https://yijihwan.com/Multi-State-Automata</link>

		<pubDate>Thu, 03 Oct 2024 02:46:07 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Multi-State-Automata</guid>

		<description>Multi-State AutomataSep 26 2024
Arduino/ESP32 (C++)
&#60;img width="3328" height="1919" width_o="3328" height_o="1919" data-src="https://freight.cargo.site/t/original/i/17cb0d84ab2ac88bc333b69a93e3a727fec707ecd0474f9d7487b75e2dcaa22b/GOL_IMG3.png" data-mid="219354967" border="0"  src="https://freight.cargo.site/w/1000/i/17cb0d84ab2ac88bc333b69a93e3a727fec707ecd0474f9d7487b75e2dcaa22b/GOL_IMG3.png" /&#62;
Github:&#38;nbsp;https://github.com/davidjihwan/Multi_State_Automata/tree/mainIdeation &#38;amp; Planning

The first thing that came to my mind after being handed an ESP32 TTGO was to try implementing some form of cellular automata. I could look at simulations of automata for hours, and with the standalone ESP32 having a relatively large display compared to its input and feedback systems, it seemed like the perfect application for this project.The most popular, and one of my favorite, forms of cellular automata is Conway’s Game of Life. With the display being relatively tiny, however, I didn’t think I would be able to see the intricate details of the simulation. Instead, I was more drawn towards a variant called a multi-state automata, in which cells had more than the traditional alive or death states. I was inspired by this video by Erik Fransson, where he shows the complex and visually stunning behavior of multi-state automata systems. Watching some of the simulations, I decided that even if I was only able to play the simulation on a small scale, it would still create interesting patterns.&#38;nbsp;I made the design decision to update cells individually instead of updating the screen for every simulation step. I made this decision for two reasons: 1. I didn’t know how the computation power of the ESP32 compared to its ability to write to its display. I knew that the display refresh rate would probably be my bottleneck, but I wanted to make sure that in the case the computation was also a limiting factor, there would still be movement on the screen. 2. I wanted to take advantage of how human vision worked. Even though I was processing the simulation top-down, side to side (imagine a line sweeping across the board),&#38;nbsp; if most of the pixels were unchanged, then it would be pretty difficult to tell tha tthe pixels were being updated in this sweeping manner and instead looks a lot more uniform.&#38;nbsp;
Media

This effect becomes much more clear in the gif below. If you try hard enough, you can see the lines that sweep across the screen and update the pixels, but it isn’t too obvious.

&#60;img width="498" height="280" width_o="498" height_o="280" data-src="https://freight.cargo.site/t/original/i/477203eb3a9c88e6838350561f057ee284c838067a7561b364a605b6691adf52/GOL_GIF2-copy.gif" data-mid="219118510" border="0"  src="https://freight.cargo.site/w/498/i/477203eb3a9c88e6838350561f057ee284c838067a7561b364a605b6691adf52/GOL_GIF2-copy.gif" /&#62;(Cell size: 4px,&#38;nbsp; Threshold: 2, Moore Neighborhood)
To keep things interesting, I also made the decision to start a new version of the simulation every 140 simulation steps, wiping the screen and starting with random values each time.
 
&#60;img width="352" height="214" width_o="352" height_o="214" data-src="https://freight.cargo.site/t/original/i/9f594f4ca17b61da3738f679ca182b7912e7abb1352782f4cace970e75f7198e/GOL_GIF1-copy.gif" data-mid="219118509" border="0" data-scale="100" src="https://freight.cargo.site/w/352/i/9f594f4ca17b61da3738f679ca182b7912e7abb1352782f4cace970e75f7198e/GOL_GIF1-copy.gif" /&#62;(Cell size: 4px,&#38;nbsp; Threshold: 2, Moore Neighborhood)

Here are all of the configurations I tried that seemed to yield interesting results:
&#60;img width="516" height="328" width_o="516" height_o="328" data-src="https://freight.cargo.site/t/original/i/01a737d8555928c10033280f2b23ebeb77280893f3569c4b64a7bee9a71f36a8/GOL_Moore_Thresh1_4px.gif" data-mid="219389136" border="0" data-scale="48" src="https://freight.cargo.site/w/516/i/01a737d8555928c10033280f2b23ebeb77280893f3569c4b64a7bee9a71f36a8/GOL_Moore_Thresh1_4px.gif" /&#62;(Cell size: 4px,&#38;nbsp; Threshold: 1, Moore Neighborhood)

&#60;img width="320" height="180" width_o="320" height_o="180" data-src="https://freight.cargo.site/t/original/i/8180c701e3b9e9e0aa25169b5060ce627573eeeca720e1cb6626e970c7110aa6/GOL_Moore_Thresh2_4px.gif" data-mid="219389143" border="0"  src="https://freight.cargo.site/w/320/i/8180c701e3b9e9e0aa25169b5060ce627573eeeca720e1cb6626e970c7110aa6/GOL_Moore_Thresh2_4px.gif" /&#62;
(Cell size: 4px,&#38;nbsp; Threshold: 2, Moore Neighborhood)

&#60;img width="362" height="208" width_o="362" height_o="208" data-src="https://freight.cargo.site/t/original/i/14ba58e4e4c12b32a2e7da18f02983a07e635a52e9c2a2d86cbbd36dfb77fd30/GOL_Moore_Thresh2_2px.gif" data-mid="219389139" border="0"  src="https://freight.cargo.site/w/362/i/14ba58e4e4c12b32a2e7da18f02983a07e635a52e9c2a2d86cbbd36dfb77fd30/GOL_Moore_Thresh2_2px.gif" /&#62;
(Cell size: 2px,&#38;nbsp; Threshold: 2, Moore Neighborhood)

&#60;img width="474" height="310" width_o="474" height_o="310" data-src="https://freight.cargo.site/t/original/i/843e28a648ce54ee9f0325dabf2966196ef644f9925bf6df0d0ddffb3007851a/GOL_Moore_Thresh3_4px.gif" data-mid="219389146" border="0" data-scale="48" src="https://freight.cargo.site/w/474/i/843e28a648ce54ee9f0325dabf2966196ef644f9925bf6df0d0ddffb3007851a/GOL_Moore_Thresh3_4px.gif" /&#62;(Cell size: 4px,&#38;nbsp; Threshold: 3, Moore Neighborhood)

&#60;img width="304" height="200" width_o="304" height_o="200" data-src="https://freight.cargo.site/t/original/i/f09515d3181f4a40f04a4ab8be410177095b0573beaaf4f012f497ef5137ea2d/GOL_Neumann_Thresh1_2px.gif" data-mid="219389150" border="0" data-scale="100" src="https://freight.cargo.site/w/304/i/f09515d3181f4a40f04a4ab8be410177095b0573beaaf4f012f497ef5137ea2d/GOL_Neumann_Thresh1_2px.gif" /&#62;(Cell size: 2px,&#38;nbsp; Threshold: 1, Neumann Neighborhood)
For the actual showcase, I decided on the configuration of (Cell size: 4px,&#38;nbsp; Threshold: 2, Moore Neighborhood, Step limit: 200). I housed my ESP32 inside an envelope (that was also decorated in a fitting manner) and hung it from the ceiling of the Valegos Computational Center in Barnard College, as seen below.
&#60;img width="3024" height="4032" width_o="3024" height_o="4032" data-src="https://freight.cargo.site/t/original/i/fe8b6be3dcfdd9535e96f2ae343b2749e4cec21bdc28edbd56ae89e81c570c13/GOL_envelope.png" data-mid="219389132" border="0" data-scale="54" src="https://freight.cargo.site/w/1000/i/fe8b6be3dcfdd9535e96f2ae343b2749e4cec21bdc28edbd56ae89e81c570c13/GOL_envelope.png" /&#62;Techical Details

I preferred using the Moore Neighborhood model, with a threshold of 2. In this configuration for each simulation step, if a cell has 2 or more “enemy” cells in its neighborhood, it is assimilated by the enemy cells and take on their state. As can be seen, this leads to incredibly interesting patterns, with the simulation stabilizing into stable spiral patterns over time. The threshold is the same as in Erik Fransson’s simulations, as it seems to be the configuration that produces the most visually interesting results.
If you take a deeper look at the code, you might notice that there are some workarounds I implemented both due to Arduino’s coding environment and my limited expertise. The simulation is typically run using a 2D matrix corresponding to how the cells are arranged on the screen. I wanted the dimensions of the matrix to be variable in order to test out different cell sizes. Instead of wrangling the compiler to accept a ‘variable dimensioned’ 2D matrix and worry about memory allocation, I opted to use fake matrices in the form of int* pointers (basically an array). I implemented a helper function, M_indexer, to index these arrays as I would a matrix. I also implemented the helper function as a functor in an attempt to optimize the code, but I don’t know enough about how the Arduino compiler works to know if the function code was unpacked as it would be in a standard C++ compiler.
The main code improvement that I would implement if I have the chance to tackle a similar project would be to change the way I am writing to the screen. Currently, the code is written in a manner that gives both the computation and screen-update ample room for bottlenecking, meaning that the simulation shouldn’t be too affected if one or the other was the limiting factor. However, I seem to have greatly underestimated how much faster the computation would be than the screen update. If there is an efficient manner to use buffers to “build” the image corresponding to the next simulation step and load those images every screen update (instead of just individual cells), it may be possible to run much larger simulations. However, more testing is needed on how the ESP32 writes to the screen and if the code for writing to it could be optimized to any degree for our purposes.&#38;nbsp;</description>
		
	</item>
		
		
	<item>
		<title>Cat Toy Simulator</title>
				
		<link>https://yijihwan.com/Cat-Toy-Simulator</link>

		<pubDate>Wed, 30 Oct 2024 00:19:24 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Cat-Toy-Simulator</guid>

		<description>Cat Toy SimulatorOct 29 2024
Arduino/Processing/ESP32 (C++/Processing)
&#60;img width="1680" height="984" width_o="1680" height_o="984" data-src="https://freight.cargo.site/t/original/i/b964cac52884423731d74c7209634e9be4baf876da5d54282c037f16c6e15430/cat_gameplay.png" data-mid="220554044" border="0"  src="https://freight.cargo.site/w/1000/i/b964cac52884423731d74c7209634e9be4baf876da5d54282c037f16c6e15430/cat_gameplay.png" /&#62;
Github: https://github.com/davidjihwan/Cat_Toy_Simulator/tree/main


Media

The hardware side:
&#60;img width="2618" height="1543" width_o="2618" height_o="1543" data-src="https://freight.cargo.site/t/original/i/66328d0dafa533463c2343adb5b1eed545a13b1d81a64e90fbf64302daebae71/enclosure_assembled.png" data-mid="220554043" border="0"  src="https://freight.cargo.site/w/1000/i/66328d0dafa533463c2343adb5b1eed545a13b1d81a64e90fbf64302daebae71/enclosure_assembled.png" /&#62;


Joystick Movement:

&#60;img width="726" height="504" width_o="726" height_o="504" data-src="https://freight.cargo.site/t/original/i/54c59847843810ac662f8db6325cb62a63e7b44f67e6e88d493dc6ae875f202e/cat_joystick.gif" data-mid="220554037" border="0"  src="https://freight.cargo.site/w/726/i/54c59847843810ac662f8db6325cb62a63e7b44f67e6e88d493dc6ae875f202e/cat_joystick.gif" /&#62;

Button movement (”jumps” or “impulses”):

&#60;img width="650" height="450" width_o="650" height_o="450" data-src="https://freight.cargo.site/t/original/i/66de5659f436020372f53b41afb901417e4b645ee7525f5f0609ad039ebfb097/cat_impulse.gif" data-mid="220554038" border="0"  src="https://freight.cargo.site/w/650/i/66de5659f436020372f53b41afb901417e4b645ee7525f5f0609ad039ebfb097/cat_impulse.gif" /&#62;

Cats are able to catch the player, who then has to shake themselves loose:

&#60;img width="580" height="402" width_o="580" height_o="402" data-src="https://freight.cargo.site/t/original/i/e427f84906570420e2b21e0cc1484af7605685830bbb5b2718078648387ce5bd/cat_grab.gif" data-mid="220554039" border="0"  src="https://freight.cargo.site/w/580/i/e427f84906570420e2b21e0cc1484af7605685830bbb5b2718078648387ce5bd/cat_grab.gif" /&#62;

More gameplay:

&#60;img width="562" height="390" width_o="562" height_o="390" data-src="https://freight.cargo.site/t/original/i/be12cd0fc4e0e96444cc45ede4f29faa77e38787087359bbf9fd0c5564452c69/cat_gameplay.gif" data-mid="220554040" border="0"  src="https://freight.cargo.site/w/562/i/be12cd0fc4e0e96444cc45ede4f29faa77e38787087359bbf9fd0c5564452c69/cat_gameplay.gif" /&#62;


Ideation &#38;amp; Design ProcessThis project was completed for my Creative Embedded Systems class, where we were were required to use a joystick and a button/potentiometer to interface to the computer.

After brainstorming for a while with these constraints, I landed on the idea of a cat toy simulator, where the user would control a cat toy and try their best not to get caught by a number of cats. First of all, I greatly enjoy playing with my cats, so I knew that some version of the implementation would be fun to play with. Secondly, the motions that one has to carry out when playing with a cat can be broken up into two general categories: 1. You move the cat toy in a general direction, and 2. You jerk your hand to pull the cat toy back when the cat is about to grab it. As I had only a few input methods to work with, the small number of types of movements was perfect, as it meant I could assign a type of movement to each input.

I visualized my game as a WarioWare type minigame, where even with relatively simple controls (often just one or two at most) and visuals, the hectic and fast-paced nature of the games made them engaging and fun.

After testing the potentiometer that we were given, I opted to leave it out of the design. While I could have found a use for it, such as in allowing the user more control over their movement, I realized that turning the potentiometer was a little bit difficult due to its size and resistance. While this clunkier, finer type of control may have been more fitting for a different type of simulation, my cat toy simulation would have to be fast-paced and rapid, which would make it inefficient for the potentiometer to be a method of input.

I also initially pictured the cat toy as a toy connected to a stick by a string. However, I quickly resigned this idea after doing some research on string simulations (and even methods to fake doing so) as it would have taken far longer than the time constraints I had to work with. I still wanted to implement the general scenario I had planned, so I instead made the player control the cat toy directly. In this new plan, the player acts as the cat toy itself and not the hand controlling the stick, which I still thought would still be a fun scenario and preserved the general idea of the simulation.

I decided to implement the cat’s behavior through tasks, where the cat would either walk in a certain direction, stay still, or pounce at the cat toy. I wasn’t too worried about being accurate or realistic; the decision behind implementing many types of behaviors was to keep the simulation visually interesting or engaging.

As I continued to develop the simulation, I started to realize that I didn’t want to gamify the simulation more by adding something like a score or a timer, or freeze the game once the player was caught. I didn’t want the players to focus too much on maximizing score, as this may might lead to scenarios where the players just stay near the top of the screen where it would be more difficult for the cats to catch the player. Instead, I added more “soft” game elements, like making the cats increase in their likelihood to pounce at the cat toy the longer it went without any of them catching it. I also liked the idea of the game not “ending” when one of the cats caught you. Instead, just like in real life, you would have to shake the cat toy loose from the cat’s paws in order to play again (see Media section below). These design decisions allowed for what felt like a much softer gameplay loop that encouraged the player not to take themselves or the gameplay too seriously.

After I made sure the simulation was running as expected, I created an enclosure for the joystick as it was a little uncomfortable to hurt without one due to the pins sticking out of the bottom. I took my Professor Tiffany Tseng’s design and extruded cat faces into two of the sides to fit the theme of the game.
&#60;img width="1666" height="1262" width_o="1666" height_o="1262" data-src="https://freight.cargo.site/t/original/i/e73b7dc11691260b0d743416011d0a81ec8909d74171b61ce504497c3a1c2e63/enclosure_model.png" data-mid="220554144" border="0" data-scale="43" src="https://freight.cargo.site/w/1000/i/e73b7dc11691260b0d743416011d0a81ec8909d74171b61ce504497c3a1c2e63/enclosure_model.png" /&#62;

Technical Challenges
I had an interesting hardware problem where if I just tried to use the [0, analogMax] range to map to the joystick inputs, the player would drift slightly even if the joystick wasn’t moved at all. After printing some of the values out, I realized that there was a slight mechanical error in the output of the joysticks, where the values would vary slightly even if the joystick was not touched. To fix this, I added a small buffer wherein if the joystick values lay within the buffer’s range, the player would not move at all.


On the software side, I had some issues with what I’m assuming is how Arduino decides how to handle division and rounding. In my code, I had to keep track of the difference in time between the current frame and the last one (which I decided was better for stability instead of using a hard-coded value based on fps) to use in my calculations for movement. I was struggling with getting the cats to move properly until I realized that at times, by calculated time step, dt, was negative. Let’s say that millisLast was the value of millis() at the last time step. In my testing, the values given by millis()/1000 - millisLast/1000 is wildly different from (millis() - millisLast)/1000, and even sometimes becomes negative, which shouldn’t be possible. If floats were used to carry out these operations, the difference between the two methods should be negligible, which is why I believe it has to do with something the Arduino compiler is doing behind the scenes.


A cat not behaving as it should:
&#60;img width="714" height="654" width_o="714" height_o="654" data-src="https://freight.cargo.site/t/original/i/336c2ea92f19f879761f78758da84ff487e26672b95a8bb8b96e7e53b1240fe1/cat_glitching.gif" data-mid="220584995" border="0"  src="https://freight.cargo.site/w/714/i/336c2ea92f19f879761f78758da84ff487e26672b95a8bb8b96e7e53b1240fe1/cat_glitching.gif" /&#62;

</description>
		
	</item>
		
		
	<item>
		<title>Wave Function Collapse</title>
				
		<link>https://yijihwan.com/Wave-Function-Collapse</link>

		<pubDate>Tue, 08 Oct 2024 19:57:27 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Wave-Function-Collapse</guid>

		<description>Wave Function CollapseMay 8 2024
Unity, Procedural Generation (C#)

&#60;img width="2806" height="1372" width_o="2806" height_o="1372" data-src="https://freight.cargo.site/t/original/i/95e353de6fe475476462b45c8bde5ef04d517f38b0b4ea30ef7250ed85c5c32b/Screenshot-2024-11-11-at-11.02.41AM.png" data-mid="221571668" border="0"  src="https://freight.cargo.site/w/1000/i/95e353de6fe475476462b45c8bde5ef04d517f38b0b4ea30ef7250ed85c5c32b/Screenshot-2024-11-11-at-11.02.41AM.png" /&#62;Github:&#38;nbsp;https://github.com/ChefSteveP/WaveFuntionCollapse
A two person project done with Stephen Pasch.
Inspired by Oskar Stålberg‘s Townscaper and Tom Hanssens’ video, we wanted to try writing our own implmentation of wave function collapse (WFC) and turn it into a game (although it turned out to be more of WFC toy than a game).&#38;nbsp;


To start, the user can fill the grid with any tile from our provided tileset. After they’re satisfied, the user can either choose to move one step forward, filling in a couple tiles, or fill in the grid entirely. The user wins if the WFC leads to a viable path between the two path tiles.&#38;nbsp;
Here’s an example of what happens when the user does not choose to fill in any tiles at all, and fills the grid from the start:
&#60;img width="628" height="354" width_o="628" height_o="354" data-src="https://freight.cargo.site/t/original/i/5ce5dcfdcbf96e5d3bf69c290c421a26612168ced4792633b1566cc3884937c0/WFCclip1.gif" data-mid="221584478" border="0"  src="https://freight.cargo.site/w/628/i/5ce5dcfdcbf96e5d3bf69c290c421a26612168ced4792633b1566cc3884937c0/WFCclip1.gif" /&#62;
Here’s an example where the user has filled in some of the tiles before filling the board.&#38;nbsp;&#60;img width="496" height="278" width_o="496" height_o="278" data-src="https://freight.cargo.site/t/original/i/7e5d99e9f386f4fbf0feb894ca9f3d2984c123e1ca4f9075603c6bb64097c88e/WFCclip2.gif" data-mid="221584479" border="0"  src="https://freight.cargo.site/w/496/i/7e5d99e9f386f4fbf0feb894ca9f3d2984c123e1ca4f9075603c6bb64097c88e/WFCclip2.gif" /&#62;
Here’s a much larger example. The two tiles that must be connected are the ones on the leftmost side of the screen:
&#60;img width="820" height="462" width_o="820" height_o="462" data-src="https://freight.cargo.site/t/original/i/65dd2ae733909b2105cd9af89b244eba32a752a7d34e2bcae82f5a37ae19811e/WFCclip3.gif" data-mid="221584480" border="0"  src="https://freight.cargo.site/w/820/i/65dd2ae733909b2105cd9af89b244eba32a752a7d34e2bcae82f5a37ae19811e/WFCclip3.gif" /&#62;</description>
		
	</item>
		
		
	<item>
		<title>Explicit Euler Earths</title>
				
		<link>https://yijihwan.com/Explicit-Euler-Earths</link>

		<pubDate>Tue, 08 Oct 2024 17:24:29 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Explicit-Euler-Earths</guid>

		<description>Explicit Euler EarthsFeb 23 2024Physics Simulation/Animation (C++)
&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/1b0596e8df2b0d9f19769aac10c91e468b70d1e0e0308aac776a69fb96e1c11f/explicit-euler-still-10.jpg" data-mid="219400494" border="0"  src="https://freight.cargo.site/w/1000/i/1b0596e8df2b0d9f19769aac10c91e468b70d1e0e0308aac776a69fb96e1c11f/explicit-euler-still-10.jpg" /&#62;This simulation embraces the unstable nature of Explicit Euler for gravity simulations. The large yellow circle in the center represents the Sun, and the rest of the particles (initially arranged on a line), represent various Earths. The representation is not just symbolic: the sun in this simulation is also 0.331436&#38;nbsp;× 10^6 times heavier than the Earths. Each Earth leaves behind a trail of the same color.The simulation was achieved in a bare-bones animation engine from my Computer Animation class, with me having completed the Explicit Euler implementation. The engine only supported hard-coded simulation properties and objects in XML:&#38;lt;duration time="5.0"/&#38;gt; &#38;lt;integrator type="explicit-euler" dt="0.005"/&#38;gt; &#38;lt;maxsimfreq max="15.0"/&#38;gt;

&#38;nbsp;&#38;lt;particle m="1.0" px="1.34" py="0.0" vx="0.0" vy="6.28316" fixed="0" radius="0.02"/&#38;gt;&#38;lt;gravitationalforce i="0" j="1" G="0.000118419"/&#38;gt;&#38;lt;particlecolor i="1" r="1.0" g="0.0" b="0.0"/&#38;gt;&#38;lt;particlepath i="1" duration="20.0" r="1.0" g="0.0" b="0.0"/&#38;gt;
So I wrote a short program that allowed me to automate the coloring and placements of the Earths such that they were lined up and had colors mapped from red to blue according to how many Earths there were and their relative position.
The simulation time step is set to dt = 0.005, and a maximum simulation time of t = 5. There are 50 Earths in this particular simulation.
Stills from the simulation:
&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/4374c737bddaa8d79069e0ee82093ba9cf80222e12decd5550d56526b929a37c/explicit-euler-still-1.jpg" data-mid="219400491" border="0"  src="https://freight.cargo.site/w/1000/i/4374c737bddaa8d79069e0ee82093ba9cf80222e12decd5550d56526b929a37c/explicit-euler-still-1.jpg" /&#62;
&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/aa8830dc83cd43279e7b040c8894a71e68a8dea465d1fce2ab0cdf70d6f72e37/explicit-euler-still-2.jpg" data-mid="219400508" border="0"  src="https://freight.cargo.site/w/1000/i/aa8830dc83cd43279e7b040c8894a71e68a8dea465d1fce2ab0cdf70d6f72e37/explicit-euler-still-2.jpg" /&#62;&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/dbfcf21fb5033a0e85e95a2ce0f328365779df9e6599d8d1a5421485de04f363/explicit-euler-still-3.jpg" data-mid="219400507" border="0"  src="https://freight.cargo.site/w/1000/i/dbfcf21fb5033a0e85e95a2ce0f328365779df9e6599d8d1a5421485de04f363/explicit-euler-still-3.jpg" /&#62;
&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/5e781a692fd2eb40b335a5044a4a965fbeb831ba71d2b9b972471f2a65160b83/explicit-euler-still-4.jpg" data-mid="219400504" border="0"  src="https://freight.cargo.site/w/1000/i/5e781a692fd2eb40b335a5044a4a965fbeb831ba71d2b9b972471f2a65160b83/explicit-euler-still-4.jpg" /&#62;&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/47526128f1264d44a31c788ae3256256c7b68ff71c07e5dfb002e021424ef970/explicit-euler-still-5.jpg" data-mid="219400502" border="0"  src="https://freight.cargo.site/w/1000/i/47526128f1264d44a31c788ae3256256c7b68ff71c07e5dfb002e021424ef970/explicit-euler-still-5.jpg" /&#62;&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/44d7e6c99a321b67aec9c79d39f8b72fbb8f5189b3aba9695126f180b188c231/explicit-euler-still-6.jpg" data-mid="219400501" border="0"  src="https://freight.cargo.site/w/1000/i/44d7e6c99a321b67aec9c79d39f8b72fbb8f5189b3aba9695126f180b188c231/explicit-euler-still-6.jpg" /&#62;&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/f67064eb6d200a1454c39b3d3058f6c853b4ea8129a74bdeb127cf992f98c3ae/explicit-euler-still-7.jpg" data-mid="219400499" border="0"  src="https://freight.cargo.site/w/1000/i/f67064eb6d200a1454c39b3d3058f6c853b4ea8129a74bdeb127cf992f98c3ae/explicit-euler-still-7.jpg" /&#62;&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/b8148011133474e78c648598e4dafd38a1f46ff9b39e806cebdf7cbcff58942e/explicit-euler-still-8.jpg" data-mid="219400496" border="0"  src="https://freight.cargo.site/w/1000/i/b8148011133474e78c648598e4dafd38a1f46ff9b39e806cebdf7cbcff58942e/explicit-euler-still-8.jpg" /&#62;&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/09a7731ca530e30e8383e89a31c399db8f1e8723c39577a2f6c55db3e240b8f3/explicit-euler-still-9.jpg" data-mid="219400495" border="0"  src="https://freight.cargo.site/w/1000/i/09a7731ca530e30e8383e89a31c399db8f1e8723c39577a2f6c55db3e240b8f3/explicit-euler-still-9.jpg" /&#62;&#60;img width="1234" height="632" width_o="1234" height_o="632" data-src="https://freight.cargo.site/t/original/i/1b0596e8df2b0d9f19769aac10c91e468b70d1e0e0308aac776a69fb96e1c11f/explicit-euler-still-10.jpg" data-mid="219400494" border="0"  src="https://freight.cargo.site/w/1000/i/1b0596e8df2b0d9f19769aac10c91e468b70d1e0e0308aac776a69fb96e1c11f/explicit-euler-still-10.jpg" /&#62;

A gif of the simulation:
&#60;img width="390" height="200" width_o="390" height_o="200" data-src="https://freight.cargo.site/t/original/i/0b3ff379053fdb34da97d950934e9218d8b0482b997acf13132cdc6c998e44f7/creativeSceneT1M2.gif" data-mid="219399089" border="0" data-scale="100" src="https://freight.cargo.site/w/390/i/0b3ff379053fdb34da97d950934e9218d8b0482b997acf13132cdc6c998e44f7/creativeSceneT1M2.gif" /&#62;</description>
		
	</item>
		
		
	<item>
		<title>Multithreaded Particles</title>
				
		<link>https://yijihwan.com/Multithreaded-Particles</link>

		<pubDate>Fri, 28 Jul 2023 21:11:25 +0000</pubDate>

		<dc:creator>David Jihwan</dc:creator>

		<guid isPermaLink="true">https://yijihwan.com/Multithreaded-Particles</guid>

		<description>Multithreaded ParticlesJul 23 2023
Multithreading/Unity (HLSL, C#)

Multithreading experiments in Unity in HLSL, based heavily on Sebastian Lague’s code. This is a work in progress - I hope to add touch interactibility soon. Made for the Valegos Computational Science Center.The following experiments show simulations with only 10,000 agents. With a maximum of 16 thread groups, and a group size limit of 65,536 (2^16), a total of 1,048,576 (2^20) agents can be simulated without any issues on a mac with an M1 chip. Running the program on any modern graphics card should be able to run 16,000,000 agents without a problem (after increasing thread groups to 256).
Github Link


&#60;img width="1700" height="890" width_o="1700" height_o="890" data-src="https://freight.cargo.site/t/original/i/c7ef4442dd2f3b10f65870180bb3e8327f637352de6910ffd89aa04202109131/Screenshot-2023-10-15-at-10.49.23-PM.png" data-mid="193803926" border="0"  src="https://freight.cargo.site/w/1000/i/c7ef4442dd2f3b10f65870180bb3e8327f637352de6910ffd89aa04202109131/Screenshot-2023-10-15-at-10.49.23-PM.png" /&#62;Particles move around with constant speed and direction while “painting” the screen, only changing direction when the edge of the screen is hit.&#38;nbsp;
The following simulations only differ by how the 10,000 simulated particles are spawned.
Random:&#60;img width="720" height="404" width_o="720" height_o="404" data-src="https://freight.cargo.site/t/original/i/d6ea571b0f20acb4843fc1f57d9dd97b4561c5839e1a4272424656b17a1a8bf7/random.gif" data-mid="193805569" border="0"  src="https://freight.cargo.site/w/720/i/d6ea571b0f20acb4843fc1f57d9dd97b4561c5839e1a4272424656b17a1a8bf7/random.gif" /&#62;
Random Full Circle&#60;img width="720" height="404" width_o="720" height_o="404" data-src="https://freight.cargo.site/t/original/i/4d4d348e7c331f913a81083222466cac6d5e37b9f2983120899e4364ceba5fcd/randomCircle.gif" data-mid="193805571" border="0"  src="https://freight.cargo.site/w/720/i/4d4d348e7c331f913a81083222466cac6d5e37b9f2983120899e4364ceba5fcd/randomCircle.gif" /&#62;


Outwards Full Circle:&#60;img width="720" height="404" width_o="720" height_o="404" data-src="https://freight.cargo.site/t/original/i/fd885de85361c99c7f6ebe7c782d563863d639aeecc0bad9356e22bfc7b9f545/outwardsFullCircle.gif" data-mid="193805568" border="0"  src="https://freight.cargo.site/w/720/i/fd885de85361c99c7f6ebe7c782d563863d639aeecc0bad9356e22bfc7b9f545/outwardsFullCircle.gif" /&#62;

Inwards Full Circle:
&#60;img width="718" height="402" width_o="718" height_o="402" data-src="https://freight.cargo.site/t/original/i/39d6483eb4ff1aefd79aea626de5ca8078aea22afce2dc06c5ece79ae0142a2d/inwardsFullCircle.gif" data-mid="193805567" border="0"  src="https://freight.cargo.site/w/718/i/39d6483eb4ff1aefd79aea626de5ca8078aea22afce2dc06c5ece79ae0142a2d/inwardsFullCircle.gif" /&#62;


Inwards Circle (the antialiasing causes some interesting patterns):
&#60;img width="508" height="284" width_o="508" height_o="284" data-src="https://freight.cargo.site/t/original/i/57f6c754a6b15b8ea33f469be72925c8fe03481f0cf98859b8e964887ebbb654/inwardsCircle.gif" data-mid="193806158" border="0" data-scale="100" src="https://freight.cargo.site/w/508/i/57f6c754a6b15b8ea33f469be72925c8fe03481f0cf98859b8e964887ebbb654/inwardsCircle.gif" /&#62;</description>
		
	</item>
		
	</channel>
</rss>