Files
TempleOS-Rijn/LT/Demo/Dawg.CPZ
T
2018-09-08 21:45:20 +02:00

122 lines
2.3 KiB
Plaintext

//This program does a fractel-like thing with
//integer arithmetic.
class Simplex
{
I8 x,y;
};
I8 Norm(Simplex *n1)
{
return AbsI8(n1->x)+AbsI8(n1->y);
}
Simplex *CopySimplex(Simplex *dst, Simplex *src)
{
MemCpy(dst,src,sizeof(Simplex));
return dst;
}
Simplex *Mix(Simplex *result,Simplex *n1,Simplex *n2)
{
result->x=n1->x*n2->x;
result->y=n1->y*n2->y;
return result;
}
Simplex *Mangle(Simplex *result,Simplex *n1,Simplex *n2)
{
result->x=n1->x*n2->y;
result->y=n1->y*n2->x;
return result;
}
Simplex *Add(Simplex *result,Simplex *n1,Simplex *n2)
{
result->x=n1->x+n2->x;
result->y=n1->y+n2->y;
return result;
}
Simplex *Sub(Simplex *result,Simplex *n1,Simplex *n2)
{
result->x=n1->x-n2->x;
result->y=n1->y-n2->y;
return result;
}
void DrawIt(TssStruct *tss)
{
I8 old_attr=tss->text_attribute;
tss->text_attribute=(BLACK<<4)+WHITE;
ClearWinText(tss);
tss->text_attribute=old_attr;
}
void BigDawg()
{
void *old_update=Fs->update_win;
I8 ch,d,x,y,color,cnt;
Simplex n1,n2,n3,n4,n5,n6,n7,n8;
BoolU4 in_color;
U8 timeout_time;
GrBitMap *base=GrAlias(Gs->grbase,Fs);
Fs->update_win=&DrawIt;
WinMax;
do {
next_dotel:
ch=0;
cnt=RandU4;
n2.x=RandU4+MIN_I4; n2.y=RandU4+MIN_I4;
n8.x=RandU4+MIN_I4; n8.y=RandU4+MIN_I4;
in_color=RandU2 & 1;
timeout_time=GetTimeStamp+time_stamp_freq>>3;
for (y=0;y<GR_HEIGHT;y++) {
if (y<20)
if (GetTimeStamp>timeout_time)
goto next_dotel;
if (ScanKey(&ch))
goto next_dotel;
for (x=0;x<GR_WIDTH;x++) {
if (y<20)
if (GetTimeStamp>timeout_time)
goto next_dotel;
n1.x=x; n1.y=y;
CopySimplex(&n3,&n1);
color=0;
d=Norm(&n3);
while (d.u4[0]<cnt && color<WHITE) {
if (y<20)
if (GetTimeStamp>timeout_time)
goto next_dotel;
Mangle(&n7,Mix(&n4,&n3,&n1),
Add(&n5,&n3,&n2));
color++;
d=Norm(Add(&n3,&n7,Mangle(&n6,&n3,&n8)));
}
if (!in_color) {
if (color==1)
color=WHITE;
else
color=BLACK;
}
base->color=ROP_EQU+color;
GrPlot(base,x,y);
}
SwapInNext;
}
ch=GetChar(NULL,FALSE);
} while (ch!=CH_ESC && ch!=CH_CTRLQ);
Fs->update_win=old_update;
GrDel(base);
GrClear;
}
BigDawg; //Start when included