Changeset 8394:dc216b7b593b in orange


Ignore:
Timestamp:
07/16/11 15:20:30 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
273a0c603f47f710cae69aa91d1d5f3710675023
Message:

owplot3d: fixed grid-values misalignment, zip->izip

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/owplot3d.py

    r8393 r8394  
    5757import numpy 
    5858from math import sin, cos, pi 
     59 
     60try: 
     61    from itertools import izip as zip # Python 3 zip == izip in Python 2.x 
     62except: 
     63    pass 
    5964 
    6065# Import undefined functions, override some wrappers. 
     
    243248            sin(self.pitch)*sin(self.yaw)] 
    244249 
     250        self.camera_fov = 30. 
    245251        self.zoom_factor = 500. 
    246252        self.move_factor = 100. 
     
    405411        glLoadIdentity() 
    406412        width, height = self.width(), self.height() 
    407         #if self.ortho: 
    408         #    # TODO: fix ortho 
    409         #    glOrtho(-width/divide, width/divide, -height/divide, height/divide, -1, 2000) 
    410         #else: 
    411         aspect = float(width) / height if height != 0 else 1 
    412         gluPerspective(30.0, aspect, 0.1, 2000) 
     413        denominator = 80. 
     414        if self.ortho: 
     415            glOrtho(-width / denominator, 
     416                     width / denominator, 
     417                    -height / denominator, 
     418                     height / denominator, -1, 2000) 
     419        else: 
     420            aspect = float(width) / height if height != 0 else 1 
     421            gluPerspective(self.camera_fov, aspect, 0.1, 2000) 
    413422        glMatrixMode(GL_MODELVIEW) 
    414423        glLoadIdentity() 
     
    428437        for (cmd, params) in self.commands: 
    429438            if cmd == 'scatter': 
    430                 vao, vao_outline, array, labels = params 
     439                vao, vao_outline, (X, Y, Z), labels = params 
    431440                glUseProgram(self.symbol_shader) 
    432441                glUniform1i(self.symbol_shader_face_symbols, self.face_symbols) 
     
    448457 
    449458                if labels != None: 
    450                     for (x,y,z), label in zip(array, labels): 
    451                         self.renderText(x,y,z, '{0:.1}'.format(label), font=self.labels_font) 
     459                    glScalef(*scale) 
     460                    glTranslatef(*(-self.center)) 
     461                    for x, y, z, label in zip(X, Y, Z, labels): 
     462                        self.renderText(x,y,z, ('%f' % label).rstrip('0').rstrip('.'), font=self.labels_font) 
    452463 
    453464        glDisable(GL_BLEND) 
     
    531542        def draw_axis(line): 
    532543            glColor4f(0.2, 0.2, 0.2, 1) 
    533             glLineWidth(2) # Widths > 1 are actually deprecated I think. 
     544            glLineWidth(2) 
    534545            glBegin(GL_LINES) 
    535546            glVertex3f(*line[0]) 
     
    540551            glColor4f(0.1, 0.1, 0.1, 1) 
    541552            glLineWidth(1) 
    542             start = axis[0] 
    543             end = axis[1] 
    544             direction = (end - start) / float(sub) 
    545             middle = (end - start) / 2. 
     553            start, end = axis 
    546554            offset = normal*0.3 
    547             for i in range(sub): 
    548                 position = start + direction*i 
     555            samples = numpy.linspace(0.0, 1.0, num=sub) 
     556            for sample in samples: 
     557                position = start + (end-start)*sample 
    549558                glBegin(GL_LINES) 
    550                 glVertex3f(*(position-normal*0.08)) 
    551                 glVertex3f(*(position+normal*0.08)) 
     559                glVertex3f(*(position-normal*0.2)) 
     560                glVertex3f(*(position+normal*0.2)) 
    552561                glEnd() 
    553562                position += offset 
     
    557566                                position[1], 
    558567                                position[2], 
    559                                 '{0:.2}'.format(value)) 
     568                                '%.1f' % value) 
    560569 
    561570        glDisable(GL_DEPTH_TEST) 
     
    575584            normal = normal_from_points(*axis_plane[:3]) 
    576585            camera_vector = normalize(axis_plane[0] - cam_in_space) 
    577             cos = numpy.dot(normal, camera_vector) 
    578             cos = max(0.7, cos) 
     586            cos = max(0.7, numpy.dot(normal, camera_vector)) 
    579587            glColor4f(*(self.color_plane * cos)) 
    580             P11, P12, P21, P22 = numpy.asarray(axis_plane) 
     588            p11, p12, p21, p22 = numpy.asarray(axis_plane) 
    581589            # Draw background quad first. 
    582590            glBegin(GL_QUADS) 
    583             glVertex3f(*P11) 
    584             glVertex3f(*P12) 
    585             glVertex3f(*P21) 
    586             glVertex3f(*P22) 
     591            glVertex3f(*p11) 
     592            glVertex3f(*p12) 
     593            glVertex3f(*p21) 
     594            glVertex3f(*p22) 
    587595            glEnd() 
    588596 
    589             P22, P21 = P21, P22 
     597            p22, p21 = p21, p22 
     598            samples = numpy.linspace(0.0, 1.0, num=sub) 
     599            p1211 = p12 - p11 
     600            p2221 = p22 - p21 
     601            p2111 = p21 - p11 
     602            p2212 = p22 - p12 
     603            # Draw grid lines. 
    590604            glColor4f(*(self.color_grid * cos)) 
    591             Dx = numpy.linspace(0.0, 1.0, num=sub) 
    592             P1vecH = P12 - P11 
    593             P2vecH = P22 - P21 
    594             P1vecV = P21 - P11 
    595             P2vecV = P22 - P12 
    596             # Draw grid lines. 
    597605            glBegin(GL_LINES) 
    598             for i, dx in enumerate(Dx): 
    599                 start = P11 + P1vecH*dx 
    600                 end = P21 + P2vecH*dx 
     606            for i, dx in enumerate(samples): 
     607                start = p11 + p1211*dx 
     608                end = p21 + p2221*dx 
    601609                glVertex3f(*start) 
    602610                glVertex3f(*end) 
    603                 start = P11 + P1vecV*dx 
    604                 end = P12 + P2vecV*dx 
     611 
     612                start = p11 + p2111*dx 
     613                end = p12 + p2212*dx 
    605614                glVertex3f(*start) 
    606615                glVertex3f(*end) 
     
    688697 
    689698    def scatter(self, X, Y, Z, colors='b', sizes=5, symbols=None, labels=None, **kwargs): 
    690         array = [[x, y, z] for x,y,z in zip(X, Y, Z)] 
     699        if len(X) != len(Y) != len(Z): 
     700            raise ValueError('Axis data arrays must be of equal length') 
     701        num_points = len(X) 
     702 
    691703        if isinstance(colors, str): 
    692704            color_map = {'r': [1.0, 0.0, 0.0, 1.0], 
     
    694706                         'b': [0.0, 0.0, 1.0, 1.0]} 
    695707            default = [0.0, 0.0, 1.0, 1.0] 
    696             colors = [color_map.get(colors, default) for _ in array] 
     708            colors = [color_map.get(colors, default) for _ in range(num_points)] 
    697709  
    698710        if isinstance(sizes, int): 
    699             sizes = [sizes for _ in array] 
     711            sizes = [sizes for _ in range(num_points)] 
    700712 
    701713        # Scale sizes to 0..1 
     
    704716 
    705717        if symbols == None: 
    706             symbols = [0 for _ in array] 
    707  
    708         max, min = numpy.max(array, axis=0), numpy.min(array, axis=0) 
    709         self.min_x, self.min_y, self.min_z = min 
    710         self.max_x, self.max_y, self.max_z = max 
     718            symbols = [0 for _ in range(num_points)] 
     719 
     720        #max, min = numpy.max(array, axis=0), numpy.min(array, axis=0) 
     721        min = self.min_x, self.min_y, self.min_z = numpy.min(X), numpy.min(Y), numpy.min(Z) 
     722        max = self.max_x, self.max_y, self.max_z = numpy.max(X), numpy.max(Y), numpy.max(Z) 
     723        min = numpy.array(min) 
     724        max = numpy.array(max) 
    711725        self.range_x, self.range_y, self.range_z = max-min 
    712726        self.middle_x, self.middle_y, self.middle_z = (min+max) / 2. 
     
    722736        outline_indices = [] 
    723737        index = 0 
    724         for (x,y,z), (r,g,b,a), size, symbol in zip(array, colors, sizes, symbols): 
     738        for x, y, z, (r,g,b,a), size, symbol in zip(X, Y, Z, colors, sizes, symbols): 
    725739            sO2 = size * self.normal_size / 2. 
    726740            n = self.available_symbols[symbol % len(self.available_symbols)] 
     
    796810        self.vaos.append(vao) 
    797811        self.vaos.append(vao_outline) 
    798         self.commands.append(("scatter", [vao, vao_outline, array, labels])) 
     812        self.commands.append(("scatter", [vao, vao_outline, (X,Y,Z), labels])) 
    799813        self.updateGL() 
    800814 
Note: See TracChangeset for help on using the changeset viewer.