JD2022-TU1/main/extern/Camcam/ShotTracker/ShotBMP.cpp

125 lines
No EOL
2.7 KiB
C++

#include "ShotTracker.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
/*
Generation of elliptic tag bmp files.
*/
//#pragma optimize( "", off )
#define TAG_BNM_Size 200
u32 SAVEBMP(MAP *RefMap,char *Filename);
void SetCode(/*OUT*/ u32 *pCodeG_100,/*IN*/u32 CodeV);
//#define CURRENT_TAG_VERION 12
s32 PolarToColor(float R,float A,u32 *Code)
{
if (R > (TAG_BNM_Size>>1) -2)
{
if ((s32)(A * 1024.0f / (2.0f * 3.1415926535897932384626433832795f))&8) return 0xffffffff;
if (R > (TAG_BNM_Size>>1) -1) return 0xffffffff;
return 0;
}
R *= 1.40f * 256.0f / (float)TAG_BNM_Size ;
/* A *= 1.05f;
if (A > (2.0f * 3.1415926535897932384626433832795f)) return 0xffffffff;*/
if (R < 128.0f)
{
if (R > 128.0f * SMALL_RADIUS)
{
if ((R > 128.0f * CMIN) && (R < 128.0f * CMAX))
{
A *= (float)RAW_CODELENGHT / (2.0f * 3.1415926535897932384626433832795f);
if (Code[(u32)A])
{
R = (R - CMIN) / ((CMAX) - (CMIN));
return 0xFFFFFFFF;
}
else
return 0;
}
return 0;
}
return 0xffffff;
}
else
return 0xffffff;
}
void CreateTags()
{
FILE *F;
char TEXT[2048];
sprintf(TEXT,".\\TAG\\TAG_VERSION.VER",0);
F = fopen(TEXT,"rb");
if (F)
{
u32 Version;
fread(&Version,1,4,F);
fclose(F);
if (CURRENT_TAG_VERION == Version) return;
}//*/
F = fopen(TEXT,"wb");
if (F)
{
u32 Version = CURRENT_TAG_VERION;
fwrite(&Version,1,4,F);
fclose(F);
}//*/
{
MAP TAG;
MAP TAGSAVE,TAGO2;
float ASIN[8193];
for (int F = 0 ; F < 8193 ; F++) ASIN[F] = asin((float)F / 8192.0f);
TAG.SX = TAG_BNM_Size<<2;
TAG.SY = TAG_BNM_Size<<2;
TAG.SetSize(TAG.SX, TAG.SY);
TAG.staticBase = 1;
for (s32 Code = 0 ; Code < (1<<RAW_CODEBITNUM) ; Code ++)
{
u32 CodeB[1024];
SetCode(CodeB,Code);
for (u32 CX = 0 ; CX < TAG.SX ; CX ++)
{
for (u32 CY = 0 ; CY < TAG.SY ; CY ++)
{
float Cfx = (float)CX - (float)(TAG.SX>>1) + 0.5f;
float Cfy = (float)CY - (float)(TAG.SY>>1) + 0.5f;
float PolarD;
float PolarAlpha;
PolarD = sqrtf(Cfx * Cfx + Cfy * Cfy);
if (Cfy < 0.0f) PolarAlpha = ASIN[(u32)(8192.0f *(-Cfy/PolarD))];
else PolarAlpha = ASIN[(u32)(8192.0f *(Cfy/PolarD))];
if (Cfx > 0.0f) PolarAlpha = 3.1415927f - PolarAlpha;
if (Cfy < 0.0f) PolarAlpha = 2.0f * 3.1415927f - PolarAlpha;
TAG.SetValue(CX + CY * TAG.PITCH, PolarToColor(PolarD/4.0f,PolarAlpha,CodeB));
}
}
sprintf(TEXT,".\\TAG\\TAG_%03d.BMP",Code);
TAGO2 = TAGSAVE = TAG;
TAGO2.SX >>= 1;
TAGO2.SY >>= 1;
COPY_O2_RGBA(&TAG,&TAGO2);
TAG = TAGO2;
TAGO2.SX >>= 1;
TAGO2.SY >>= 1;
COPY_O2_RGBA(&TAG,&TAGO2);
TAG = TAGO2;
SAVEBMP(&TAG,TEXT);
TAG = TAGSAVE ;
}
TAG.staticBase = 0;
}
}
void SHOTS_CLASS::Init()
{
CreateTags();
}