def drawImage3D(image,nx=0,ny=0,pixel='dot'): """Draw an image as a colored Formex Draws a raster image as a colored Formex. While there are other and better ways to display an image in pyFormex (such as using the imageView widget), this function allows for interactive handling the image using the OpenGL infrastructure. Parameters: - `image`: a QImage or any data that can be converted to a QImage, e.g. the name of a raster image file. - `nx`,`ny`: width and height (in cells) of the Formex grid. If the supplied image has a different size, it will be rescaled. Values <= 0 will be replaced with the corresponding actual size of the image. - `pixel`: the Formex representing a single pixel. It should be either a single element Formex, or one of the strings 'dot' or 'quad'. If 'dot' a single point will be used, if 'quad' a unit square. The difference will be important when zooming in. The default is 'dot'. Returns the drawn Actor. See also :func:`drawImage`. """ pf.GUI.setBusy() from pyformex.plugins.imagearray import qimage2glcolor, resizeImage from pyformex.opengl.colors import GLcolorA # Create the colors #print("TYPE %s" % type(image)) if isinstance(image,np.ndarray): # undocumented feature: allow direct draw of 2d array color = GLcolorA(image) nx,ny = color.shape[:2] colortable = None print(color) else: image = resizeImage(image, nx, ny) nx, ny = image.width(), image.height() color, colortable = qimage2glcolor(image) # Create a 2D grid of nx*ny elements # !! THIS CAN PROBABLY BE DONE FASTER if isinstance(pixel, Formex) and pixel.nelems()==1: F = pixel elif pixel == 'quad': F = Formex('4:0123') else: F = Formex('1:0') F = F.replic2(nx, ny).centered() F._imageshape_ = (nx,ny) # Draw the grid using the image colors FA = draw(F, color=color, colormap=colortable, nolight=True) pf.GUI.setBusy(False) return FA
def sphere3(nx, ny, r=1, bot=-90., top=90.): """Return a sphere consisting of surface triangles A sphere with radius r is modeled by the triangles formed by a regular grid of nx longitude circles, ny latitude circles and their diagonals. The two sets of triangles can be distinguished by their property number: 1: horizontal at the bottom, 2: horizontal at the top. The sphere caps can be cut off by specifying top and bottom latitude angles (measured in degrees from 0 at north pole to 180 at south pole. """ base = Formex([[[0, 0, 0], [1, 0, 0], [1, 1, 0]], [[1, 1, 0], [0, 1, 0], [0, 0, 0]]], [1, 2]) grid = base.replic2(nx, ny, 1, 1) s = float(top - bot) / ny return grid.translate([0, bot / s, 1]).spherical(scale=[360. / nx, s, r])
def rectangle(nx=1, ny=1, b=None, h=None, bias=0., diag=None): """Return a Formex representing a rectangular surface. The rectangle has a size(b,h) divided into (nx,ny) cells. The default b/h values are equal to nx/ny, resulting in a modular grid. The rectangle lies in the (x,y) plane, with one corner at [0,0,0]. By default, the elements are quads. By setting diag='u','d' of 'x', diagonals are added in /, resp. \ and both directions, to form triangles. """ if diag == 'x': base = Formex([[[0.0, 0.0, 0.0], [1.0, -1.0, 0.0], [1.0, 1.0, 0.0]]]).rosette(4, 90.).translate([-1.0, -1.0, 0.0]).scale(0.5) else: base = Formex({'u': '3:012934', 'd': '3:016823'}.get(diag, '4:0123')) if b is None: sx = 1. else: sx = float(b) / nx if h is None: sy = 1. else: sy = float(h) / ny return base.replic2(nx, ny, bias=bias).scale([sx, sy, 0.])