{"id":13629943,"url":"https://github.com/mackorone/mms","last_synced_at":"2026-01-11T09:44:44.617Z","repository":{"id":12205525,"uuid":"14811400","full_name":"mackorone/mms","owner":"mackorone","description":"A Micromouse simulator: write and test maze-solving code without a physical robot","archived":false,"fork":false,"pushed_at":"2024-01-06T21:13:26.000Z","size":14777,"stargazers_count":368,"open_issues_count":11,"forks_count":82,"subscribers_count":25,"default_branch":"main","last_synced_at":"2024-08-01T22:44:55.895Z","etag":null,"topics":["algorithm","ieee","maze","micromouse","micromouse-simulator","robot","simulator"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mackorone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2013-11-29T22:36:30.000Z","updated_at":"2024-08-01T06:29:51.000Z","dependencies_parsed_at":"2024-01-14T06:56:30.149Z","dependency_job_id":null,"html_url":"https://github.com/mackorone/mms","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mackorone%2Fmms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mackorone%2Fmms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mackorone%2Fmms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mackorone%2Fmms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mackorone","download_url":"https://codeload.github.com/mackorone/mms/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223757071,"owners_count":17197490,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm","ieee","maze","micromouse","micromouse-simulator","robot","simulator"],"created_at":"2024-08-01T22:01:24.986Z","updated_at":"2026-01-11T09:44:44.569Z","avatar_url":"https://github.com/mackorone.png","language":"C++","funding_links":["https://www.buymeacoffee.com/mackorone"],"categories":["C++"],"sub_categories":[],"readme":"# mms \u003ca href=\"https://www.buymeacoffee.com/mackorone\"\u003e\u003cimg align=\"right\" height=36 alt=\"Save the Children\" src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\"\u003e\u003c/a\u003e\n\n![](img/mms.gif)\n\n## Table of Contents\n\n1. [Introduction](https://github.com/mackorone/mms#introduction)\n1. [Download](https://github.com/mackorone/mms#download)\n1. [Quick Start](https://github.com/mackorone/mms#quick-start)\n1. [Mouse API](https://github.com/mackorone/mms#mouse-api)\n1. [Scorekeeping](https://github.com/mackorone/mms#scorekeeping)\n1. [Cell Walls](https://github.com/mackorone/mms#cell-walls)\n1. [Cell Color](https://github.com/mackorone/mms#cell-color)\n1. [Cell Text](https://github.com/mackorone/mms#cell-text)\n1. [Reset Button](https://github.com/mackorone/mms#reset-button)\n1. [Maze Files](https://github.com/mackorone/mms#maze-files)\n1. [Building From Source](https://github.com/mackorone/mms#building-from-source)\n1. [Related Projects](https://github.com/mackorone/mms#related-projects)\n1. [Citations](https://github.com/mackorone/mms#citations)\n1. [Acknowledgements](https://github.com/mackorone/mms#acknowledgements)\n\n## Introduction\n\n*mms* is a Micromouse simulator.\n\nIt makes it easy to write and test maze-solving code without a physical robot.\n\nWith it, you can:\n\n* Test how your robot would behave in a real maze\n* Visualize what your robot is thinking\n  * Show known/unknown walls\n  * Set the color of the cells\n  * Display ASCII text on the cells\n* Simulate a crash-and-reset scenario\n* Test your algorithm on custom maze files\n* Write code in any language you want\n\nPrevious versions of *mms* exist in the `old/` directory.\n\nFor information about Micromouse, see the [Micromouse Wikipedia page](http://en.wikipedia.org/wiki/Micromouse).\n\n## Download\n\nYou can download pre-compiled binaries from the\n[releases](https://github.com/mackorone/mms/releases) page.\n\n- Linux: Download and unzip `linux.zip` and run `mms-x86_64.AppImage`\n- macOS: Download and unzip `macos.zip` and run `mms.app`\n- Windows: Download and unzip `windows.zip` and run `mms/mms.exe`\n\nIf pre-compiled binaries for your platform are unavailable, you'll have to\n[build from source](https://github.com/mackorone/mms#building-from-source).\n\n\u003e [!IMPORTANT]\n\u003e The macOS version fails with the following error:\n\u003e \u003e \"mms.app\" is damaged and can’t be opened. You should move it to the Trash.\n\u003e\n\u003e  To get past the error, manually remove the quarantine attribute:\n\u003e ```\n\u003e xattr -d com.apple.quarantine mms.app\n\u003e ```\n\n\u003e [!NOTE]\n\u003e On Windows, you may get a warning like:\n\u003e \u003e Microsoft Defender SmartScreen prevented an unrecognized app from starting. Running this app might put your PC at risk.\n\u003e\n\u003e To get past that warning, click \"More info\" and then \"Run anyway.\"\n\n## Quick Start\n\nWriting a Micromouse algorithm is easy! Here are some available templates:\n\n| Language | Repo |\n|-|-|\n| Arduino | [mackorone/mms-arduino](https://github.com/mackorone/mms-arduino)\n| C | [mackorone/mms-c](https://github.com/mackorone/mms-c)\n| C++ | [mackorone/mms-cpp](https://github.com/mackorone/mms-cpp)\n| Go | [cpellet/mms-go](https://github.com/cpellet/mms-go)\n| Java | [mackorone/mms-java](https://github.com/mackorone/mms-java)\n| JavaScript | [mackorone/mms-javascript](https://github.com/mackorone/mms-javascript)\n| Python | [mackorone/mms-python](https://github.com/mackorone/mms-python)\n| Rust | [hardliner66/mms-rs](https://github.com/hardliner66/mms-rs)\n| Zig | [kouosi/mms-zig](https://github.com/kouosi/mms-zig)\n\n\nIf a template for a particular language is missing, don't fret! Writing your\nown template is as easy as writing to stdout, reading from stdin, and\nimplementing the [mouse API](https://github.com/mackorone/mms#mouse-api) below.\nIf you have a template you'd like to share, please make a pull request!\n\n## Mouse API\n\nAlgorithms communicate with the simulator via stdin/stdout. To issue a command,\nsimply print to stdout. To read a response, simply read from stdin. All valid\ncommands are listed below. Invalid commands are simply ignored.\n\nFor commands that return a response, it's recommended to wait for the response\nbefore issuing additional commands.\n\n#### Summary\n\n```c++\nint mazeWidth();\nint mazeHeight();\n\nbool wallFront(int numHalfSteps = 1);\nbool wallRight(int numHalfSteps = 1);\nbool wallLeft(int numHalfSteps = 1);\nbool wallBack(int numHalfSteps = 1);\n\n// Both of these commands can result in \"crash\"\nvoid moveForward(int distance = 1);\nvoid moveForwardHalf(int numHalfSteps = 1);\n\nvoid turnRight();\nvoid turnLeft();\nvoid turnRight45();\nvoid turnLeft45();\n\nvoid setWall(int x, int y, char direction);\nvoid clearWall(int x, int y, char direction);\n\nvoid setColor(int x, int y, char color);\nvoid clearColor(int x, int y);\nvoid clearAllColor();\n\nvoid setText(int x, int y, string text);\nvoid clearText(int x, int y);\nvoid clearAllText();\n\nbool wasReset();\nvoid ackReset();\n\nint/float getStat(string stat);\n```\n\n#### `mazeWidth`\n* **Args:** None\n* **Action:** None\n* **Response:** The height of the maze\n\n#### `mazeHeight`\n* **Args:** None\n* **Action:** None\n* **Response:** The width of the maze\n\n#### `wallFront [N]`\n* **Args:**\n  * `N` - (optional) Check for a wall this many half-steps away, default `1`\n* **Action:** None\n* **Response:** `true` if there is a wall, else `false`\n\n#### `wallRight [N]`\n* **Args:** None\n  * `N` - (optional) Check for a wall this many half-steps away, default `1`\n* **Action:** None\n* **Response:** `true` if there is a wall, else `false`\n\n#### `wallLeft [N]`\n* **Args:** None\n  * `N` - (optional) Check for a wall this many half-steps away, default `1`\n* **Action:** None\n* **Response:** `true` if there is a wall, else `false`\n\n#### `wallBack [N]`\n* **Args:** None\n  * `N` - (optional) Check for a wall this many half-steps away, default `1`\n* **Action:** None\n* **Response:** `true` if there is a wall, else `false`\n\n#### `moveForward [N]`\n* **Args:**\n  * `N` - (optional) The number of full steps to move forward, default `1`\n* **Action:** Move the robot forward the specified number of full-steps\n* **Response:**\n  * `crash` if `N \u003c 1` or the mouse cannot complete the movement\n  * else `ack` once the movement completes\n\n#### `moveForwardHalf [N]`\n* **Args:**\n  * `N` - (optional) The number of half steps to move forward, default `1`\n* **Action:** Move the robot forward the specified number of half-steps\n* **Response:**\n  * `crash` if `N \u003c 1` or the mouse cannot complete the movement\n  * else `ack` once the movement completes\n\n#### `turnRight` or `turnRight90`\n* **Args:** None\n* **Action:** Turn the robot ninty degrees to the right\n* **Response:** `ack` once the movement completes\n\n#### `turnLeft` or `turnLeft90`\n* **Args:** None\n* **Action:** Turn the robot ninty degrees to the left\n* **Response:** `ack` once the movement completes\n\n#### `turnRight45`\n* **Args:** None\n* **Action:** Turn the robot forty-five degrees to the right\n* **Response:** `ack` once the movement completes\n\n#### `turnLeft45`\n* **Args:** None\n* **Action:** Turn the robot forty-five degrees to the left\n* **Response:** `ack` once the movement completes\n\n#### `setWall X Y D`\n* **Args:**\n  * `X` - The X coordinate of the cell\n  * `Y` - The Y coordinate of the cell\n  * `D` - The direction of the wall: `n`, `e`, `s`, or `w`\n* **Action:** Display a wall at the given position\n* **Response:** None\n\n#### `clearWall X Y D`\n* **Args:**\n  * `X` - The X coordinate of the cell\n  * `Y` - The Y coordinate of the cell\n  * `D` - The direction of the wall: `n`, `e`, `s`, or `w`\n* **Action:** Clear the wall at the given position\n* **Response:** None\n\n#### `setColor X Y C`\n* **Args:**\n  * `X` - The X coordinate of the cell\n  * `Y` - The Y coordinate of the cell\n  * `C` - The character of the desired [color](https://github.com/mackorone/mms#cell-color)\n* **Action:** Set the color of the cell at the given position\n* **Response:** None\n\n#### `clearColor X Y`\n* **Args:**\n  * `X` - The X coordinate of the cell\n  * `Y` - The Y coordinate of the cell\n* **Action:** Clear the color of the cell at the given position\n* **Response:** None\n\n#### `clearAllColor`\n* **Args:** None\n* **Action:** Clear the color of all cells\n* **Response:** None\n\n#### `setText X Y TEXT`\n* **Args:**\n  * `X` - The X coordinate of the cell\n  * `Y` - The Y coordinate of the cell\n  * `TEXT` - The desired [text](https://github.com/mackorone/mms#cell-text), max length 10\n* **Action:** Set the text of the cell at the given position\n* **Response:** None\n\n#### `clearText X Y`\n* **Args:**\n  * `X` - The X coordinate of the cell\n  * `Y` - The Y coordinate of the cell\n* **Action:** Clear the text of the cell at the given position\n* **Response:** None\n\n#### `clearAllText`\n* **Args:** None\n* **Action:** Clear the text of all cells\n* **Response:** None\n\n\n#### `wasReset`\n* **Args:** None\n* **Action:** None\n* **Response:** `true` if the reset button was pressed, else `false`\n\n#### `ackReset`\n* **Args:** None\n* **Action:** Allow the mouse to be moved back to the start of the maze\n* **Response:** `ack` once the movement completes\n\n#### `getStat`\n* **Args:**\n  * `stat`: A string representing the stat to query. Available stats are:\n    * `total-distance (int)`\n    * `total-turns (int)`\n    * `best-run-distance (int)`\n    * `best-run-turns (int)`\n    * `current-run-distance (int)`\n    * `current-run-turns (int)`\n    * `total-effective-distance (float)`\n    * `best-run-effective-distance (float)`\n    * `current-run-effective-distance (float)`\n    * `score (float)`\n* **Action:** None\n* **Response:** The value of the stat, or `-1` if no value exists yet. The value will either be a float or integer, according to the types listed above.\n\n\n#### Example\n\n```c++\nAlgorithm Request (stdout)  Simulator Response (stdin)\n--------------------------  --------------------------\nmazeWidth                   16\nmazeWidth                   16\nwallLeft                    true\nsetWall 0 0 w               \u003cNO RESPONSE\u003e\nwallFront                   false\nmoveForward                 ack\nturnLeft                    ack\nwallFront                   true\nmoveForward                 crash\nsetColor 0 1 r              \u003cNO RESPONSE\u003e\nsetText 0 1 whoops          \u003cNO RESPONSE\u003e\nwasReset                    false\n...\nwasReset                    true\nclearAllColor               \u003cNO RESPONSE\u003e\nclearAllText                \u003cNO RESPONSE\u003e\nackReset                    ack\n```\n\n\n## Scorekeeping\n\nThe Stats tab displays information that can be used to score an algorithm's\nefficiency. This tab displays stats such as the total distance and total number\nof turns. It also displays the distance and number of turns for the algorithm's\nbest start-to-finish run, if the algorithm makes multiple runs from the start\ntile to the goal. The distance and number of turns for the current\nstart-to-finish run is also displayed.\n\nThere is another value displayed, called Effective Distance. This number may\ndiffer from Distance if `moveForward` is called with the optional distance\nparameter. If `moveForward` is called with an integer greater than 2, each tile\nafter the second tile will add only half a point to the effective distance. This\nsimulates a mouse driving faster if it can drive in a straight line for more\nthan a few tiles. For example, `moveForward(5)` will increase the distance by 5\nbut will increase the effective distance by only 3.5. A mouse will incur a\n15-point penalty on its next run's Effective Distance if it uses `ackReset` to\nreturn to the start tile.\n\nA final score is computed for the algorithm after it terminates. A lower score\nis better. The final score depends on the best start-to-finish run and on the\noverall run, according to the following equation.\n\n`score = best run turns + best run effective distance + 0.1 * (total turns +\ntotal effective distance)`\n\nThe mouse must reach the goal to receive a score. If the mouse never reaches the\ngoal, the score will be 2000.\n\n## Cell Walls\n\nCell walls allow the robot to diplay where it thinks walls exist, and where it\nthinks they don't. At the beginning of each run, all walls are assumed\nnon-existent. By default, the simulator will display walls that haven't been\ndiscovered as dark red. As the robot explores the maze, it should set walls\nas it discovers them.\n\n\n## Cell Color\n\nThe available colors are as follows:\n\n| Char | Color       |\n|------|-------------|\n|  k   | Black       |\n|  b   | Blue        |\n|  a   | Gray        |\n|  c   | Cyan        |\n|  g   | Green       |\n|  o   | Orange      |\n|  r   | Red         |\n|  w   | White       |\n|  y   | Yellow      |\n|  B   | Dark Blue   |\n|  C   | Dark Cyan   |\n|  A   | Dark Gray   |\n|  G   | Dark Green  |\n|  R   | Dark Red    |\n|  Y   | Dark Yellow |\n\n\n## Cell Text\n\n[All printable ASCII characters](http://facweb.cs.depaul.edu/sjost/it212/documents/ascii-pr.htm),\nexcept for `\u003cDEL\u003e`, can be used as cell text. Any invalid characters, such as a\nnewline or tab, will be replaced with `?`.\n\nWhen no algorithm is running, the simulator displays the distance of each cell\nfrom the center of the maze.\n\n\n## Reset Button\n\nThe reset button makes it possible to test crash handling code. Press the\nbutton to simulate a crash. Your algorithm should periodically check if the\nbutton was pressed via `wasReset`. If so, your algorithm should reset any\ninternal state and then call `ackReset` to send the robot back to the beginning\nof the maze.\n\n\n## Maze Files\n\nThe simulator supports a few different maze file formats, as specified below.\nIf your format isn't supported, feel free to put up a pull request.\n\nNote that, in order to use a maze in the simulator, it must be:\n\n* Nonempty\n* Rectangular\n* Fully enclosed\n\nAlso note that official Micromouse mazes have additional requirements:\n\n* No inaccessible locations\n* Exactly three starting walls\n* Only one entrance to the center\n* Has a hollow center, i.e., the center peg has no walls attached to it\n* Has walls attached to every peg except the center peg\n* Is unsolvable by a wall-following robot\n\nHere are some links to collections of maze files:\n* [micromouseonline/mazefiles](https://github.com/micromouseonline/mazefiles)\n* http://www.tcp4me.com/mmr/mazes/\n\n#### Map format\n\nExample:\n\n    +---+---+---+\n    |       |   |\n    +   +   +   +\n    |   |       |\n    +---+---+---+\n\n* Each cell is 5 spaces wide and 3 spaces tall\n* All characters besides spaces count as walls\n* Walls are determined by checking the locations marked with an \"x\":\n\n```\n+ x +\nx   x\n+ x +\n```\n\n\n#### Num format\n\nFormat:\n\n    X Y N E S W\n\n* **X:** The X coordinate of the cell\n* **Y:** The Y coordinate of the cell\n* **N:** `1` if there is a wall on the north side, else `0`\n* **S:** `1` if there is a wall on the east side, else `0`\n* **E:** `1` if there is a wall on the south side, else `0`\n* **W:** `1` if there is a wall on the west side, else `0`\n\nExample:\n\n    0 0 0 1 1 1\n    0 1 1 0 0 1\n    1 0 0 0 1 1\n    1 1 1 1 0 0\n    2 0 0 1 1 0\n    2 1 1 1 0 1\n\nResult:\n\n    +---+---+---+\n    |       |   |\n    +   +   +   +\n    |   |       |\n    +---+---+---+\n\n## Building From Source\n\nIf you want to write code for the simulator itself, you'll need to build the\nproject from source. Below are some OS-specific instructions. If instructions\nfor your platform are unavailable, you can probably still run the simulator,\nyou'll just have to figure it out on your own for now.\n\n#### Windows\n\nInstall Qt:\n\n1. Download the Qt open source installer: https://www.qt.io/download-qt-installer-oss\n1. If you don't already have a Qt account, you'll need to make one\n1. When prompted to select components, [choose \"MinGW\"](https://github.com/mackorone/mms/blob/master/img/qt-install-windows-1.png)\n\nBuild the project using QtCreator:\n\n1. Download or clone *mms*\n1. Run QtCreator and open `mms/src/mms.pro`\n1. Configure the project to [use \"MinGW\"](https://github.com/mackorone/mms/blob/master/img/qt-install-windows-2.png)\n1. Build and run the project\n\n#### macOS\n\nInstall Xcode: https://developer.apple.com/xcode/\n\nInstall Qt:\n\n1. Download the Qt open source installer: https://www.qt.io/download-qt-installer-oss\n1. If you don't already have a Qt account, you'll need to make one\n1. When prompted to select components, [choose \"macOS\"](https://github.com/mackorone/mms/blob/master/img/qt-install-macos-1.png)\n\nBuild the project using QtCreator:\n\n1. Download or clone *mms*\n1. Run QtCreator and open `mms/src/mms.pro`\n1. Configure the project to [use \"clang 64bit\"](https://github.com/mackorone/mms/blob/master/img/qt-install-macos-2.png)\n1. Build and run the project\n\n#### Linux (Ubuntu)\n\nInstall Qt:\n\n1. Download the Qt open source installer: https://www.qt.io/download-qt-installer-oss\n1. Make the installer executable: `chmod +x qt-unified-linux-x64-3.0.6-online.run`\n1. Run the installer executable: `./qt-unified-linux-x64-3.0.6-online.run`\n1. If you don't already have a Qt account, you'll need to make one\n1. When prompted to select components, [choose \"Desktop gcc 64-bit\"](https://github.com/mackorone/mms/blob/master/img/qt-install-ubuntu.png)\n1. Once the installer finishes, the `qmake` binary can be found in the installation directory\n\nClone, build, and run the project:\n\n```bash\n# Clone the repo\ngit clone git@github.com:mackorone/mms.git\n\n# Build the simulator\ncd mms/src\nqmake \u0026\u0026 make\n\n# Run the simulator\n../../bin/mms\n```\n\n## Related Works\n\nFeel free to open a pull request if you want your work listed here!\n\n#### Projects\n\n- [@zdasaro](https://github.com/zdasaro) wrote a proxy for the Priceton University Robotics Club: [mms-competition-proxy](https://github.com/zdasaro/mms-competition-proxy)\n- [@P1n3appl3](https://github.com/P1n3appl3) created an Arch Linux package: [mms-git](https://aur.archlinux.org/packages/mms-git/)\n\n#### Papers\n\n- \u003chttps://link.springer.com/article/10.1007/s42452-021-04239-7\u003e\n- \u003chttps://ictaes.org/wp-content/uploads/2020/09/IJAE-2020-Vol.03-No.02/7_Sanjaya_Vol3_No2.pdf\u003e\n- \u003chttps://www.researchgate.net/publication/361212084_International_Journal_of_Advanced_Engineering_Optimizing_Tremaux_Algorithm_in_Micromouse_Using_Potential_Values\u003e\n\n#### Posts\n\n- \u003chttps://medium.com/@minikiraniamayadharmasiri/micromouse-from-scratch-algorithm-maze-traversal-shortest-path-floodfill-741242e8510\u003e\n- \u003chttps://www.technologyx2.com/proj_robot_rover/2020/6/15/project-micromouse-robot-simulator\u003e\n- \u003chttp://iamsudharsan.com/maze-solver-robot/\u003e\n- \u003chttps://www.instructables.com/Micro-Mouse-for-Beginnersth/\u003e\n- \u003chttps://projects.ieeebruins.com/micromouse/floodfill-module\u003e\n\n#### Videos\n\n- \u003chttps://www.youtube.com/watch?v=6y4nrnfZ1k0\u003e\n- \u003chttps://www.youtube.com/watch?v=-r8a8aPRYAQ\u003e\n- \u003chttps://www.youtube.com/watch?v=0YId4SPJrWo\u003e\n\n#### Repos\n\n- \u003chttps://github.com/sohamroy19/a-maze-jerry\u003e\n- \u003chttps://github.com/Madhunc5229/MicroMouse_MazeSolver\u003e\n- \u003chttps://github.com/Karansutradhar/Maze-Solver-Robot-Depth-First-Search\u003e\n- \u003chttps://github.com/nalindas9/enpm809y-final-project\u003e\n- \u003chttps://github.com/james-ralph8555/DrexelMicromouse2020\u003e\n- \u003chttps://github.com/darshit-desai/Maze-Solver-simulation-using-Wall-Following-Algorithm-OOP\u003e\n- \u003chttps://github.com/omkarchittar/Wall_Following_Robot\u003e\n\n\n## Acknowledgements\n\n| Name                                                          | Author            | Used For              |\n|---------------------------------------------------------------|-------------------|-----------------------|\n| [polypartition](https://github.com/ivanfratric/polypartition) | Ivan Fratric      | Polygon Triangulation |\n| [Qt](https://www.qt.io/)                                      | The Qt Company    | Framework and GUI     |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmackorone%2Fmms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmackorone%2Fmms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmackorone%2Fmms/lists"}