523066680 的三角形思路很棒, 我用这个思路重编了
哈哈哈哈, 终于把纯色 五角星 搞到了 140 字节以内了, 还可以减少一点点字节, 但没必要了
i, j 值在 [0,1024] 范围外, 可以被其他色分量函数调用, 而且不影响本身功能
unsigned char RD(int i, int j)
{
if (j<=419||j>547) return i>512?BL(i,~j):GR(i,~j);
i-=512;j-=627;return fabs(1.*j/i)>.726543&&j>-208&&j<0?255:0;
}
unsigned char GR(int i, int j)
{
i-=621;j=~j-547;float A=1.25664,x=i*cos(A)-j*sin(A),y=i*sin(A)+j*cos(A);return j<-547?0:i>-109?0:fabs(y/x)>.726543&&y>-208&&y<0?255:0;
}
unsigned char BL(int i,int j)
{
i-=403;j=~j-547;float A=-1.25664,x=i*cos(A)-j*sin(A),y=i*sin(A)+j*cos(A);return j<-547?0:i<=-109?0:fabs(y/x)>.726543&&y>-208&&y<0?255:0;
}
计算过程简述
半径 1 的五角星内部小正五边形半径:
rsmall = (Sec[.2*Pi] Tan[.1*Pi])/(Tan[.1*Pi] + Tan[.2*Pi]);
内部小五边形的边割角半径(五角星的任一尖角到中心的线段)的点到中心的距离:
dc = Tan[.1*Pi]/(Tan[.1*Pi] + Tan[.2*Pi])
五角星半径 300
开口向上的大三角
旋转中心: 512, 512+ 300 * rsmall=626.59~=627
长边 y 坐标界值 512 - 300 * dc - 627 = -207.705
从左下角指向右上角的角度是(单位:Pi)
(1 - .4)/2 - 0.5 = -0.2
从右下角指向左上角的角度是(单位:Pi)
-(1 - .4)/2 - 0.5 = -0.8
Tan[((1 - .4)/2 - 0.5)*Pi] = -0.726543
开口向左的大三角旋转中心坐标
{512 + Cos[.5*Pi - .4*Pi]*300*rsmall, 512 + Sin[.5*Pi - .4*Pi]*300*rsmall}
~= {620.981, 547.41}
旋转角: .4*Pi ~= 1.25664
开口向右的大三角旋转中心坐标
{403.019, 547.41}
旋转角: -.4*Pi ~= -1.25664
j-627<=-208 <==> j <= 419