Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从等矩形投影绘制正交投影_Python_Opengl_Pygame_Map Projections - Fatal编程技术网

Python 如何从等矩形投影绘制正交投影

Python 如何从等矩形投影绘制正交投影,python,opengl,pygame,map-projections,Python,Opengl,Pygame,Map Projections,我有这样的图像: 我不知道它到底是什么样的投影,我猜是等边的还是墨卡托的。这是的纹理 我想根据两个角度(航向和俯仰)定义的方向向量,画一个,或者(哪个看起来更好)一个。该方向定义球体上的一个点,该点应为投影的中心 我想让它从飞行员的角度看,所以应该只画球体的一半 我使用python,但我还没有选择图形库,我可能会使用pygame 我发现了一些相关的东西:但它使用OpenGL,我没有使用它的经验,但如果需要,我可以尝试 我该怎么做?我可能可以通过计算公式中的每个像素来手动绘制,但我认为有一些库工具

我有这样的图像:

我不知道它到底是什么样的投影,我猜是等边的还是墨卡托的。这是的纹理

我想根据两个角度(航向和俯仰)定义的方向向量,画一个,或者(哪个看起来更好)一个。该方向定义球体上的一个点,该点应为投影的中心

我想让它从飞行员的角度看,所以应该只画球体的一半

我使用python,但我还没有选择图形库,我可能会使用pygame

我发现了一些相关的东西:但它使用OpenGL,我没有使用它的经验,但如果需要,我可以尝试


我该怎么做?我可能可以通过计算公式中的每个像素来手动绘制,但我认为有一些库工具可以有效地做到这一点(可能是硬件加速?)

我浏览了您链接的“偏离中心的地图投影”中的代码

作为一个起点,我想说这是非常好的,特别是如果你想在PyGame中以任何形式的效率实现这一点,因为将任何形式的每像素操作卸载到OpenGL将比Python中快得多

显然,要进一步了解,您需要了解OpenGL;投影是在
main.py
的GLSL代码中实现的(字符串中的内容传递给
mod_program.ShaderFragment
)-如果您已经阅读了等矩形投影,atan和asin应该不会感到惊讶


但是,要获得所需的内容,您必须弄清楚如何渲染球体而不是视口填充四元体(在
glBegin(GL_QUADS);
处以main.py渲染)。或者,也可以选择使用屏幕填充四元组,并在着色器代码中进行光线球体相交(这实际上就是我的另一个答案中的python代码所做的)。

对于全python解决方案(使用numpy/scipy array ops,比任何显式逐像素循环都快),这:

#/usr/bin/env python
输入数学
将numpy作为np导入
进口西皮
导入scipy.misc
导入scipy.ndimage.interpolation
导入子流程
src=scipy.misc.imread(“ji80w.png”)
尺寸=256
帧=50
对于X范围内的帧(0,帧):
#图像像素坐标
px=np.arange(-1.0,1.0,2.0/尺寸)+1.0/尺寸
py=np.arange(-1.0,1.0,2.0/尺寸)+1.0/尺寸
hx,hy=scipy.meshgrid(px,py)
#如果像素的光线命中,计算球体命中位置的z
r2=hx*hx+hy*hy

hit=(r2感谢您的帮助,我将详细介绍OpenGL。
#!/usr/bin/env python

import math
import numpy as np
import scipy
import scipy.misc
import scipy.ndimage.interpolation
import subprocess

src=scipy.misc.imread("ji80w.png")

size=256
frames=50

for frame in xrange(0,frames):

    # Image pixel co-ordinates
    px=np.arange(-1.0,1.0,2.0/size)+1.0/size
    py=np.arange(-1.0,1.0,2.0/size)+1.0/size
    hx,hy=scipy.meshgrid(px,py)

    # Compute z of sphere hit position, if pixel's ray hits
    r2=hx*hx+hy*hy
    hit=(r2<=1.0)
    hz=np.where(
        hit,
        -np.sqrt(1.0-np.where(hit,r2,0.0)),
        np.NaN
        )

    # Some spin and tilt to make things interesting
    spin=2.0*np.pi*(frame+0.5)/frames
    cs=math.cos(spin)
    ss=math.sin(spin)
    ms=np.array([[cs,0.0,ss],[0.0,1.0,0.0],[-ss,0.0,cs]])

    tilt=0.125*np.pi*math.sin(2.0*spin)
    ct=math.cos(tilt)
    st=math.sin(tilt)
    mt=np.array([[1.0,0.0,0.0],[0.0,ct,st],[0.0,-st,ct]])

    # Rotate the hit points
    xyz=np.dstack([hx,hy,hz])
    xyz=np.tensordot(xyz,mt,axes=([2],[1]))
    xyz=np.tensordot(xyz,ms,axes=([2],[1]))
    x=xyz[:,:,0]
    y=xyz[:,:,1]
    z=xyz[:,:,2]

    # Compute map position of hit
    latitude =np.where(hit,(0.5+np.arcsin(y)/np.pi)*src.shape[0],0.0)
    longitude=np.where(hit,(1.0+np.arctan2(z,x)/np.pi)*0.5*src.shape[1],0.0)
    latlong=np.array([latitude,longitude])

    # Resample, and zap non-hit pixels
    dst=np.zeros((size,size,3))
    for channel in [0,1,2]:
        dst[:,:,channel]=np.where(
            hit,
            scipy.ndimage.interpolation.map_coordinates(
                src[:,:,channel],
                latlong,
                order=1
                ),
            0.0
            )

    # Save to f0000.png, f0001.png, ... 
    scipy.misc.imsave('f{:04}.png'.format(frame),dst)

# Use imagemagick to make an animated gif
subprocess.call('convert -delay 10 f????.png anim.gif',shell=True)