C++ using SFML : 722 703 683 527 411411 399 bytes
-12 bytes thanks to ceilingcat and pan
pan's proposed version approximates the value of cos(210) to around -.86, which will produce a slightly different graphic output, but very close to what's required by the challenge. This makes the cmath include useless. He also put the whole code into one function, and used a number of golfy techniques to reduce more the byte count, which makes the result very nice. His second optimization renders the use of vector useless, making an include and object usage useless
#include<SFML/Graphics.hpp>
#define B+__builtin_popcount(
void v(int n){sf::CircleShape h(4,6);for(sf::RenderWindow w({1200,1000},"");w.isOpen();;w.display()){for(sf::Event e;w.pollEvent(e);)if(!e.type?h.setOrigin(-600,-650):w.close();w.clear();for(int x=0,y,z=1<<n;x++<z;z=1<<n;x<z;)for(y=0;y<=zy=x++-x;z;y++;)h.setPosition(4.3*(-2*y+z-x),-2.5*(3*x-22+z-z)3*x),h.setOrigin(-600,-650),h.setFillColor(sf::Color((B(-x)B(-y)B(z z+y-x-y++)^n)&1-n&1?65535:-65281)),w.draw(h);w.display();}}