Trajectory Inspector was a final project for my Information Visualization class.
Visualizing the paths airplanes take in the sky is not a simple problem. There are thousands of planes in a given area at once, and drawing the paths on top of each other often leads to tangled, unreadable messes.
In Trajectory Inspector, I use the EDwP algorithm proposed by S. Ranu et al (2015) as a distance measure between trajectories, and Lu & Fu's nearest-neighbor clustering algorithm to decide which paths are similar. Similar paths have identical colors. The user can click on clusters to view all aircraft in that cluster, and interact with the aircraft list to filter which paths are currently visible on the map.
To make Trajectory Inspector, I used multiple technologies, leveraging the advantages of each. The JSON file format is used to encode communication between each script or program.
python 3was used to handle the bulk of the scripting, including loading the raw sensor data into Postgre, processing data into path files, and clustering.
C#was used to calculate the EDwP distance between paths. I originally implemented the EDwP algorithm in Python, but it was prohibitively slow so I rewrote it in C#. On inputs of length 10, the Python implementation took 77s to complete, while the C# rewrite took << 1s.
The full list of citations can be found in the README.md here.
Jeeves Course Planner is a tool built for students at New York University to help them select courses.
NYU's course selection tool, Albert, has many flaws. Chief among them are a lack of quick filtering, no way to visually compare schedules, and sluggish response times. I used Selenium to extract data from Albert, Python to index and process the data, and Typescript/d3.js for the frontend.
I have maintained Albert for 3 years circa late 2017. For the most recent class registration session, Google Analytics confirms that I had 509 unique users and 1300 sessions over a period of 2 months. Because the userbase for Jeeves has a uniquely high ratio of users who use adblocking programs, my real userbase is likely around 700.
Because Jeeves is open source, I was able to gain contributions from classmates to fix bugs or improve UI.
Created on a team at the 2017 NYU New York University Abu Dhabi Hackathon for Social Good in the Arab World.
In accordance with the theme, we created a prototype of a grammar-teaching tool for children who are learning Arabic. Language acquisition involves trial and error of grammar constructs, getting feedback on incorrect grammar in order to better gain an idea of grammar.
For each lesson, the user is presented with Arabic words and grammar particles, and can click or tap each word to construct a sentence, and get feedback on whether the grammar was correct. The 'heart' of the engine, the grammar checker, was coded in Python, while the website was created using d3.js, jQuery and Bootstrap.
Our team placed shared 3rd out of 14 teams at the hackathon.
Created in a hackathon along with 2 other teammates. This web app takes a list of ingredients you have on hand, and searches for a recipe you can create either using only ingredients you have, or those you can make with n extra ingredients, where n can be provided by the user.
My contribution to the project was the client and the backend infrastructure.
Using pyeuclid for geometry, JSON format for configuration files and pure Python for the rest, I created a simple implementation of a recursive raytracer. This version builds on the experience I gained coding a previous one. For example, camera rotation is implemented with quaternions. Features include:
However, due to limitations of Python, render speeds are not fast enough for a realtime display and are instead saved to a file.
Boids are agents that act following three rules: separation from nearest flockmates, alignment with nearby flockmates' directions, and cohesion, steering towards the center of gravity of nearby flockmates. This demo follows basic MVC principles, where a model (that consists of an array of boids) is updated continuously, which then affects the view, facilitated by d3.
This project was made firstly because I simply enjoy creating simulations, but also because d3 and svg is a robust combination for making simple graphics effortlessly, compared to eg. SDL.
A simple, effective web app that uses d3.js's transition module to provide a novel 'clock,' where time is represented as color, changing over time. The text smoothly and automatically resizes itself when the screen size is changed. The color transitioning uses HSL for more intuitive scaling, compared to RGB. This project was an exercise in using d3 as a jQuery alternative, simple responsive page design, and attempting to make something simple but useful.
A naval trading game/simulation written in C++. Inspired by the series Uncharted Waters, this game aims to simulate economies and merchants not as systems but as individual agents acting to form observable, rational behaviours. Some features include:
Using the human genome files generated as a result of the Human Genome Project and mirrored by Project Guttenberg, I used Python to transform the chromosomes into an image. The finished chromosome images are hosted on a "viewer" page that lets the user click on the image and find the actual genome at that point. Unfortunately, because this was created a few years ago and I have migrated systems, the look-up system no longer works and will require some non-trivial effort to reintegrate it.
Some key points:
This is a simulation of water, using the "virtual pipes" model described in this paper. Water is placed in imaginary, discrete "boxes" and water flow is modeled as water transfer between two such boxes. Implemented with C++, with Allegro for the 2D info window and a DX11 renderer (made by Joshua Alway), this simulation utilizes up to 4 threads to more rapidly process each simulation step. It has a simulation speed of roughly 20fps at optimum.