Fractrace.Formulas.Winkel C# (CSharp) Méthode

Winkel() public méthode

public 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 ) : double
zykl long
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 double
formula int
perspective bool
invers bool
Résultat double
        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]);
        }