-1

I am trying to trace out a rectangular area on the surface of a sphere.

This is the code I have for the sphere:

import numpy as np
import random as rand
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()

ax = fig.gca(projection='3d')

ax.set_aspect("equal")  

theta, phi =  np.mgrid[0:2*np.pi : 20j ,0:np.pi : 20j]

r = 6.3

x = r * np.cos(phi)*np.sin(theta)
y = r * np.sin(phi)*np.sin(theta)
z = r * np.cos(theta)

ax.plot_wireframe(x,y,z, color = "k")
plt.show()

The points will be converted from lat/long to cart coords.

lat1x = 46.49913179 * (2*np.pi/360)
lat2x = 46.4423682 * (2*np.pi/360)
long1y = -119.4049072 * (2*np.pi/360)
long2y = -119.5048141 * (2*np.pi/360)

lat3x = 46.3973998 * (2*np.pi/360)
lat4x = 46.4532495 * (2*np.pi/360)
long3y = -119.4495392 * (2*np.pi/360)
long4y = -119.3492884 * (2*np.pi/360)


xw1 = r * np.cos(lat1x)*np.cos(long1y)
yw1 = r * np.cos(lat1x)*np.sin(long1y)
zw1 = r * np.sin(lat1x)

xw2 = r * np.cos(lat2x)*np.cos(long2y)
yw2 = r * np.cos(lat2x)*np.sin(long2y)
zw2 = r * np.sin(lat2x)

xw3 = r * np.cos(lat3x)*np.cos(long3y)
yw3 = r * np.cos(lat3x)*np.sin(long3y)
zw3 = r * np.sin(lat3x)

xw4 = r * np.cos(lat4x)*np.cos(long4y)
yw4 = r * np.cos(lat4x)*np.sin(long4y)
zw4 = r * np.sin(lat4x) 

p1 = [xw1,yw1,zw1]
p2 = [xw2,yw2,zw2]
p3 = [xw3,yw3,zw3]
p4 = [xw4,yw4,zw4]

ax.scatter(p1,p2,p3,p4, color = "r")

These are the points and there conversion to cartesian coordinates I am having trouble getting them to appear on the surface of the sphere. They should also form a rough rectangular shape. I would like to be able to connect the points to draw a rectangle on the surface of the sphere. As an aside the rectangle is meant to be very small

  • 2
    "I am trying" seems to be a euphemism. Have you acutally tried anything? What does "trace out" mean in this context? Which are the coordinates to plot? How would the expected plot look like? – ImportanceOfBeingErnest Jul 25 '17 at 21:34

1 Answers1

0

Your conversion to cartesian coordinates may be wrong. Just like when creating the sphere, you might want to use the usual

enter image description here

But it will of course depend on how "lat" and "lon" are defined on the sphere.

More importantly, the scatter plot is incorrect. It's always scatter(x,y,z), first argument x coordinates, second argument y coordinates, third argument z coordinates.

import numpy as np
import random as rand
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()

ax = fig.gca(projection='3d')

ax.set_aspect("equal")  

theta, phi =  np.mgrid[0:2*np.pi : 20j ,0:np.pi : 20j]

r = 6.3

x = r * np.cos(phi)*np.sin(theta)
y = r * np.sin(phi)*np.sin(theta)
z = r * np.cos(theta)

ax.plot_wireframe(x,y,z, color = "k")


lat1x = 46.49913179 * (2*np.pi/360)
lat2x = 46.4423682 * (2*np.pi/360)
long1y = -119.4049072 * (2*np.pi/360)
long2y = -119.5048141 * (2*np.pi/360)

lat3x = 46.3973998 * (2*np.pi/360)
lat4x = 46.4532495 * (2*np.pi/360)
long3y = -119.4495392 * (2*np.pi/360)
long4y = -119.3492884 * (2*np.pi/360)

def to_cartesian(lat,lon):
    x = r * np.cos(lon)*np.sin(lat)
    y = r * np.sin(lon)*np.sin(lat)
    z = r * np.cos(lat)
    return [x,y,z]

p1 = to_cartesian(lat1x,long1y)
p2 = to_cartesian(lat2x,long2y)
p3 = to_cartesian(lat3x,long3y)
p4 = to_cartesian(lat4x,long4y)

X = np.array([p1,p2,p3,p4])
ax.scatter(X[:,0],X[:,1],X[:,2], color = "r")


plt.show()

Because the rectangle is pretty small you need to zoom in quite a bit in order to see it.

enter image description here

ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712