{"id":1776,"date":"2021-04-01T06:00:00","date_gmt":"2021-04-01T11:00:00","guid":{"rendered":"http:\/\/www.jaimerios.com\/?p=1776"},"modified":"2025-12-30T23:52:48","modified_gmt":"2025-12-30T23:52:48","slug":"mandelbrot-set","status":"publish","type":"post","link":"https:\/\/jaimerios.com\/?p=1776","title":{"rendered":"Mandelbrot Set"},"content":{"rendered":"\n<p>I&#8217;m quite fascinated with the image that the Mandelbrot Set produces, but admittedly, I didn&#8217;t understand how to implement the function from the description on Wikipedia.<\/p>\n\n\n\n<p>Thankfully, there are 2 really good videos that give an overview and an in depth explanation of the function, which you can watch at:<\/p>\n\n\n\n<p>Mandelbrot back to basics:<br> <a href=\"https:\/\/youtu.be\/FFftmWSzgmk\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"https:\/\/youtu.be\/FFftmWSzgmk (opens in a new tab)\">https:\/\/youtu.be\/FFftmWSzgmk<\/a><\/p>\n\n\n\n<p>Mandelbrot Set described:<br> <a href=\"https:\/\/youtu.be\/NGMRB4O922I\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"https:\/\/youtu.be\/NGMRB4O922I (opens in a new tab)\">https:\/\/youtu.be\/NGMRB4O922I<\/a><\/p>\n\n\n\n<p>The formula, <math data-latex=\"z _{n+1}=z_n^2+c\"><semantics><mrow><msub><mi>z<\/mi><mrow><mi>n<\/mi><mo>+<\/mo><mn>1<\/mn><\/mrow><\/msub><mo>=<\/mo><msubsup><mi>z<\/mi><mi>n<\/mi><mn>2<\/mn><\/msubsup><mo>+<\/mo><mi>c<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">z _{n+1}=z_n^2+c<\/annotation><\/semantics><\/math> , involves complex numbers, which you will see used in my implementation.<\/p>\n\n\n\n<p>In my implementation, we go through each x,y coordinate, checking if at that coordinate, whether or not the values returned are within the Mandelbrot Set \u2026 don&#8217;t forget to watch the above videos for what that means.<\/p>\n\n\n\n<p>At each x,y coordinate, we have to scale those coordinates to be within a 2&#215;2 box, which has it&#8217;s x coordinate centered at -0.5 and it&#8217;s y coordinate centered at 0.0&#8230; to then call out to my <code>get_number_of_iterations<\/code> function, which iterates until the complex number&#8230; &#8216;explodes&#8217;, then we return that iteration count back to our calling function.<\/p>\n\n\n\n<p>The resulting grayscale image definitely looks like a Mandelbrot:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2021\/04\/mandelbrot.jpg\" alt=\"\" class=\"wp-image-1915\" srcset=\"https:\/\/jaimerios.com\/wp-content\/uploads\/2021\/04\/mandelbrot.jpg 1024w, https:\/\/jaimerios.com\/wp-content\/uploads\/2021\/04\/mandelbrot-300x300.jpg 300w, https:\/\/jaimerios.com\/wp-content\/uploads\/2021\/04\/mandelbrot-150x150.jpg 150w, https:\/\/jaimerios.com\/wp-content\/uploads\/2021\/04\/mandelbrot-768x768.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Here is the code I created to make the above image:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C++<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include &lt;complex>\n#include &lt;cstdint>\n#include &lt;filesystem>\n#include &lt;iostream>\n#include &lt;opencv2\/imgcodecs.hpp>\n#include &lt;opencv2\/imgproc.hpp>\n#include &lt;vector>\n\n\/****************************************************************\n * Utility template that helps us find the offset in a 1d vector\n * when we are using a (x,y) coordinate.\n *\/\ntemplate &lt;const uint32_t channel_count>\nauto offset_in_interleaved_1d_vec(const uint32_t width, const uint32_t x, const uint32_t y, const uint32_t channel) -> size_t\n{\n  const auto offset = (y * width + x) * channel_count + channel;\n  return offset;\n}\n\n\/*****************************************************************\/\nauto get_number_of_iterations(const std::complex&lt;double>&amp; z0, const double size, const int max) -> int\n{\n  auto z = z0;\n  for (auto i = 0; i &lt; max; i++)\n  {\n    if (std::abs(z) > size)\n      return i;\n\n    z = (z * z) + z0;\n  }\n\n  \/\/ default to max\n  return max;\n}\n\n\/****************************************************************\n * From Wikipedia ( https:\/\/en.wikipedia.org\/wiki\/Mandelbrot_set#Formal_definition ):\n * `The Mandelbrot set is the set of values of c in the complex plane for which the orbit of the critical point z = 0 under iteration of the quadratic map remains bounded.`\n *  z{n+1} = z^2{n} + c\n *\/\nauto create_grayscale_mandelbrot_image(const double center_x, const double center_y, const double size, const int max_iterations, const int pixels_wide) -> std::vector&lt;std::uint8_t>\n{\n  \/\/ A vector to hold the grayscale image data, pixels_wide^2 in size, and initialized with zero\n  auto image = std::vector&lt;std::uint8_t>(pixels_wide * pixels_wide, 0);\n\n  \/\/ Convenience lambda\n  auto get_scaled_coordinate = &#91;&amp;&#93;(const double center, const double xy) {\n    return (center - (size \/ 2) + ((size * xy) \/ pixels_wide));\n  };\n\n  for (auto y = 0; y &lt; pixels_wide; y++)\n  {\n    for (auto x = 0; x &lt; pixels_wide; x++)\n    {\n      \/\/ Scale the x\/y coordinate to be within the size x size box\n      auto x0 = get_scaled_coordinate(center_x, x);\n      auto y0 = get_scaled_coordinate(center_y, y);\n\n      \/\/ Find out how many iterations (of the function) we can go through before the complex number becomes unstable\n      auto z    = std::complex&lt;double>(x0, y0);\n      auto gray = max_iterations - get_number_of_iterations(z, size, max_iterations);\n\n      \/\/ Get the offset, using the x,y coordinate, to our memory position in the 1D vector\n      auto offset = offset_in_interleaved_1d_vec&lt;1>(pixels_wide, x, y, 0);\n\n      \/\/ Now save the grayscale value\n      image&#91;offset&#93; = gray;\n    }\n  }\n\n  return image;\n}\n\n\/*****************************************************************\n * Convenience function to create the full path to our output image\n *\/\nauto get_output_file_path() -> std::string\n{\n  const auto current_path = std::filesystem::current_path();\n  const auto path         = current_path \/ std::filesystem::path(\"mandelbrot.jpg\");\n  const auto full_path    = std::filesystem::weakly_canonical(path);\n  return full_path.string();\n}\n\n\/*****************************************************************\/\nint main(int, char**)\n{\n  \/\/ The center x,y for the Mandelbrot box\n  const auto center_x = -0.5; \/\/ center x\n  const auto center_y = 0.0;  \/\/ center y\n\n  \/\/ The size of the Mandelbrot box, which in this case, is a 2x2 box\n  const auto size = 2.0;\n\n  \/\/ The number of iterations we will allow for, before aborting\n  const auto max_iterations = 255;\n\n  const auto image_pixels_wide = 512 * 2;\n\n  \/\/ Create the image data\n  auto grayscale_image = create_grayscale_mandelbrot_image(center_x, center_y, size, max_iterations, image_pixels_wide);\n\n  \/\/ Convert the image data to an OpenCV Mat\n  auto output_gray = cv::Mat(image_pixels_wide, image_pixels_wide, CV_8UC1, grayscale_image.data());\n\n  \/\/ Write out the data to disk; first up, let's get a path to write to\n  const auto full_path  = get_output_file_path();\n  const auto successful = cv::imwrite(full_path.c_str(), output_gray);\n  if (!successful)\n    std::cout &lt;&lt; \"Failed to write out file\\n\";\n  else\n    std::cout &lt;&lt; \"Success!\\n\";\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;complex&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;cstdint&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;filesystem&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;opencv2\/imgcodecs.hpp&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;opencv2\/imgproc.hpp&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;vector&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/****************************************************************<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Utility template that helps us find the offset in a 1d vector<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * when we are using a (x,y) coordinate.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">template<\/span><span style=\"color: #D4D4D4\"> &lt;<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">channel_count<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">offset_in_interleaved_1d_vec<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">width<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">uint32_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">channel<\/span><span style=\"color: #D4D4D4\">) -&gt; <\/span><span style=\"color: #569CD6\">size_t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> offset = (y * width + x) * channel_count + channel;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> offset;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*****************************************************************\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">get_number_of_iterations<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">complex<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">z0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">max<\/span><span style=\"color: #D4D4D4\">) -&gt; <\/span><span style=\"color: #569CD6\">int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> z = z0;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; max; i++)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">abs<\/span><span style=\"color: #D4D4D4\">(z) &gt; size)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> i;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    z = (z * z) + z0;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ default to max<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> max;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/****************************************************************<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * From Wikipedia ( https:\/\/en.wikipedia.org\/wiki\/Mandelbrot_set#Formal_definition ):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * `The Mandelbrot set is the set of values of c in the complex plane for which the orbit of the critical point z = 0 under iteration of the quadratic map remains bounded.`<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *  z{n+1} = z^2{n} + c<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">create_grayscale_mandelbrot_image<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">center_x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">center_y<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">max_iterations<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">pixels_wide<\/span><span style=\"color: #D4D4D4\">) -&gt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ A vector to hold the grayscale image data, pixels_wide^2 in size, and initialized with zero<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> image = <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #569CD6\">uint8_t<\/span><span style=\"color: #D4D4D4\">&gt;(pixels_wide * pixels_wide, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Convenience lambda<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> get_scaled_coordinate = &#91;&amp;&#93;(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">center<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">xy<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (center - (size \/ <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">) + ((size * xy) \/ pixels_wide));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> y = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; y &lt; pixels_wide; y++)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> x = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; x &lt; pixels_wide; x++)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">      \/\/ Scale the x\/y coordinate to be within the size x size box<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> x0 = <\/span><span style=\"color: #DCDCAA\">get_scaled_coordinate<\/span><span style=\"color: #D4D4D4\">(center_x, x);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> y0 = <\/span><span style=\"color: #DCDCAA\">get_scaled_coordinate<\/span><span style=\"color: #D4D4D4\">(center_y, y);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">      \/\/ Find out how many iterations (of the function) we can go through before the complex number becomes unstable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> z    = <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">complex<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;(x0, y0);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> gray = max_iterations - <\/span><span style=\"color: #DCDCAA\">get_number_of_iterations<\/span><span style=\"color: #D4D4D4\">(z, size, max_iterations);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">      \/\/ Get the offset, using the x,y coordinate, to our memory position in the 1D vector<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> offset = <\/span><span style=\"color: #DCDCAA\">offset_in_interleaved_1d_vec<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&gt;(pixels_wide, x, y, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">      \/\/ Now save the grayscale value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">image<\/span><span style=\"color: #D4D4D4\">&#91;offset&#93; = gray;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> image;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*****************************************************************<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Convenience function to create the full path to our output image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">get_output_file_path<\/span><span style=\"color: #D4D4D4\">() -&gt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">string<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> current_path = <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">filesystem<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">current_path<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> path         = current_path \/ <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">filesystem<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">path<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;mandelbrot.jpg&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> full_path    = <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">filesystem<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">weakly_canonical<\/span><span style=\"color: #D4D4D4\">(path);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">full_path<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">string<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*****************************************************************\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">char**<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ The center x,y for the Mandelbrot box<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> center_x = -<\/span><span style=\"color: #B5CEA8\">0.5<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ center x<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> center_y = <\/span><span style=\"color: #B5CEA8\">0.0<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\">  \/\/ center y<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ The size of the Mandelbrot box, which in this case, is a 2x2 box<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> size = <\/span><span style=\"color: #B5CEA8\">2.0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ The number of iterations we will allow for, before aborting<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> max_iterations = <\/span><span style=\"color: #B5CEA8\">255<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> image_pixels_wide = <\/span><span style=\"color: #B5CEA8\">512<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Create the image data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> grayscale_image = <\/span><span style=\"color: #DCDCAA\">create_grayscale_mandelbrot_image<\/span><span style=\"color: #D4D4D4\">(center_x, center_y, size, max_iterations, image_pixels_wide);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Convert the image data to an OpenCV Mat<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> output_gray = <\/span><span style=\"color: #4EC9B0\">cv<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">Mat<\/span><span style=\"color: #D4D4D4\">(image_pixels_wide, image_pixels_wide, CV_8UC1, <\/span><span style=\"color: #9CDCFE\">grayscale_image<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">data<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Write out the data to disk; first up, let&#39;s get a path to write to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> full_path  = <\/span><span style=\"color: #DCDCAA\">get_output_file_path<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> successful = <\/span><span style=\"color: #4EC9B0\">cv<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">imwrite<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">full_path<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">(), output_gray);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!successful)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #CE9178\">&quot;Failed to write out file<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #CE9178\">&quot;Success!<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>I used CMake to create the project, and here is what the CMakeLists.txt file looks like:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">CMake<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>cmake_minimum_required(VERSION 3.0.0)\nproject(mandelbrot VERSION 0.1.0)\n\nset(CMAKE_C_STANDARD 11)\nset(CMAKE_CXX_STANDARD 20)\n\ninclude(CTest)\nenable_testing()\n\nfind_package( OpenCV REQUIRED )\ninclude_directories( ${OpenCV_INCLUDE_DIRS} )\n\nadd_executable(mandelbrot main.cpp)\ntarget_link_libraries( mandelbrot ${OpenCV_LIBS} )\n\nset(CPACK_PROJECT_NAME ${PROJECT_NAME})\nset(CPACK_PROJECT_VERSION ${PROJECT_VERSION})\ninclude(CPack)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">cmake_minimum_required<\/span><span style=\"color: #D4D4D4\">(VERSION 3.0.0)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">project<\/span><span style=\"color: #D4D4D4\">(mandelbrot VERSION 0.1.0)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CMAKE_C_STANDARD 11)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CMAKE_CXX_STANDARD 20)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">include<\/span><span style=\"color: #D4D4D4\">(CTest)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">enable_testing<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">find_package<\/span><span style=\"color: #D4D4D4\">( OpenCV REQUIRED )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">include_directories<\/span><span style=\"color: #D4D4D4\">( <\/span><span style=\"color: #569CD6\">${OpenCV_INCLUDE_DIRS}<\/span><span style=\"color: #D4D4D4\"> )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">add_executable<\/span><span style=\"color: #D4D4D4\">(mandelbrot main.cpp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">target_link_libraries<\/span><span style=\"color: #D4D4D4\">( mandelbrot <\/span><span style=\"color: #569CD6\">${OpenCV_LIBS}<\/span><span style=\"color: #D4D4D4\"> )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CPACK_PROJECT_NAME <\/span><span style=\"color: #569CD6\">${PROJECT_NAME}<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CPACK_PROJECT_VERSION <\/span><span style=\"color: #569CD6\">${PROJECT_VERSION}<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">include<\/span><span style=\"color: #D4D4D4\">(CPack)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>So, there you have it. My attempt at drawing the Mandelbrot Set.<\/p>\n\n\n\n<p><strong>Update (2025-12-30)<\/strong><\/p>\n\n\n\n<p>The above code was uploaded to <a href=\"https:\/\/github.com\/AhiyaHiya\/MandelbrotSet\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/AhiyaHiya\/MandelbrotSet<\/a> , with some extra changes to allow you to build for your platform using CMake and the generator of your choice. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m quite fascinated with the image that the Mandelbrot Set produces, but admittedly, I didn&#8217;t understand how to implement the function from the description on Wikipedia. Thankfully, there are 2 really good videos that give an overview and an in depth explanation of the function, which you can watch at: Mandelbrot back to basics: https:\/\/youtu.be\/FFftmWSzgmk &#8230; <a title=\"Mandelbrot Set\" class=\"read-more\" href=\"https:\/\/jaimerios.com\/?p=1776\" aria-label=\"Read more about Mandelbrot Set\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[143],"class_list":["post-1776","post","type-post","status-publish","format-standard","hentry","category-coding","tag-cpp"],"_links":{"self":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1776","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1776"}],"version-history":[{"count":7,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1776\/revisions"}],"predecessor-version":[{"id":1921,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1776\/revisions\/1921"}],"wp:attachment":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}