コード例 #1
0
        public void writeX3DAngles(Scientrace.Object3dEnvironment env, StringBuilder retsb)
        {
            Scientrace.Location tloc;
            foreach (Scientrace.Angle angle in this.angles)
            {
                tloc = angle.getLocation();
                Scientrace.X3DGridPoint x3dgp = new Scientrace.X3DGridPoint(env, tloc,
                                                                            tloc + angle.intersection.enter.flatshape.plane.u.toUnitVector().toLocation() * (env.radius / 100),
                                                                            tloc + angle.intersection.enter.flatshape.plane.v.toUnitVector().toLocation() * (env.radius / 100));
                //Console.WriteLine("Writing spot "+angle.ToString()+" to X3D");
                if (this.drawInteractionPlanes)
                {
                    retsb.Append(x3dgp.exportX3DnosphereRGB("1 1 0"));
                }
                if (this.drawInteractionNormals)
                {
                    retsb.Append(X3DGridPoint.get_RGBA_Line_XML(tloc, tloc + angle.intersection.enter.flatshape.plane.getNorm().negative() * 0.125, "1 0 1 0.4"));
                }
                retsb.Append(@"
<Transform scale='" + (env.radius / 1250).ToString() + " " + (env.radius / 1250).ToString() + " " + (env.radius / 1250).ToString() + @"' translation='" + angle.getLocation().trico() + @"'>
<Shape>
<Sphere /> 
<Appearance>
<Material emissiveColor='0 1 0' transparency='" + (1 - angle.fromTrace.intensity) + @"' /><!--angle-->
</Appearance> 
</Shape>
</Transform> ");
            }
        }
コード例 #2
0
ファイル: Sphere.cs プロジェクト: xiaohuangyu/scientrace
        public override string exportX3D(Scientrace.Object3dEnvironment env)
        {
            System.Text.StringBuilder retx3d = new System.Text.StringBuilder("<!-- SPHERE GRID start -->", 10000);

            Scientrace.Location     tNodeLoc;
            Scientrace.Location     tMerConnectLoc;
            Scientrace.Location     tLatConnectLoc;
            Scientrace.X3DGridPoint tGridPoint;

            for (int ic = 0; ic <= this.x3d_circles_of_latitude; ic++)    //0-pi
            {
                for (int im = 0; im < this.x3d_meridians; im++)           //0-2pi

                {
                    tNodeLoc       = this.getNodeLoc(ic, im);
                    tMerConnectLoc =
                        (ic > 0 && ic < this.x3d_meridians) ?                 // do not connect "points" located at north and south pole
                        this.getNodeLoc(ic, (im + 1) % this.x3d_meridians)
                                                : null;
                    tLatConnectLoc = this.getNodeLoc(ic + 1, im);

                    // a gridpoint has a location and two neighbour location to which to connect to
                    tGridPoint = new Scientrace.X3DGridPoint(env, tNodeLoc,
                                                             tMerConnectLoc, tLatConnectLoc);
                    retx3d.AppendLine(tGridPoint.exportX3DnosphereRGBA("0.4 0.8 0 1"));
                }
            }
            retx3d.Append("<!-- Sphere grid end -->");
            return(retx3d.ToString());
        }         //end string exportX3D(env)
コード例 #3
0
        public StringBuilder drawSphereSlice(Scientrace.Object3d drawnObject3d, double lateral_circles, double meridians,
                                             Scientrace.Sphere sphere, double from_radians, double to_radians,
                                             Scientrace.UnitVector sliceAlongDirection)
        {
            System.Text.StringBuilder retx3d = new System.Text.StringBuilder(1024);    //"<!-- DOUBLECONVEXLENS GRID start -->");
            double        pi2           = Math.PI * 2;
            NonzeroVector orthoBaseVec1 = null;
            NonzeroVector orthoBaseVec2 = null;

            sliceAlongDirection.fillOrtogonalVectors(ref orthoBaseVec1, ref orthoBaseVec2);

            for (double iSphereCircle = 2 * lateral_circles; iSphereCircle > 0; iSphereCircle--)     // the rings/parallels along the sliceAlongDirection axis
            {
                double lateral_radians  = (to_radians * (iSphereCircle / (2 * lateral_circles)));
                double circle2DRadius   = sphere.radius * Math.Sin(lateral_radians);
                double circle2DDistance = sphere.radius * Math.Cos(lateral_radians);
                retx3d.Append(this.drawCircle(sphere.loc + (sliceAlongDirection * circle2DDistance).toLocation(), circle2DRadius, sliceAlongDirection));

                for (double iSphereMerid = 0.5; iSphereMerid < 2 * meridians; iSphereMerid++)         // meridians connect the rings/circles on the spherical surface

                {
                    Scientrace.Location tNodeLoc = sphere.getSphericalLoc(
                        orthoBaseVec1, orthoBaseVec2,
                        sliceAlongDirection,
                        to_radians * (iSphereCircle / (2 * lateral_circles)),              // lat_angle = theta
                        pi2 * (iSphereMerid / (2 * meridians))                             // mer_angle = phi
                        );
                    if (!tNodeLoc.isValid())
                    {
                        throw new NullReferenceException("Cannot calculate base gridpoint at @ " + drawnObject3d.tag);
                    }
                    Scientrace.Location tLatConnectLoc = sphere.getSphericalLoc(
                        orthoBaseVec1, orthoBaseVec2,
                        sliceAlongDirection,
                        to_radians * ((iSphereCircle - 1) / (2 * lateral_circles)),          // lat_angle = theta
                        pi2 * ((iSphereMerid) / (2 * meridians))                             // mer_angle = phi
                        );
                    if (!tLatConnectLoc.isValid())
                    {
                        throw new NullReferenceException("Cannot calculate lateral gridpoint at @ " + drawnObject3d.tag);
                    }

                    Scientrace.X3DGridPoint tGridPoint = new Scientrace.X3DGridPoint(0, tNodeLoc, null, tLatConnectLoc);
                    retx3d.AppendLine(tGridPoint.exportX3DnosphereRGB(this.primaryRGB));
                }
            }                      // end for iSphereCircle / iSphereMerid
            return(retx3d);
        }
コード例 #4
0
ファイル: X3DShapeDrawer.cs プロジェクト: JoepBC/scientrace
        public StringBuilder drawSphereSlice(Scientrace.Object3d drawnObject3d, double lateral_circles, double meridians,
										Scientrace.Sphere sphere, double from_radians, double to_radians, 
										Scientrace.UnitVector sliceAlongDirection)
        {
            System.Text.StringBuilder retx3d = new System.Text.StringBuilder(1024);//"<!-- DOUBLECONVEXLENS GRID start -->");
            double pi2 = Math.PI*2;
            NonzeroVector orthoBaseVec1 = null;
            NonzeroVector orthoBaseVec2 = null;
            sliceAlongDirection.fillOrtogonalVectors(ref orthoBaseVec1, ref orthoBaseVec2);

            for (double iSphereCircle = 2*lateral_circles; iSphereCircle > 0; iSphereCircle--) { // the rings/parallels along the sliceAlongDirection axis
            double lateral_radians = (to_radians * (iSphereCircle / (2*lateral_circles)));
            double circle2DRadius = sphere.radius*Math.Sin(lateral_radians);
            double circle2DDistance = sphere.radius*Math.Cos(lateral_radians);
            retx3d.Append(this.drawCircle(sphere.loc+(sliceAlongDirection*circle2DDistance).toLocation(), circle2DRadius, sliceAlongDirection));

            for (double iSphereMerid = 0.5; iSphereMerid < 2*meridians; iSphereMerid++) { // meridians connect the rings/circles on the spherical surface

                Scientrace.Location tNodeLoc = sphere.getSphericalLoc(
                            orthoBaseVec1, orthoBaseVec2,
                            sliceAlongDirection,
                            to_radians * (iSphereCircle / (2*lateral_circles)), // lat_angle = theta
                            pi2 * (iSphereMerid/(2*meridians)) // mer_angle = phi
                            );
                if (!tNodeLoc.isValid())
                    throw new NullReferenceException("Cannot calculate base gridpoint at @ "+drawnObject3d.tag);
                Scientrace.Location tLatConnectLoc = sphere.getSphericalLoc(
                            orthoBaseVec1, orthoBaseVec2,
                            sliceAlongDirection,
                            to_radians * ((iSphereCircle-1) / (2*lateral_circles)), // lat_angle = theta
                            pi2 * ((iSphereMerid)/(2*meridians)) // mer_angle = phi
                            );
                if (!tLatConnectLoc.isValid())
                    throw new NullReferenceException("Cannot calculate lateral gridpoint at @ "+drawnObject3d.tag);

                Scientrace.X3DGridPoint tGridPoint = new Scientrace.X3DGridPoint(0, tNodeLoc, null, tLatConnectLoc);
                retx3d.AppendLine(tGridPoint.exportX3DnosphereRGB(this.primaryRGB));
                }} // end for iSphereCircle / iSphereMerid
            return retx3d;
        }
コード例 #5
0
ファイル: PlanoConvexLens.cs プロジェクト: JoepBC/scientrace
        public override string exportX3D(Scientrace.Object3dEnvironment env)
        {
            Scientrace.Location h1 = this.planoCenterLoc();
            double r = this.sphereRadius;
            double x = this.getLensRadius();
            double lensRadians = Math.Asin(x/r);

            NonzeroVector baseVecZ = this.lensPlane.getNormal();
            NonzeroVector baseVec1 = null;
            NonzeroVector baseVec2 = null;
            baseVecZ.fillOrtogonalVectors(ref baseVec1, ref baseVec2);

            double lat_circles = 3;
            double meridians = 12;

            System.Text.StringBuilder retx3d = new System.Text.StringBuilder("<!-- PLANOCONVEXLENS GRID start -->", 1024);
            retx3d.Append("\t<!-- Plano part -->" );

            Scientrace.Location tNodeLoc;
            Scientrace.Location tMerConnectLoc;
            Scientrace.Location tLatConnectLoc;
            Scientrace.X3DGridPoint tGridPoint;
            double pi2 = Math.PI*2;

            for (double iPlaneCircle = lat_circles; iPlaneCircle > 0; iPlaneCircle--) {
            for (double iPlaneMerid = 0; iPlaneMerid < meridians; iPlaneMerid++) {
                tNodeLoc = this.constructPlaneNodeLoc(h1,
                            x*iPlaneCircle/lat_circles, pi2*iPlaneMerid/meridians,
                            baseVec1, baseVec2);
                tMerConnectLoc = this.constructPlaneNodeLoc(h1,
                            x*iPlaneCircle/lat_circles, pi2*(iPlaneMerid+1)/meridians,
                            baseVec1, baseVec2);
                tLatConnectLoc = this.constructPlaneNodeLoc(h1,
                            x*(iPlaneCircle-1)/lat_circles, pi2*iPlaneMerid/meridians,
                            baseVec1, baseVec2);
                tGridPoint = new Scientrace.X3DGridPoint(env, tNodeLoc, tMerConnectLoc, tLatConnectLoc);
                retx3d.AppendLine(tGridPoint.exportX3DnosphereRGBA("0.4 0 0.2 1"));
                }} //end for iPlaneCircles / iPlaneMerid

            retx3d.Append("\t<!-- End of plano part -->" );
            retx3d.Append("\t<!-- Convex part -->" );

            for (double iSphereCircle = 2*lat_circles; iSphereCircle > 0; iSphereCircle--) {
            for (double iSphereMerid = 0.5; iSphereMerid < 2*meridians; iSphereMerid++) {
                //double lat_angle = lensRadians * (iSphereCircle / lat_circles); // theta
                //double mer_angle = pi2 * (iSphereMerid/meridians); // mer_angle = phi
                tNodeLoc = this.constructSphereNodeLoc(
                        lensRadians * (iSphereCircle / (2*lat_circles)), // lat_angle = theta
                        pi2 * (iSphereMerid/(2*meridians)), // mer_angle = phi
                        baseVec1, baseVec2, baseVecZ);
                tMerConnectLoc = this.constructSphereNodeLoc(
                        lensRadians * (iSphereCircle / (2*lat_circles)), // lat_angle = theta
                        pi2 * ((iSphereMerid+1)/(2*meridians)), // mer_angle = phi
                        baseVec1, baseVec2, baseVecZ);
                tLatConnectLoc = this.constructSphereNodeLoc(
                        lensRadians * ((iSphereCircle-1) / (2*lat_circles)), // lat_angle = theta
                        pi2 * (iSphereMerid/(2*meridians)), // mer_angle = phi
                        baseVec1, baseVec2, baseVecZ);
                tGridPoint = new Scientrace.X3DGridPoint(env, tNodeLoc, tMerConnectLoc, tLatConnectLoc);
                retx3d.AppendLine(tGridPoint.exportX3DnosphereRGBA("0.2 0 0.4 1"));
                }} // end for iSphereCircle / iSphereMerid

                                                                                                                        retx3d.Append("\t<!-- Convex part -->" );
            retx3d.Append("\t<!-- End of Convex part -->" );
            retx3d.Append("<!-- End of PLANOCONVEXLENS GRID -->");
            return retx3d.ToString();
        }
コード例 #6
0
 public void writeX3DAngles(Scientrace.Object3dEnvironment env, StringBuilder retsb)
 {
     Scientrace.Location tloc;
     foreach (Scientrace.Angle angle in this.angles) {
     tloc = angle.getLocation();
     Scientrace.X3DGridPoint x3dgp = new Scientrace.X3DGridPoint(env, tloc,
                                         tloc+angle.intersection.enter.flatshape.plane.u.toUnitVector().toLocation()*(env.radius/100),
                                         tloc+angle.intersection.enter.flatshape.plane.v.toUnitVector().toLocation()*(env.radius/100));
     //Console.WriteLine("Writing spot "+angle.ToString()+" to X3D");
     if (this.drawInteractionPlanes) {
         retsb.Append(x3dgp.exportX3DnosphereRGB("1 1 0"));
         }
     if (this.drawInteractionNormals) {
         retsb.Append(X3DGridPoint.get_RGBA_Line_XML(tloc, tloc+angle.intersection.enter.flatshape.plane.getNorm().negative()*0.125, "1 0 1 0.4"));
         }
     retsb.Append(@"
     <Transform scale='"+(env.radius/1250).ToString()+" "+(env.radius/1250).ToString()+" "+(env.radius/1250).ToString()+@"' translation='"+angle.getLocation().trico()+@"'>
     <Shape>
     <Sphere />
     <Appearance>
     <Material emissiveColor='0 1 0' transparency='"+(1-angle.fromTrace.intensity)+@"' /><!--angle-->
     </Appearance>
     </Shape>
     </Transform> ");
     }
 }
コード例 #7
0
        public override string exportX3D(Scientrace.Object3dEnvironment env)
        {
            Scientrace.Location h1 = this.planoCenterLoc();
            double r           = this.sphereRadius;
            double x           = this.getLensRadius();
            double lensRadians = Math.Asin(x / r);

            NonzeroVector baseVecZ = this.lensPlane.getNormal();
            NonzeroVector baseVec1 = null;
            NonzeroVector baseVec2 = null;

            baseVecZ.fillOrtogonalVectors(ref baseVec1, ref baseVec2);

            double lat_circles = 3;
            double meridians   = 12;

            System.Text.StringBuilder retx3d = new System.Text.StringBuilder("<!-- PLANOCONVEXLENS GRID start -->", 1024);
            retx3d.Append("\t<!-- Plano part -->");


            Scientrace.Location     tNodeLoc;
            Scientrace.Location     tMerConnectLoc;
            Scientrace.Location     tLatConnectLoc;
            Scientrace.X3DGridPoint tGridPoint;
            double pi2 = Math.PI * 2;

            for (double iPlaneCircle = lat_circles; iPlaneCircle > 0; iPlaneCircle--)
            {
                for (double iPlaneMerid = 0; iPlaneMerid < meridians; iPlaneMerid++)
                {
                    tNodeLoc = this.constructPlaneNodeLoc(h1,
                                                          x * iPlaneCircle / lat_circles, pi2 * iPlaneMerid / meridians,
                                                          baseVec1, baseVec2);
                    tMerConnectLoc = this.constructPlaneNodeLoc(h1,
                                                                x * iPlaneCircle / lat_circles, pi2 * (iPlaneMerid + 1) / meridians,
                                                                baseVec1, baseVec2);
                    tLatConnectLoc = this.constructPlaneNodeLoc(h1,
                                                                x * (iPlaneCircle - 1) / lat_circles, pi2 * iPlaneMerid / meridians,
                                                                baseVec1, baseVec2);
                    tGridPoint = new Scientrace.X3DGridPoint(env, tNodeLoc, tMerConnectLoc, tLatConnectLoc);
                    retx3d.AppendLine(tGridPoint.exportX3DnosphereRGBA("0.4 0 0.2 1"));
                }
            }                      //end for iPlaneCircles / iPlaneMerid

            retx3d.Append("\t<!-- End of plano part -->");
            retx3d.Append("\t<!-- Convex part -->");

            for (double iSphereCircle = 2 * lat_circles; iSphereCircle > 0; iSphereCircle--)
            {
                for (double iSphereMerid = 0.5; iSphereMerid < 2 * meridians; iSphereMerid++)
                {
                    //double lat_angle = lensRadians * (iSphereCircle / lat_circles); // theta
                    //double mer_angle = pi2 * (iSphereMerid/meridians); // mer_angle = phi
                    tNodeLoc = this.constructSphereNodeLoc(
                        lensRadians * (iSphereCircle / (2 * lat_circles)),          // lat_angle = theta
                        pi2 * (iSphereMerid / (2 * meridians)),                     // mer_angle = phi
                        baseVec1, baseVec2, baseVecZ);
                    tMerConnectLoc = this.constructSphereNodeLoc(
                        lensRadians * (iSphereCircle / (2 * lat_circles)),              // lat_angle = theta
                        pi2 * ((iSphereMerid + 1) / (2 * meridians)),                   // mer_angle = phi
                        baseVec1, baseVec2, baseVecZ);
                    tLatConnectLoc = this.constructSphereNodeLoc(
                        lensRadians * ((iSphereCircle - 1) / (2 * lat_circles)),    // lat_angle = theta
                        pi2 * (iSphereMerid / (2 * meridians)),                     // mer_angle = phi
                        baseVec1, baseVec2, baseVecZ);
                    tGridPoint = new Scientrace.X3DGridPoint(env, tNodeLoc, tMerConnectLoc, tLatConnectLoc);
                    retx3d.AppendLine(tGridPoint.exportX3DnosphereRGBA("0.2 0 0.4 1"));
                }
            }                      // end for iSphereCircle / iSphereMerid

            retx3d.Append("\t<!-- Convex part -->");
            retx3d.Append("\t<!-- End of Convex part -->");
            retx3d.Append("<!-- End of PLANOCONVEXLENS GRID -->");
            return(retx3d.ToString());
        }         //end string exportX3D(env)
コード例 #8
0
ファイル: Sphere.cs プロジェクト: JoepBC/scientrace
        public override string exportX3D(Scientrace.Object3dEnvironment env)
        {
            System.Text.StringBuilder retx3d = new System.Text.StringBuilder("<!-- SPHERE GRID start -->", 10000);

            Scientrace.Location tNodeLoc;
            Scientrace.Location tMerConnectLoc;
            Scientrace.Location tLatConnectLoc;
            Scientrace.X3DGridPoint tGridPoint;

            for (int ic = 0; ic <= this.x3d_circles_of_latitude; ic++) { //0-pi
            for (int im = 0; im < this.x3d_meridians; im++) { //0-2pi

                tNodeLoc = this.getNodeLoc(ic, im);
                tMerConnectLoc =
                    (ic > 0 && ic < this.x3d_meridians) ? // do not connect "points" located at north and south pole
                        this.getNodeLoc(ic, (im+1)%this.x3d_meridians)
                        : null;
                tLatConnectLoc = this.getNodeLoc(ic+1, im);

                // a gridpoint has a location and two neighbour location to which to connect to
                tGridPoint = new Scientrace.X3DGridPoint(env, tNodeLoc,
                    tMerConnectLoc, tLatConnectLoc);
                retx3d.AppendLine(tGridPoint.exportX3DnosphereRGBA("0.4 0.8 0 1"));
                }}
            retx3d.Append("<!-- Sphere grid end -->");
            return retx3d.ToString();
        }
コード例 #9
0
        public override string exportX3D(Scientrace.Object3dEnvironment env)
        {
            int steps = this.exportX3Dgridsteps;

            Scientrace.AbstractGridBorder cborder = this.cborder;
//		Scientrace.VectorTransform cbordertrf = cborder.getTransform();
            //Generate a rotating grid!
            Scientrace.VectorTransform cbordertrf = cborder.getGridTransform(this.zaxis);
            //Console.WriteLine("CBTRFcp: "+cbordertrf.ToCompactString());

            /*
             * stloc: starting location actually representing the center of the border,
             * from there in the orthonormal direction of this border the collision points with
             * the parabolic mirror will be found (from -radius to +radius in both transform-directions
             */
            Scientrace.Location            stloc = cborder.getOrthoStartCenterLoc();// - cborder.getOthoDirection();
            Scientrace.IntersectionPoint[] iparr, iparre, iparrs;
            Scientrace.Intersection        cintr, eintr, sintr;

            /*
             * eloc is the location "east" of the current node, sloc "south" for drawing a grid
             * of course are terms east and south symbolic
             */
            Scientrace.Location eloc, sloc;
            Scientrace.Line     cline, eline, sline;
            //double r = cborder.getRadius();
            double r1 = cborder.getURadius();
            double r2 = cborder.getVRadius();

            Scientrace.Vector v1     = cbordertrf.u.tryToUnitVector().toVector();
            Scientrace.Vector v2     = cbordertrf.v.tryToUnitVector().toVector();;
            string            retstr = "";

            Scientrace.X3DGridPoint concentrationpoint = new Scientrace.X3DGridPoint(env, this.getConcentrationPoint(), null, null);
            retstr  = concentrationpoint.x3DSphere(env.radius / 1000, "1 0 1", 0.5);
            retstr += concentrationpoint.x3DLineTo(this.loc, "1 0 1 1");
            for (double ix = 0.5; ix < steps; ix++)
            {
                for (double iy = 0.5; iy <= steps; iy++)
                {
                    /* Drawing a grid of lines in direction "border.orthodirection" to ParabolicMirror,
                     * at every intersection a gridpoint is located. "cline" are those ortho-dir lines */
                    cline = new Scientrace.Line(((stloc - (v1 * r1) - (v2 * r2)) + (v1 * (r1 * 2 * (ix / steps))) + (v2 * (r2 * 2 * (iy / steps)))).toLocation(),
                                                cborder.getOrthoDirection());
//											cborder.directionlength.toUnitVector());

                    /* USE THE "checkborder = false" function below to always
                     * show the grid-points, also outside borders
                     * iparr is the IntersectionPoint at the Parabolic Mirror for the current ix/iy iteration */
                    iparr = this.realIntersections(cline, true);

/* DEBUG INFO	foreach (IntersectionPoint ip in iparr) {
 *                                      if (ip!=null) {
 *                                              Console.WriteLine("IP AT: "+ip.ToString());
 *                                              } else {
 *                                              Console.WriteLine("NO IP FROM: "+((stloc-(v1*r)-(v2*r))+(v1*(r*2*(ix/steps)))+(v2*(r*2*(iy/steps))))
 +" AND "+cborder.getOrthoDirection());
 *                                              }
 *                                      }*/
                    eline = new Scientrace.Line(((stloc - (v1 * r1) - (v2 * r2)) + (v1 * (r1 * 2 * ((ix + 1) / steps))) + (v2 * (r2 * 2 * (iy / steps)))).toLocation(),
                                                cborder.getOrthoDirection());
//											cborder.directionlength.toUnitVector());
                    iparre = this.realIntersections(eline, true);
                    //defining "east" neighbour
                    eintr = new Intersection(eline, iparre, this);
                    if (eintr.intersects)
                    {
                        eloc = eintr.enter.loc;
                    }
                    else
                    {
                        eloc = null;
                    }
                    sline = new Scientrace.Line(((stloc - (v1 * r1) - (v2 * r2)) + (v1 * (r1 * 2 * ((ix) / steps))) + (v2 * (r2 * 2 * ((iy + 1) / steps)))).toLocation(),
                                                cborder.getOrthoDirection());
//											cborder.directionlength.toUnitVector());
                    iparrs = this.realIntersections(sline, true);
                    //defining "south" neighbour
                    sintr = new Intersection(sline, iparrs, this);
                    if (sintr.intersects)
                    {
                        sloc = sintr.enter.loc;
                    }
                    else
                    {
                        sloc = null;
                    }

                    /* "central" point
                     * where does line "cline" with intersections "iparr" intersect this object?
                     */
                    cintr = new Intersection(cline, iparr, this, true);
                    if (cintr.intersects)               //add existing gridpoints
                    {
                        if (this.x3dgridspheres)
                        {
                            retstr = retstr + new X3DGridPoint(env, cintr.enter.loc, eloc, sloc).exportX3D();
                        }
                        else
                        {
                            retstr = retstr + new X3DGridPoint(env, cintr.enter.loc, eloc, sloc).exportX3DnosphereRGBA("0 0 1 1");
                        }
                    }
                }
            }
            //Console.WriteLine("!!!"+retstr);
            return(retstr + cborder.exportX3D(env));
        }