예제 #1
0
    def on_render(self, cvs, system):
        Box.on_render(self, cvs, system)
        Atom.on_render(self, cvs, system)

        n = self.n_top + self.n_bot
        if n == 0:
            return

        y = system[self.y]
        top = system[self.top] + PIP
        bot = system[self.bot] + PIP
        y_top = y + top
        y_bot = y - bot
        x_mid, y_mid = self.get_align("center")
        x0, y0 = system[x_mid], system[y_mid]

        x_top = [system[x] for x in self.x_top]
        x_bot = [system[x] for x in self.x_bot]
        x0 = self._get_pipx(x_top, x_bot)

        conv = lambda x0, x1, t: (1. - t) * x0 + t * x1

        top_attrs = self.top_attrs
        bot_attrs = self.bot_attrs

        trace = self.trace
        trace["top"] = []
        trace["bot"] = []

        y3 = y_top
        for x3, attrs in zip(x_top, top_attrs):
            x2, y2 = x3, conv(y3, y0, 0.3)
            x1, y1 = conv(x0, x3, 0.7), conv(y3, y0, 0.7)
            p = path.curve(x3, y3, x2, y2, x1, y1, x0, y0)
            trace["top"].append(p)
            cvs.stroke(p, attrs)

        y3 = y_bot
        for x3, attrs in zip(x_bot, bot_attrs):
            x2, y2 = x3, conv(y3, y0, 0.3)
            x1, y1 = conv(x0, x3, 0.7), conv(y3, y0, 0.7)
            p = path.curve(x0, y0, x1, y1, x2, y2, x3, y3)
            trace["bot"].append(p)
            cvs.stroke(p, attrs)

        #cvs.fill(path.circle(x0, y0, 0.04))
        if self.pip is not None:
            self.pip.render(cvs, x0, y0)
예제 #2
0
파일: diagram.py 프로젝트: punkdit/huygens
    def on_render(self, cvs, system):
        Multi.on_render(self, cvs, system)

        y = system[self.y]
        top = system[self.top] + PIP
        bot = system[self.bot] + PIP
        y_top = y+top
        y_bot = y-bot
        y_mid = conv(self.lly, self.ury)
        y_mid = system[y_mid]

        x_top = [system[x] for x in self.x_top]
        x_bot = [system[x] for x in self.x_bot]
        x_mid = conv(x_bot[0], x_bot[1])

        alpha = self.space
        under = self.inverse
        x0, x1 = x_bot[1], x_top[0]

        for i0, i1 in [(0, 1), (1, 0)]:
            x0, x1 = x_bot[i0], x_top[i1]

            if under:
                # I think this is de Casteljau subdivision...
                xt, yt = conv(x0, x1, 0.25), conv(y_bot, y_mid, 0.75) # control point
                p = path.curve(
                    x0, y_bot, 
                    x0, conv(y_bot, y_mid),
                    xt, yt,
                    conv(xt, x_mid, alpha), conv(yt, y_mid, alpha))
                cvs.stroke(p)
        
                xt, yt = conv(x0, x1, 0.75), conv(y_mid, y_top, 0.25) # control point
                p = path.curve(
                    conv(xt, x_mid, alpha), conv(yt, y_mid, alpha),
                    xt, yt,
                    x1, conv(y_mid, y_top),
                    x1, y_top)
                cvs.stroke(p)

            else:
                p = path.curve(x0, y_bot, x0, y_mid, x1, y_mid, x1, y_top)
                cvs.stroke(p)

            under = not under
예제 #3
0
파일: diagram.py 프로젝트: punkdit/huygens
    def on_render(self, cvs, system):
        Multi.on_render(self, cvs, system)

        n = self.n_top + self.n_bot
        if n==0:
            return

        y = system[self.y]
        top = system[self.top] + PIP
        bot = system[self.bot] + PIP
        y_top = y+top
        y_bot = y-bot
        x_mid, y_mid = self.get_align("center")
        x_mid, y_mid = system[x_mid], system[y_mid]

        x_top = [system[x] for x in self.x_top]
        x_bot = [system[x] for x in self.x_bot]
        x_avg = (1./n)*sum(x_top + x_bot)

        attrs = self.attrs
        top_attrs = self.top_attrs
        bot_attrs = self.bot_attrs
        conv = lambda x0, x1, t=0.5: (1.-t)*x0 + t*x1

        for (i_top, j_top) in self.toptop:
            x0 = x_top[i_top]
            x1 = x_top[j_top]
            #cvs.stroke(path.curve(x0, y_bot, x0, y_mid, x1, y_mid, x1, y_top))
            x = conv(x0, x1)
            r = 0.5*(x1-x0)
            cvs.stroke(path.arc(x, y_top, r, pi, 2*pi), 
                attrs + top_attrs[i_top])

        for (i_top, i_bot) in self.topbot:
            x0 = x_bot[i_bot]
            x1 = x_top[i_top]
            cvs.stroke(path.curve(x0, y_bot, x0, y_mid, x1, y_mid, x1, y_top), 
                attrs + top_attrs[i_top] + bot_attrs[i_bot])

        for (i_bot, j_bot) in self.botbot:
            x0 = x_bot[i_bot]
            x1 = x_bot[j_bot]
            x = conv(x0, x1)
            r = 0.5*(x1-x0)
            cvs.stroke(path.arc(x, y_bot, r, 0, pi), 
                attrs + bot_attrs[i_bot])