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> "); } }
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)
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); }
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; }
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(); }
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> "); } }
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)
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(); }
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)); }