increased precision in xml output; optimized some things

This commit is contained in:
zueuk 2005-09-28 15:36:55 +00:00
parent 2bfc76e9b0
commit 83b1e24982
2 changed files with 116 additions and 76 deletions

View File

@ -1440,9 +1440,9 @@ begin
sl.add(format('time %f', [time])); sl.add(format('time %f', [time]));
if cmapindex >= 0 then if cmapindex >= 0 then
sl.add(format('cmap %d', [cmapindex])); sl.add(format('cmap %d', [cmapindex]));
sl.add(format('zoom %.3f', [zoom])); // mt sl.add(format('zoom %g', [zoom])); // mt
sl.add(format('angle %.3f', [FAngle])); sl.add(format('angle %g', [FAngle]));
sl.add(format('image_size %d %d center %.3f %.3f pixels_per_unit %f', sl.add(format('image_size %d %d center %g %g pixels_per_unit %f',
[Width, Height, center[0], center[1], pixels_per_unit])); [Width, Height, center[0], center[1], pixels_per_unit]));
sl.add(format('spatial_oversample %d spatial_filter_radius %f', sl.add(format('spatial_oversample %d spatial_filter_radius %f',
[spatial_oversample, spatial_filter_radius])); [spatial_oversample, spatial_filter_radius]));
@ -1457,10 +1457,10 @@ begin
if xform[i].density = 0 then if xform[i].density = 0 then
Continue; Continue;
sl.add(format('xform %d density %.3f color %.3f symmetry %f', [i, xform[i].density, xform[i].color, xform[i].symmetry])); sl.add(format('xform %d density %g color %g symmetry %g', [i, xform[i].density, xform[i].color, xform[i].symmetry]));
s := 'var'; s := 'var';
for j := 0 to NRVAR - 1 do begin for j := 0 to NRVAR - 1 do begin
s := format('%s %.3f', [s, xform[i].vars[j]]); s := format('%s %g', [s, xform[i].vars[j]]);
end; end;
sl.add(s); sl.add(s);
// sl.Add(format('coefs %f %f %f %f %f %f', // sl.Add(format('coefs %f %f %f %f %f %f',

View File

