建立由转换和投影连接的类型图

konvert的Python项目详细描述


konvert

konvert实现通用转换图,例如坐标转换。

在核心,konVert表示通过图上的转换连接的类型。这种转换图可以渐进地重新编译,因为它只需要两个连接将一个新类型连接到图形,这种类型可以自动转换为图中的任何其他类型,通过自动链接现有类型之间的转换。

自动链接要求转换无参数。带有附加参数的转换称为投影,konvert还可以帮助您管理投影。

点数

moule konvert.points包含坐标转换的转换图。以二维笛卡尔坐标系中的一组点为例:

fromkonvert.pointsimportCartesian2Dline=Cartesian2D(x=[0,1,2],y=[0,1,2])

通过使用to()方法,可以将这些点转换为其他实现的二维点集,如PolarBipolar

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)

三维中的点可以使用坐标表示法Cartesian3DCylindricalSpherical来表示。所有笛卡尔类型都有一些帮助器方法,可以方便地操作点。

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模块还包含一组映射投影:AzimuthalAzimuthalEquidistantMercatorOrthographicStereographicEquirectangular。点在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)并得到正确的结果。

如果需要,我们可以将此图合并到点转换图中,或者在颜色转换图中包含点图的一部分…

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
用Java将dpi元数据写入jpeg图像   文件为什么Java会自动解码URI编码的文件名中的%2F?   java多动态时间事件侦听器   java中如何递归查找不同级别的属性值   java Apache Spark MySQL JavaRDD。foreachPartition为什么我得到ClassNotFoundException   Java中的循环变量文件名   java如何参数化调用JNA库的C库名称和路径?   swing如何使gif在Java中运行一次并停止?   Big Sur上的MacOS应用程序,具有java子进程和可访问性API权限   在page类中定义的java Webelement在测试类中不可访问   如何使用java if else从JSON文件中删除重复的元素?   java Android studio dalvik vm找不到类   java在数组中正确使用协方差