[Scroll to the bottom of the page to see the image this code constructs]
// See https://www.tropicalcoder.com/APermutationOnCombinatorialAlgorithms.htm
#define SCREEN_WIDTH 1152
#define SCREEN_HEIGHT 640
LPPOINT leftBranch(LPPOINT p, int length) {
int x = p->x;
int y = p->y;
for (int i = 0; i < length; i++) {
--x;
--y;
if (x == 0) return NULL;
if (y == 0) return NULL;
putColour(x, y, 0x0040FF40);
}
p->x = x;
p->y = y;
return p;
}
LPPOINT rightBranch(LPPOINT p, int length) {
int x = p->x;
int y = p->y;
for (int i = 0; i < length; i++) {
++x;
--y;
if (x == SCREEN_WIDTH) return NULL;
if (y == 0) return NULL;
putColour(x, y, 0x0040FF40);
}
p->x = x;
p->y = y;
return p;
}
void recurseBranches(int x, int y, int length) {
POINT point, *p;
point.x = x;
point.y = y;
p = leftBranch(&point, length);
if (p != NULL) {
if ((length >> 1) != 0) {
recurseBranches(p->x, p->y, length >> 1);
}
}
point.x = x;
point.y = y;
p = rightBranch(&point, length);
if (p != NULL) {
if ((length >> 1) != 0) {
recurseBranches(p->x, p->y, length >> 1);
}
}
}
void __cdecl thread(void *pv) {
RECT rect;
int x, y;
x = SCREEN_WIDTH / 2;
y = SCREEN_HEIGHT - 64;
putColour(x, y, 0x0040FF40);
recurseBranches(x, y, 256);
GetClientRect(hWnd, &rect);
InvalidateRect(hWnd, &rect, false);
UpdateWindow(hWnd);
bThreadLive = false;
}
This is the image produced by the code shown.