建立由转换和投影连接的类型图
konvert的Python项目详细描述
konvert
konvert实现通用转换图,例如坐标转换。
在核心,konVert表示通过图上的转换连接的类型。这种转换图可以渐进地重新编译,因为它只需要两个连接将一个新类型连接到图形,这种类型可以自动转换为图中的任何其他类型,通过自动链接现有类型之间的转换。
自动链接要求转换无参数。带有附加参数的转换称为投影,konvert还可以帮助您管理投影。
点数
moule konvert.points包含坐标转换的转换图。以二维笛卡尔坐标系中的一组点为例:
fromkonvert.pointsimportCartesian2Dline=Cartesian2D(x=[0,1,2],y=[0,1,2])
通过使用to()
方法,可以将这些点转换为其他实现的二维点集,如Polar
和Bipolar
。
fromkonvert.pointsimportPolar,Bipolarlp=line.to(Polar)lb=line.to(Bipolar)
它也可以提升到它的三维描述,l3 = line.to(Cartesian3D)
。转换图可以自动链式转换,因此实际上,平面中的任何点都可以提升到三维空间中的任何点。这意味着,极坐标中的点可以被提升到Cartesian3D
。
p0=Polar(theta=30*degrees,r=1.5).to(Cartesian3D)
三维中的点可以使用坐标表示法Cartesian3D
、Cylindrical
和Spherical
来表示。所有笛卡尔类型都有一些帮助器方法,可以方便地操作点。
p0=Cartesian3D(1,1,1)q0=Cartesian3D(1,1,0)# Create normalized versionp1=p0.normalized()# Shift p0 by q0p0.shift(q0)# Rotate around an axis thorugh q0.p0.rotate(theta=45*degrees,point=q0)
助手
由于points模块可以广泛地处理角度,konvert定义了一个方便的符号degrees
,它将以度数表示的值和数组转换成弧度,
fromkonvert.pointsimportdegreestheta=90*degrees# theta is now pi/2theta=numpy.array([45,60,90,180,360])*degrees# theta is now numpy.array([pi/4, pi/3, pi/2, pi, 2*pi])
地图投影
Points模块还包含一组映射投影:Azimuthal
、AzimuthalEquidistant
、Mercator
、Orthographic
、Stereographic
和Equirectangular
。点在Sphere
、球坐标或Equitorial
坐标(晶格和经度)中表示。
points=Equitorial([40.12,50.53]*degrees,[33.16,44.53]*degrees,r=1)p0=points.project(Mercator)p1=points.project(Stereographic)...
使用matplotlib和cartesian2d上的plot实用程序可以很容易地绘制点。
扩展转换图
<> P>扩展现有的转换图和现有的投影集合是相当简单的。让我们用一个倾斜的二维坐标系来扩展点图。注意使用numpy有效地表示和转换坐标。importnumpyfromkonvert.pointsimportPointsclassSkew2D(Points):_sig=('x','y','theta')def__init__(self,x,y,theta):""" Skew 2D coordinates. Theta is a scalar denominating the skew angle. """self.x=numpy.array(x)self.y=numpy.array(y)self.theta=theta
skew2d类可以通过以下转换连接到konvert.points
转换图。
fromkonvert.pointsimportconverters,Conversion@converters.register()classSkew2DToCartesian2D(Conversion):src=Skew2Ddst=points.Cartesian2D@staticmethoddefconvert(skew):returnpoints.Cartesian2D(skew.x+numpy.cos(theta)*skew.y,numpy.sin(theta)*skew.y)
反向转换需要额外的theta参数,必须作为投影实现。
fromkonvert.pointsimportprojectors,Projection@projectors.register()classCartesian2DToSkew2D(Projection):src=points.Cartesian2Ddst=Skew2D@staticmethoddefproject(cart,theta=np.pi/2):y=cart.y/numpy.sin(theta)x=cart.x-numpy.cos(theta)*yreturnSkew2D(x,y,theta)
有了这两个加法,我们就可以在偏斜2d点和图中任何类型的点之间进行转换,
p0=Skew2D(1,2,theta=45*degrees)p1=p0.to(Cylindrical)
或者相反,
p1=Cylindrical(theta=30*degrees,phi=45*degrees,r=10)p0=p1.project(OnPlane).project(Cartesian2DToSkew2D,theta=45*degrees)
扩展名
转换图已在conversions
模块中实现。可以创建额外的转换图并在这些图中注册现有的或新的转换。例如,我们可以创建一个颜色模块,它在rgb和hsl颜色空间中的值之间进行转换。对于本例,我们不必对实体进行矢量化,而只需处理单色条目并使用python标准库中的colorsys
模块。
importcolorsysfromkonvert.conversionsimportConversion,ConversionGraphconverters=ConversionGraph()classColor(metaclass=ABCMeta):defto(self,type):returnconvertes.convert(self,type)classRGB(Color):def__init__(self,r,g,b):self.r=rself.g=gself.b=bclassHSL(Color):def__init__(self,h,s,l):self.h=hself.s=sself.l=lconverters.register()classRGBToHSL(Conversion):src=RGBdst=HSL@staticmethoddefconvert(rgb):hsl=colorsys.rgb_to_hsl(rgb.r,rgb.g,rgb.b)returnHSL(*hsl)converters.register()classHSLToRGB(Conversion):src=RGBdst=HSL@staticmethoddefconvert(hsl):rgb=colorsys.hsl_to_rgb(hsl.h,hsl.s,hsl.l)returnRGB(*rgb)
我们现在可以编写RGB(0.1, 0.3, 0.3).to(HSL)
并得到正确的结果。
如果需要,我们可以将此图合并到点转换图中,或者在颜色转换图中包含点图的一部分…