public double Winkel(long zykl, double x, double y, double z, double zz,
double xd, double yd, double zd, double zzd,
double wix, double wiy, double wiz,
double jx, double jy, double jz, double jzz, int formula, bool perspective, bool invers)
{
if (perspective)
{
return 0;
/*WinkelPerspective(zykl, x, y, z, zz,
xd, yd, zd, zzd,
wix, wiy, wiz,
jx, jy, jz, jzz, formula, invers);*/
}
double m = 0, n = 0, xv = 0, yv = 0, zv = 0, winkel = 0, yn = 0, diff = 0;
double xn = 0, zn = 0, zzn = 0, xm = 0, ym = 0, zm = 0, zzm = 0;
double ox = 0, oy = 0, oz = 0, rx = 0, ry = 0, rz = 0;
double[] tief = new double[5];
double startwert = 0;
int k = 0;
int wert = 0, pu = 0;
double distance = 0.19;
n = 0;
for (k = 4; k >= 0; k--)
{
switch (k)
{
case 0: /* oben */
xn = x + distance * xd; yn = y - distance * yd;
zn = z + 2 * distance * zd; zzn = zz + 2 * distance * zzd;
break;
case 1: /* rechts */
xn = x + 2 * distance * xd; yn = y + distance * yd;
zn = z + distance * zd; zzn = zz + distance * zzd;
break;
case 2: /* unten */
xn = x - distance * xd; yn = y + distance * yd;
zn = z - 2 * distance * zd; zzn = zz - 2 * distance * zzd;
break;
case 3: /* links */
xn = x - 2 * distance * xd; yn = y - distance * yd;
zn = z - distance * zd; zzn = zz - distance * zzd;
break;
case 4: /* mitte */
xn = x; yn = y; zn = z; zzn = zz;
break;
}
zn = zn + n * zd; xn = xn - n * xd;
yn = yn + n * yd; zzn = zzn + n * zzd;
if (Rechne(xn, yn, zn, zzn, zykl, wix, wiy, wiz, jx, jy, jz, jzz, formula, invers) > 0)
{
for (m = 0; m >= -4.0; m -= 0.2)
{
zm = zn + m * zd; xm = xn - m * xd;
ym = yn + m * yd; zzm = zzn + m * zzd;
if (!(Rechne(xm, ym, zm, zzm, zykl, wix, wiy, wiz, jx, jy, jz, jzz, formula, invers) > 0))
break;
}
}
else
{
for (m = 0; m <= 4.0; m += 0.2)
{
zm = zn + m * zd; xm = xn - m * xd;
ym = yn + m * yd; zzm = zzn + m * zzd;
if (Rechne(xm, ym, zm, zzm, zykl, wix, wiy, wiz, jx, jy, jz, jzz, formula, invers) > 0) { m -= 0.2; break; }
}
}
if ((m > -3.9) && (m < 3.9))
{
startwert = m + 0.2; diff = 0.1;
while (diff >= 0.0001)
{
m = startwert - diff;
zm = zn + m * zd; xm = xn - m * xd;
ym = yn + m * yd; zzm = zzn + m * zzd;
if (0L == Rechne(xm, ym, zm, zzm, zykl, wix, wiy, wiz, jx, jy, jz, jzz, formula, invers))
startwert = m + diff;
else startwert = m;
diff /= 2.0;
}
if (k == 4)
{
n = m;
}
tief[k] = m;
}
else tief[k] = 10;
}
tief[4] = 0;
for (k = 0; k < 4; k++)
{
pu = k + 1; if (k == 3) pu = 0;
/* Die drei Punkte entsprechen tief[4] tief[k] und tief[pu] */
/* Zuerst wird tief abgezogen */
if ((tief[k] < 9) && (tief[pu] < 9) && tief[4] < 9)
{
switch (k)
{
case 0:
ox = 0.2 - tief[k]; rx = 0.4 - tief[pu];
oy = -0.2 + tief[k]; ry = 0.2 + tief[pu];
oz = 0.4 + tief[k]; rz = 0.2 + tief[pu];
break;
case 1:
ox = 0.4 - tief[k]; rx = -0.2 - tief[pu];
oy = 0.2 + tief[k]; ry = 0.2 + tief[pu];
oz = 0.2 + tief[k]; rz = -0.4 + tief[pu];
break;
case 2:
ox = -0.2 - tief[k]; rx = -0.4 - tief[pu];
oy = 0.2 + tief[k]; ry = -0.2 + tief[pu];
oz = -0.4 + tief[k]; rz = -0.2 + tief[pu];
break;
case 3:
ox = -0.4 - tief[k]; rx = 0.2 - tief[pu];
oy = -0.2 + tief[k]; ry = -0.2 + tief[pu];
oz = -0.2 + tief[k]; rz = 0.4 + tief[pu];
break;
}
/* Dann wird das Kreuzprodukt gebildet, um einen
Vergleichsvektor zu haben. */
xv = oy * rz - oz * ry;
yv = oz * rx - ox * rz;
zv = ox * ry - oy * rx;
/* Der Winkel ist nun das Skalarprodukt mit (1,-1,-1)= Lichtstrahl */
/* mit Vergleichsvektor (Beide nachträglich normiert ) */
winkel = Math.Asin((-xv + yv + zv) / (Math.Sqrt(xv * xv + yv * yv + zv * zv) * Math.Sqrt(3.0))) / Math.PI * 2.0;
// wert=(256*2.2)* (acos(winkel)/3.14159);
// if(winkel<0) winkel=-winkel;
wert = (int)(256 - (256 * winkel));
// end of wert:
//+(rand()%100)/99.;
// cout << " " << wert;
if (wert < 0) wert = -wert;
col[k] = 256 - wert;
// if (col[k]>maxcol)
// {maxcol=col[k]; cout << "max:" << maxcol << "\n";}
// if (col[k]<mincol)
// {mincol=col[k]; cout << "min:" << mincol << "\n";}
if (col[k] > 256 - 1) col[k] = 256 - 1;
if (col[k] < 1) col[k] = 1;
}
else col[k] = 1;
}
return ((int)col[0]);
}