@ -121,6 +121,15 @@ uses
const const
EPS = 1E-10; EPS = 1E-10;
procedure SinCos(const Theta: double; var Sin, Cos: double); // I'm not sure, but maybe it'll help...
asm
FLD Theta
FSINCOS
FSTP qword ptr [edx] // Cos
FSTP qword ptr [eax] // Sin
FWAIT
end;
{ TXForm } { TXForm }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -212,8 +221,8 @@ begin
CalculateAngle := (vars[5] <> 0.0) or (vars[6] <> 0.0) or (vars[7] <> 0.0) or (vars[8] <> 0.0) or CalculateAngle := (vars[5] <> 0.0) or (vars[6] <> 0.0) or (vars[7] <> 0.0) or (vars[8] <> 0.0) or
(vars[12] <> 0.0) or (vars[13] <> 0.0) or (vars[21] <> 0.0) or (vars[22] <> 0.0); (vars[12] <> 0.0) or (vars[13] <> 0.0) or (vars[21] <> 0.0) or (vars[22] <> 0.0);
// CalculateLength := False; // CalculateLength := False;
CalculateSinCos := (vars[4] <> 0.0) or (vars[9] <> 0.0) or {z! (vars[10] <> 0.0) or} CalculateSinCos := {z! (vars[4] <> 0.0) or} (vars[9] <> 0.0) or
(vars[11] <> 0.0) or {z! (vars[16] <> 0.0) or} (vars[19] <> 0.0) or (vars[11] <> 0.0) or (vars[19] <> 0.0) or
(vars[21] <> 0.0); (vars[21] <> 0.0);
end; end;
@ -235,39 +244,52 @@ end;
//--2--//////////////////////////////////////////////////////////////////////// //--2--////////////////////////////////////////////////////////////////////////
procedure TXForm.Spherical; procedure TXForm.Spherical;
var var
r2, rr2: double; r: double;
begin begin
r2 := FTx * FTx + FTy * FTy + 1E-6; r := vars[2] / (FTx * FTx + FTy * FTy + 1E-6);
rr2 := 1 / r2; FPx := FPx + FTx * r;
FPx := FPx + vars[2] * (FTx * rr2); FPy := FPy + FTy * r;
FPy := FPy + vars[2] * (FTy * rr2);
end; end;
//--3--//////////////////////////////////////////////////////////////////////// //--3--////////////////////////////////////////////////////////////////////////
procedure TXForm.Swirl; procedure TXForm.Swirl;
var var
c1, c2, r2: double; rsin, rcos: double;
begin begin
{
r2 := FTx * FTx + FTy * FTy; r2 := FTx * FTx + FTy * FTy;
c1 := sin(r2); c1 := sin(r2);
c2 := cos(r2); c2 := cos(r2);
FPx := FPx + vars[3] * (c1 * FTx - c2 * FTy); FPx := FPx + vars[3] * (c1 * FTx - c2 * FTy);
FPy := FPy + vars[3] * (c2 * FTx + c1 * FTy); FPy := FPy + vars[3] * (c2 * FTx + c1 * FTy);
}
SinCos(FTx * FTx + FTy * FTy, rsin, rcos);
FPx := FPx + vars[3] * (rsin * FTx - rcos * FTy);
FPy := FPy + vars[3] * (rcos * FTx + rsin * FTy);
end; end;
//--4--//////////////////////////////////////////////////////////////////////// //--4--////////////////////////////////////////////////////////////////////////
procedure TXForm.Horseshoe; procedure TXForm.Horseshoe;
//var //var
// a, c1, c2: double; // a, c1, c2: double;
begin //begin
// if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then // if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
// a := arctan2(FTx, FTy) // a := arctan2(FTx, FTy)
// else // else
// a := 0.0; // a := 0.0;
// c1 := sin(FAngle); // c1 := sin(FAngle);
// c2 := cos(FAngle); // c2 := cos(FAngle);
FPx := FPx + vars[4] * (FSinA * FTx - FCosA * FTy);
FPy := FPy + vars[4] * (FCosA* FTx + FSinA * FTy); // --Z-- he he he...
// FTx/FLength FTy/FLength
// FPx := FPx + vars[4] * (FSinA * FTx - FCosA * FTy);
// FPy := FPy + vars[4] * (FCosA* FTx + FSinA * FTy);
var
r: double;
begin
r := vars[4] / sqrt(FTx * FTx + FTy * FTy);
FPx := FPx + (FTx - FTy) * (FTx + FTy) * r;
FPy := FPy + (2*FTx*FTy) * r;
end; end;
//--5--//////////////////////////////////////////////////////////////////////// //--5--////////////////////////////////////////////////////////////////////////
@ -291,9 +313,9 @@ procedure TXForm.FoldedHandkerchief;
var var
r: double; r: double;
begin begin
r := sqrt(FTx * FTx + FTy * FTy); r := vars[6] * sqrt(FTx * FTx + FTy * FTy);
FPx := FPx + vars[6] * sin(FAngle + r) * r; FPx := FPx + sin(FAngle + r) * r;
FPy := FPy + vars[6] * cos(FAngle - r) * r; FPy := FPy + cos(FAngle - r) * r;
end; end;
//--7--//////////////////////////////////////////////////////////////////////// //--7--////////////////////////////////////////////////////////////////////////
@ -301,10 +323,10 @@ procedure TXForm.Heart;
var var
r: double; r: double;
begin begin
r := sqrt(FTx * FTx + FTy * FTy); r := vars[7] * sqrt(FTx * FTx + FTy * FTy);
FPx := FPx + vars[7] * sin(FAngle * r) * r; FPx := FPx + sin(FAngle * r) * r;
FPy := FPy + vars[7] * cos(FAngle * r) * -r; FPy := FPy - cos(FAngle * r) * r;
end; end;
//--8--//////////////////////////////////////////////////////////////////////// //--8--////////////////////////////////////////////////////////////////////////
@ -313,29 +335,32 @@ const
rPI: double = 0.31830989; rPI: double = 0.31830989;
var var
nx, ny, r: double; nx, ny, r: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
nx := FTx * PI; nx := FTx * PI;
ny := FTy * PI; ny := FTy * PI;
r := sqrt(nx * nx + ny * ny); r := sqrt(nx * nx + ny * ny);
SinCos(r, sinr, cosr); SinCos(r, sinr, cosr);
FPx := FPx + vars[8] * sinr * FAngle * rPI; // FPx := FPx + vars[8] * sinr * FAngle * rPI;
FPy := FPy + vars[8] * cosr * FAngle * rPI; // FPy := FPy + vars[8] * cosr * FAngle * rPI;
r := vars[8] * FAngle * rPI;
FPx := FPx + sinr * r;
FPy := FPy + cosr * r;
end; end;
//--9--//////////////////////////////////////////////////////////////////////// //--9--////////////////////////////////////////////////////////////////////////
procedure TXForm.Spiral; procedure TXForm.Spiral;
var var
r, rr: double; r, rr: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
// r := sqrt(FTx * FTx + FTy * FTy) + 1E-6; // r := sqrt(FTx * FTx + FTy * FTy) + 1E-6;
r := Flength + 1E-6; r := Flength + 1E-6;
rr := 1 / r; rr := vars[9] / r;
SinCos(r, sinr, cosr); SinCos(r, sinr, cosr);
FPx := FPx + vars[9] * (FCosA + sinr) * rr; FPx := FPx + (FCosA + sinr) * rr;
FPy := FPy + vars[9] * (FsinA - cosr) * rr; FPy := FPy + (FsinA - cosr) * rr;
end; end;
//--10--/////////////////////////////////////////////////////////////////////// //--10--///////////////////////////////////////////////////////////////////////
@ -364,10 +389,10 @@ end;
procedure TXForm.Square; procedure TXForm.Square;
var var
// r: double; // r: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
// r := sqrt(FTx * FTx + FTy * FTy); // r := sqrt(FTx * FTx + FTy * FTy);
SinCos(Flength, sinr, cosr); SinCos(FLength, sinr, cosr);
FPx := FPx + vars[11] * FSinA * cosr; FPx := FPx + vars[11] * FSinA * cosr;
FPy := FPy + vars[11] * FCosA * sinr; FPy := FPy + vars[11] * FCosA * sinr;
end; end;
@ -376,7 +401,7 @@ end;
procedure TXForm.Ex; procedure TXForm.Ex;
var var
r: double; r: double;
n0,n1, m0, m1: double; n0, n1, m0, m1: double;
begin begin
r := sqrt(FTx * FTx + FTy * FTy); r := sqrt(FTx * FTx + FTy * FTy);
n0 := sin(FAngle + r); n0 := sin(FAngle + r);
@ -391,13 +416,13 @@ end;
procedure TXForm.Julia; procedure TXForm.Julia;
var var
a,r: double; a,r: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
r := Math.power(FTx * FTx + FTy * FTy, 0.25);
a := FAngle*0.5 + Trunc(random * 2) * PI; a := FAngle*0.5 + Trunc(random * 2) * PI;
SinCos(a, sinr, cosr); SinCos(a, sinr, cosr);
FPx := FPx + vars[13] * r * cosr; r := vars[13] * sqrt(sqrt(FTx * FTx + FTy * FTy)); //Math.power(FTx * FTx + FTy * FTy, 0.25);
FPy := FPy + vars[13] * r * sinr; FPx := FPx + r * cosr;
FPy := FPy + r * sinr;
end; end;
//--14--/////////////////////////////////////////////////////////////////////// //--14--///////////////////////////////////////////////////////////////////////
@ -417,6 +442,7 @@ end;
//--15--/////////////////////////////////////////////////////////////////////// //--15--///////////////////////////////////////////////////////////////////////
procedure TXForm.Waves; procedure TXForm.Waves;
{
var var
dx,dy,nx,ny: double; dx,dy,nx,ny: double;
begin begin
@ -426,12 +452,16 @@ begin
ny := FTy + c11 * sin(FTx / ((dy * dy) + EPS)); ny := FTy + c11 * sin(FTx / ((dy * dy) + EPS));
FPx := FPx + vars[15] * nx; FPx := FPx + vars[15] * nx;
FPy := FPy + vars[15] * ny; FPy := FPy + vars[15] * ny;
}
begin
FPx := FPx + vars[15] * (FTx + c10 * sin(FTy / ((c20 * c20) + EPS)));
FPy := FPy + vars[15] * (FTy + c11 * sin(FTx / ((c21 * c21) + EPS)));
end; end;
//--16--/////////////////////////////////////////////////////////////////////// //--16--///////////////////////////////////////////////////////////////////////
procedure TXForm.Fisheye; procedure TXForm.Fisheye;
var var
{ a,} r: double; r: double;
begin begin
{ {
// r := sqrt(FTx * FTx + FTy * FTy); // r := sqrt(FTx * FTx + FTy * FTy);
@ -442,9 +472,10 @@ begin
FPy := FPy + vars[16] * r * FSinA; FPy := FPy + vars[16] * r * FSinA;
} }
// --Z-- and again, sin & cos are NOT necessary here: // --Z-- and again, sin & cos are NOT necessary here:
r := 2 / (sqrt(FTx * FTx + FTy * FTy) + 1); r := 2 * vars[16] / (sqrt(FTx * FTx + FTy * FTy) + 1);
FPx := FPx + vars[16] * r * FTy; // by the way, now we can clearly see that the original author messed X and Y:
FPy := FPy + vars[16] * r * FTx; FPx := FPx + r * FTy;
FPy := FPy + r * FTx;
end; end;
@ -452,7 +483,7 @@ end;
procedure TXForm.Popcorn; procedure TXForm.Popcorn;
var var
dx, dy: double; dx, dy: double;
nx, ny: double; // nx, ny: double;
begin begin
dx := tan(3 * FTy); dx := tan(3 * FTy);
if (dx <> dx) then if (dx <> dx) then
@ -460,24 +491,24 @@ begin
dy := tan(3 * FTx); // NAN will raise an exception... dy := tan(3 * FTx); // NAN will raise an exception...
if (dy <> dy) then if (dy <> dy) then
dy := 0.0; // remove for speed? dy := 0.0; // remove for speed?
nx := FTx + c20 * sin(dx); // nx := FTx + c20 * sin(dx);
ny := FTy + c21 * sin(dy); // ny := FTy + c21 * sin(dy);
FPx := FPx + vars[17] * nx; // FPx := FPx + vars[17] * nx;
FPy := FPy + vars[17] * ny; // FPy := FPy + vars[17] * ny;
FPx := FPx + vars[17] * (FTx + c20 * sin(dx));
FPy := FPy + vars[17] * (FTy + c21 * sin(dy));
end; end;
//--18--/////////////////////////////////////////////////////////////////////// //--18--///////////////////////////////////////////////////////////////////////
procedure TXForm.Exponential; procedure TXForm.Exponential;
var var
dx, dy: double; d: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
dx := exp(FTx - 1); // exp(FTx)/ 2.718281828459045; SinCos(PI * FTy, sinr, cosr);
// --Z-- (e^x)/e = e^(x-1), isn't it?! d := vars[18] * exp(FTx - 1); // --Z-- (e^x)/e = e^(x-1), isn't it?!
dy := PI * FTy; FPx := FPx + cosr * d;
SinCos(dy, sinr, cosr); FPy := FPy + sinr * d;
FPx := FPx + vars[18] * cosr * dx;
FPy := FPy + vars[18] * sinr * dx;
end; end;
//--19--/////////////////////////////////////////////////////////////////////// //--19--///////////////////////////////////////////////////////////////////////
@ -488,24 +519,26 @@ var
begin begin
// r := sqrt(FTx * FTx + FTy * FTy); // r := sqrt(FTx * FTx + FTy * FTy);
// sa := sin(FAngle); // sa := sin(FAngle);
r := Math.Power(FLength, FSinA); r := vars[19] * Math.Power(FLength, FSinA);
// nx := r * FCosA; // nx := r * FCosA;
// ny := r * FSinA; // ny := r * FSinA;
FPx := FPx + vars[19] * r * FCosA; FPx := FPx + r * FCosA;
FPy := FPy + vars[19] * r * FSinA; FPy := FPy + r * FSinA;
end; end;
//--20--/////////////////////////////////////////////////////////////////////// //--20--///////////////////////////////////////////////////////////////////////
procedure TXForm.Cosine; procedure TXForm.Cosine;
var var
nx, ny: double; // nx, ny: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
SinCos(FTx * PI, sinr, cosr); SinCos(FTx * PI, sinr, cosr);
nx := cosr * cosh(FTy); // nx := cosr * cosh(FTy);
ny := -sinr * sinh(FTy); // ny := -sinr * sinh(FTy);
FPx := FPx + vars[20] * nx; // FPx := FPx + vars[20] * nx;
FPy := FPy + vars[20] * ny; // FPy := FPy + vars[20] * ny;
FPx := FPx + vars[20] * cosr * cosh(FTy);
FPy := FPy - vars[20] * sinr * sinh(FTy);
end; end;
//--21--/////////////////////////////////////////////////////////////////////// //--21--///////////////////////////////////////////////////////////////////////
@ -513,14 +546,21 @@ procedure TXForm.Rings;
var var
r: double; r: double;
dx: double; dx: double;
sinr, cosr: extended; // sinr, cosr: extended;
begin begin
dx := sqr(c20) + EPS; dx := sqr(c20) + EPS;
r := FLength; // r := FLength;
r := r + dx - System.Int((r + dx)/(2 * dx)) * 2 * dx - dx + r * (1-dx); // r := r + dx - System.Int((r + dx)/(2 * dx)) * 2 * dx - dx + r * (1-dx);
SinCos(FAngle, sinr, cosr); // --Z-- ^^^^ heheeeee :-) ^^^^
FPx := FPx + vars[21] * r * cosr;
FPy := FPy + vars[21] * r * sinr; // SinCos(FAngle, sinr, cosr);
// FPx := FPx + vars[21] * r * cosr;
// FPy := FPy + vars[21] * r * sinr;
r := vars[21] * (
2 * FLength + dx * (System.Int(FLength/(2 * dx) + 0.5) * 2 - FLength)
);
FPx := FPx + r * FCosA;
FPy := FPy + r * FSinA;
end; end;
//--22--/////////////////////////////////////////////////////////////////////// //--22--///////////////////////////////////////////////////////////////////////
@ -528,13 +568,13 @@ procedure TXForm.Fan;
var var
r,t,a : double; r,t,a : double;
dx, dy, dx2: double; dx, dy, dx2: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
dy := c21; dy := c21;
dx := PI * (sqr(c20) + EPS); dx := PI * (sqr(c20) + EPS);
dx2 := dx/2; dx2 := dx/2;
r := sqrt(FTx * FTx + FTy * FTy); r := vars[22] * sqrt(FTx * FTx + FTy * FTy);
t := FAngle+dy - System.Int((FAngle + dy)/dx) * dx; t := FAngle+dy - System.Int((FAngle + dy)/dx) * dx;
if (t > dx2) then if (t > dx2) then
@ -543,8 +583,8 @@ begin
a := FAngle + dx2; a := FAngle + dx2;
SinCos(a, sinr, cosr); SinCos(a, sinr, cosr);
FPx := FPx + vars[22] * r * cosr; FPx := FPx + r * cosr;
FPy := FPy + vars[22] * r * sinr; FPy := FPy + r * sinr;
end; end;
@ -553,7 +593,7 @@ procedure TXForm.Triblob;
var var
r : double; r : double;
Angle: double; Angle: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
r := sqrt(FTx * FTx + FTy * FTy); r := sqrt(FTx * FTx + FTy * FTy);
if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
@ -573,7 +613,7 @@ procedure TXForm.Daisy;
var var
r : double; r : double;
Angle: double; Angle: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
r := sqrt(FTx * FTx + FTy * FTy); r := sqrt(FTx * FTx + FTy * FTy);
if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
@ -608,7 +648,7 @@ procedure TXForm.CRot;
var var
r : double; r : double;
Angle: double; Angle: double;
sinr, cosr: extended; sinr, cosr: double;
begin begin
r := sqrt(FTx * FTx + FTy * FTy); r := sqrt(FTx * FTx + FTy * FTy);
if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
@ -1113,7 +1153,7 @@ begin
result := Format(' <xform weight="%g" color="%g" symmetry="%g" ', [density, color, symmetry]); result := Format(' <xform weight="%g" color="%g" symmetry="%g" ', [density, color, symmetry]);
for i := 0 to nrvar - 1 do begin for i := 0 to nrvar - 1 do begin
if vars[i] <> 0 then if vars[i] <> 0 then
Result := Result + varnames(i) + format('="%f" ', [vars[i]]); Result := Result + varnames(i) + format('="%g" ', [vars[i]]);
end; end;
Result := Result + Format('coefs="%g %g %g %g %g %g" ', [c[0,0], c[0,1], c[1,0], c[1,1], c[2,0], c[2,1]]); Result := Result + Format('coefs="%g %g %g %g %g %g" ', [c[0,0], c[0,1], c[1,0], c[1,1], c[2,0], c[2,1]]);
// Result := Result + Format('post="%g %g %g %g %g %g" ', [p[0,0], p[0,1], p[1,0], p[1,1], p[2,0], p[2,1]]); // Result := Result + Format('post="%g %g %g %g %g %g" ', [p[0,0], p[0,1], p[1,0], p[1,1], p[2,0], p[2,1]]);