comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » drawing a shaded sphere
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Return to the default flat view Create a new topic Submit Reply
drawing a shaded sphere [message #11425] Mon, 06 April 1998 00:00
boccio is currently offline  boccio
Messages: 10
Registered: November 1994
Junior Member
The IDL code at the end of this message when saved as a file cosmic.pro
will plot the trajectory of a cosmic ray in the earth's magnetic field in
3 dimensions. It plots the trajectory as it is happening(not at the end),
which is the way one should do during a simulation.

I would like to draw a shaded sphere (even better a sphere with earth map
on its surface) of radius rearth so that the subsequent cosmic ray trajectory
in the earth's magnetic field appears properly in relation to that sphere.

We are in the process of switching from MATLAB to IDL and I am
converting a large number of teaching programs.

I have a routine that draws the sphere (from the POLYSHADE help) when I
use it as a separate program.

Sphere.pro code:
^^^^^^^^^^^^^^^^
SPHERE = FLTARR(20, 20, 20)
FOR X=0,19 DO FOR Y=0,19 DO FOR Z=0,19 DO $
SPHERE(X, Y, Z) = SQRT((X-10)^2 + (Y-10)^2 + (Z-10)^2)
SHADE_VOLUME, SPHERE, 8, V, P
SCALE3, XRANGE=[0,20], YRANGE=[0,20], ZRANGE=[0,20]
image = POLYSHADE(V, P, /T3D) ;Render the image.
TV, image

But when I try to insert it into the cosmic.pro code
I get all kinds of conflicts between the shade_volume, scale3 and
polyshade routines and the routines I am using in cosmic.pro.

I am not experienced enough with the IDL 3-D stuff yet to figure out how
to do it.

This easy to do in MATLAB and I am sure it is just as easy to do in IDL.

Section of the old MATLAB program:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
load topo
[X,Y,Z]=sphere(24);
X=rearth*X;
Y=rearth*Y;
Z=rearth*Z;
q=surface(X,Y,Z,'FaceColor','texture','CData',topo);
rotate(q,[0 90],-45,[0 0 0]);
view(-135,25);
colormap(topomap1);

Any ideas would be helpful.

Thanks,

John Boccio
Department of Physics
Swarthmore College
boccio@swarthmore.edu

Cosmic ray trajectory code:
^^^^^^^^^^^^^^^^^^^^^^^^^^^
function accelx,alpha,r,x,y,z,vx,vy,vz
return,(alpha/r^5)*((2.0*z*z-x*x-y*y)*vy-3.0*y*z*vz)
end

function accely,alpha,r,x,y,z,vx,vy,vz
return,(alpha/r^5)*(3.0*x*z*vz-(2.0*z*z-x*x-y*y)*vx)
end

function accelz,alpha,r,x,y,z,vx,vy,vz
return,3.0*(alpha/r^5)*z*(y*vx-x*vy)
end

pro cosmic
rearth=6.4E6
x=3.0*rearth
vx=-0.9E4
y=3.0*rearth
vy=-0.9E4
z=0.0
vz=-2.9E4
h=2.0
window,0,xsize=500,ysize=500, title='Cosmic Rays'
red=[0,1,1,0,0,1]
green=[0,1,0,1,0,1]
blue=[0,1,0,0,1,0]
tvlct, 255*red,255*green,255*blue
surface,fltarr(2,2),/nodata,/save,xtitle='X', $
ytitle='Y',ztitle='Z', $
xrange=[-3.0*rearth,3.0*rearth],yrange=[-3.0*rearth,3.0*rear th], $
zrange=[-3.0*rearth,3.0*rearth],az=60.0,ax=30.0
x1=[x,x]
y1=[y,y]
z1=[z,z]
plots,x1,y1,z1,psym=3,color=2,/t3d
alpha=1.0E20
r=sqrt(x*x+y*y+z*z)
count=0L
while ((r GT rearth) AND (count LT 200000) AND (r LT 6*rearth)) do begin
count=count+1
fx1=vx
gx1=accelx(alpha,r,x,y,z,vx,vy,vz)
fy1=vy
gy1=accely(alpha,r,x,y,z,vx,vy,vz)
fz1=vz
gz1=accelz(alpha,r,x,y,z,vx,vy,vz)
fx2=vx+h*gx1/2.0
gx2=accelx(alpha,r,x+h*fx1/2.0,y+h*fy1/2.0,z+h*fz1/2.0, $
vx+h*gx1/2.0,vy+h*gy1/2.0,vz+h*gz1/2.0)
fy2=vy+h*gy1/2.0
gy2=accely(alpha,r,x+h*fx1/2.0,y+h*fy1/2.0,z+h*fz1/2.0, $
vx+h*gx1/2.0,vy+h*gy1/2.0,vz+h*gz1/2.0)
fz2=vz+h*gz1/2.0
gz2=accelz(alpha,r,x+h*fx1/2.0,y+h*fy1/2.0,z+h*fz1/2.0, $
vx+h*gx1/2.0,vy+h*gy1/2.0,vz+h*gz1/2.0)
fx3=vx+h*gx2/2.0
gx3=accelx(alpha,r,x+h*fx2/2.0,y+h*fy2/2.0,z+h*fz2/2.0, $
vx+h*gx2/2.0,vy+h*gy2/2.0,vz+h*gz2/2.0)
fy3=vy+h*gy2/2.0
gy3=accely(alpha,r,x+h*fx2/2.0,y+h*fy2/2.0,z+h*fz2/2.0, $
vx+h*gx2/2.0,vy+h*gy2/2.0,vz+h*gz2/2.0)
fz3=vz+h*gz2/2.0
gz3=accelz(alpha,r,x+h*fx2/2.0,y+h*fy2/2.0,z+h*fz2/2.0, $
vx+h*gx2/2.0,vy+h*gy2/2.0,vz+h*gz2/2.0)
fx4=vx+h*gx3
gx4=accelx(alpha,r,x+h*fx3,y+h*fy3,z+h*fz3,vx+h*gx3, $
vy+h*gy3,vz+h*gz3)
fy4=vy+h*gy3
gy4=accely(alpha,r,x+h*fx3,y+h*fy3,z+h*fz3,vx+h*gx3, $
vy+h*gy3,vz+h*gz3)
fz4=vz+h*gz3
gz4=accelz(alpha,r,x+h*fx3,y+h*fy3,z+h*fz3,vx+h*gx3, $
vy+h*gy3,vz+h*gz3)
x=x+h*(fx1+2.0*fx2+2.0*fx3+fx4)/6.0
vx=vx+h*(gx1+2.0*gx2+2.0*gx3+gx4)/6.0
y=y+h*(fy1+2.0*fy2+2.0*fy3+fy4)/6.0
vy=vy+h*(gy1+2.0*gy2+2.0*gy3+gy4)/6.0
z=z+h*(fz1+2.0*fz2+2.0*fz3+fz4)/6.0
vz=vz+h*(gz1+2.0*gz2+2.0*gz3+gz4)/6.0
r=sqrt(x*x+y*y+z*z)
x1=[x,x]
y1=[y,y]
z1=[z,z]
plots,x1,y1,z1,psym=3,color=2,/t3d
endwhile
end
[Message index]
 
Read Message
Previous Topic: Re: How do you sort an array in IDL?
Next Topic: looking for routine that will display a ticking clock

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Sat Oct 11 04:02:56 PDT 2025

Total time taken to generate the page: 1.76631 seconds