예제 #1
0
    def show(self, **kwargs):
        """ show cone

        Parameters
        ----------

        length : float

        """

        defaults = {'length': 15.}
        for k in defaults:
            if k not in kwargs:
                kwargs[k] = defaults[k]

        if 'seg1' not in self.__dict__:
            verts = [
                tuple(self.apex),
                tuple(self.apex + kwargs['length'] * self.u),
                tuple(self.apex + kwargs['length'] * self.v),
                tuple(self.apex)
            ]
            codes = [
                Path.MOVETO,
                Path.LINETO,
                Path.LINETO,
                Path.CLOSEPOLY,
            ]

        else:
            a1 = self.seg1[:, 0]
            b1 = self.seg1[:, 1]
            if 'seg0' not in self.__dict__:
                a0 = self.apex
                b0 = self.apex
            else:
                a0 = self.seg0[:, 0]
                b0 = self.seg0[:, 1]

            if not (self.degenerated):
                #verts = [tuple(self.apex),
                #         tuple(a1),
                #         tuple(b1),
                #         tuple(self.apex)
                #        ]
                verts = [
                    tuple(self.apex),
                    tuple(self.apex + kwargs['length'] * self.u),
                    tuple(self.apex + kwargs['length'] * self.v),
                    tuple(self.apex)
                ]
                codes = [
                    Path.MOVETO,
                    Path.LINETO,
                    Path.LINETO,
                    Path.CLOSEPOLY,
                ]
            else:
                if (geu.ccw(a0, b0, b1) ^ geu.ccw(b0, b1, a1)):
                    verts = [
                        tuple(b0),
                        tuple(a1),
                        tuple(b1),
                        tuple(a0),
                        tuple(b0)
                    ]

                else:
                    verts = [
                        tuple(b0),
                        tuple(b1),
                        tuple(a1),
                        tuple(a0),
                        tuple(b0)
                    ]

                codes = [
                    Path.MOVETO,
                    Path.LINETO,
                    Path.LINETO,
                    Path.LINETO,
                    Path.CLOSEPOLY,
                ]

        path = Path(verts, codes)

        if 'fig' not in kwargs:
            fig = plt.figure(figsize=(10, 10))
        else:
            fig = kwargs['fig']
        if 'ax' not in kwargs:
            ax = fig.add_subplot(111)
        else:
            ax = kwargs['ax']

        ax.plot([self.apex[0], self.apex[0] + kwargs['length'] * self.u[0]],
                [self.apex[1], self.apex[1] + kwargs['length'] * self.u[1]],
                lw=1,
                color='b')
        ax.plot([self.apex[0], self.apex[0] + kwargs['length'] * self.v[0]],
                [self.apex[1], self.apex[1] + kwargs['length'] * self.v[1]],
                lw=1,
                color='r')
        theta1 = np.arctan2(self.u[1], self.u[0]) * 180 / np.pi
        #print theta1
        theta2 = np.arctan2(self.v[1], self.v[0]) * 180 / np.pi
        #print theta2
        angle = self.angle * 180 / np.pi
        #print angle
        arc = patches.Arc((self.apex[0], self.apex[1]),
                          kwargs['length'],
                          kwargs['length'],
                          theta1=theta1,
                          theta2=theta2,
                          linewidth=2)
        ax.add_patch(arc)
        if 'seg0' in self.__dict__:
            ax.plot([a0[0], b0[0]], [a0[1], b0[1]], lw=2, color='b')
        if 'seg1' in self.__dict__:
            ax.plot([a1[0], b1[0]], [a1[1], b1[1]], lw=2, color='r')
        patch = patches.PathPatch(path, facecolor='orange', lw=2, alpha=0.3)
        ax.add_patch(patch)
        ax.axis('equal')
        # ax.set_xlim(-2,2)
        # ax.set_ylim(-2,2)

        return (fig, ax)
예제 #2
0
    def from2segs(self, seg0, seg1):
        """ creates a Cone from 2 segments

        Parameters
        ----------

        seg0 : 2 x 2  (Ndim x Npoints)
        seg1 : 2 x 2

        Notes
        -----

        The only way for the cone to be degenerated is when the two segments are on the same line.

        See Also
        --------

        pylayers.gis.layout.Layout.buildGi



        """
        # bv : (4,1)

        self.seg0 = seg0
        self.seg1 = seg1

        a0 = seg0[:, 0]
        b0 = seg0[:, 1]
        a1 = seg1[:, 0]
        b1 = seg1[:, 1]

        # check for connected segments (This could be determined earlier)
        # a0 = a1 | b1
        # b0 = a1 | b1

        # check segment orientation (crossing)

        if not (geu.ccw(a0, b0, b1) ^ geu.ccw(b0, b1, a1)):
            v0 = (b1 - a0)
            v1 = (a1 - b0)
            twisted = True
        else:
            v0 = (a1 - a0)
            v1 = (b1 - b0)
            twisted = False

        v0n = v0 / np.sqrt(np.dot(v0, v0))
        v1n = v1 / np.sqrt(np.dot(v1, v1))

        if np.cross(v0n, v1n) > 0:
            self.u = v0n
            self.v = v1n
            inversion = False
        else:
            self.u = v1n
            self.v = v0n
            inversion = True

        if (not twisted) & (not inversion):
            #reverse seg1
            #print "reverse seg1"
            self.seg1 = self.seg1[:, ::-1]
        if (inversion) & (not twisted):
            #reverse seg0
            #print "reverse seg0"
            self.seg0 = self.seg0[:, ::-1]
        if twisted & inversion:
            #reverse seg0 and seg1
            #print "reverse seg0"
            #print "reverse seg1"
            self.seg0 = self.seg0[:, ::-1]
            self.seg1 = self.seg1[:, ::-1]

        self.dot = np.dot(self.u, self.v)
        self.cross = np.cross(self.u, self.v)

        if self.cross < 1e-15:
            self.degenerated = True
        else:
            a0u = np.dot(self.seg0[:, 0], self.u)
            a0v = np.dot(self.seg0[:, 0], self.v)
            b0u = np.dot(self.seg0[:, 1], self.u)
            b0v = np.dot(self.seg0[:, 1], self.v)

            kb = ((b0v - a0v) - self.dot *
                  (b0u - a0u)) / (self.dot * self.dot - 1)
            self.apex = self.seg0[:, 1] + kb * self.v
        self.upd_angle()
예제 #3
0
파일: cone.py 프로젝트: pylayers/pylayers
    def from2segs(self, seg0, seg1):
        """ creates a Cone from 2 segments

        Parameters
        ----------

        seg0 : 2 x 2  (Ndim x Npoints)
        seg1 : 2 x 2

        Notes
        -----

        The only way for the cone to be degenerated is when the two segments are on the same line.

        See Also
        --------

        pylayers.gis.layout.Layout.buildGi



        """
        # bv : (4,1)

        self.seg0 = seg0
        self.seg1 = seg1

        a0 = seg0[:, 0]
        b0 = seg0[:, 1]
        a1 = seg1[:, 0]
        b1 = seg1[:, 1]

        # check for connected segments (This could be determined earlier)
        # a0 = a1 | b1
        # b0 = a1 | b1

        # check segment orientation (crossing)

        if not (geu.ccw(a0, b0, b1) ^ geu.ccw(b0, b1, a1)):
            v0 = b1 - a0
            v1 = a1 - b0
            twisted = True
        else:
            v0 = a1 - a0
            v1 = b1 - b0
            twisted = False

        v0n = v0 / np.sqrt(np.dot(v0, v0))
        v1n = v1 / np.sqrt(np.dot(v1, v1))

        if np.cross(v0n, v1n) > 0:
            self.u = v0n
            self.v = v1n
            inversion = False
        else:
            self.u = v1n
            self.v = v0n
            inversion = True

        if (not twisted) & (not inversion):
            # reverse seg1
            # print "reverse seg1"
            self.seg1 = self.seg1[:, ::-1]
        if (inversion) & (not twisted):
            # reverse seg0
            # print "reverse seg0"
            self.seg0 = self.seg0[:, ::-1]
        if twisted & inversion:
            # reverse seg0 and seg1
            # print "reverse seg0"
            # print "reverse seg1"
            self.seg0 = self.seg0[:, ::-1]
            self.seg1 = self.seg1[:, ::-1]

        self.dot = np.dot(self.u, self.v)
        self.cross = np.cross(self.u, self.v)

        if self.cross < 1e-15:
            self.degenerated = True
        else:
            a0u = np.dot(self.seg0[:, 0], self.u)
            a0v = np.dot(self.seg0[:, 0], self.v)
            b0u = np.dot(self.seg0[:, 1], self.u)
            b0v = np.dot(self.seg0[:, 1], self.v)

            kb = ((b0v - a0v) - self.dot * (b0u - a0u)) / (self.dot * self.dot - 1)
            self.apex = self.seg0[:, 1] + kb * self.v
        self.upd_angle()
예제 #4
0
파일: cone.py 프로젝트: pylayers/pylayers
    def show(self, **kwargs):
        """ show cone

        Parameters
        ----------

        length : float

        """

        defaults = {"length": 15.0}
        for k in defaults:
            if k not in kwargs:
                kwargs[k] = defaults[k]

        if "seg1" not in self.__dict__:
            verts = [
                tuple(self.apex),
                tuple(self.apex + kwargs["length"] * self.u),
                tuple(self.apex + kwargs["length"] * self.v),
                tuple(self.apex),
            ]
            codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]

        else:
            a1 = self.seg1[:, 0]
            b1 = self.seg1[:, 1]
            if "seg0" not in self.__dict__:
                a0 = self.apex
                b0 = self.apex
            else:
                a0 = self.seg0[:, 0]
                b0 = self.seg0[:, 1]

            if not (self.degenerated):
                # verts = [tuple(self.apex),
                #         tuple(a1),
                #         tuple(b1),
                #         tuple(self.apex)
                #        ]
                verts = [
                    tuple(self.apex),
                    tuple(self.apex + kwargs["length"] * self.u),
                    tuple(self.apex + kwargs["length"] * self.v),
                    tuple(self.apex),
                ]
                codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]
            else:
                if geu.ccw(a0, b0, b1) ^ geu.ccw(b0, b1, a1):
                    verts = [tuple(b0), tuple(a1), tuple(b1), tuple(a0), tuple(b0)]

                else:
                    verts = [tuple(b0), tuple(b1), tuple(a1), tuple(a0), tuple(b0)]

                codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]

        path = Path(verts, codes)

        if "fig" not in kwargs:
            fig = plt.figure(figsize=(10, 10))
        else:
            fig = kwargs["fig"]
        if "ax" not in kwargs:
            ax = fig.add_subplot(111)
        else:
            ax = kwargs["ax"]

        ax.plot(
            [self.apex[0], self.apex[0] + kwargs["length"] * self.u[0]],
            [self.apex[1], self.apex[1] + kwargs["length"] * self.u[1]],
            lw=1,
            color="b",
        )
        ax.plot(
            [self.apex[0], self.apex[0] + kwargs["length"] * self.v[0]],
            [self.apex[1], self.apex[1] + kwargs["length"] * self.v[1]],
            lw=1,
            color="r",
        )
        theta1 = np.arctan2(self.u[1], self.u[0]) * 180 / np.pi
        print theta1
        theta2 = np.arctan2(self.v[1], self.v[0]) * 180 / np.pi
        print theta2
        angle = self.angle * 180 / np.pi
        print angle
        arc = patches.Arc(
            (self.apex[0], self.apex[1]), kwargs["length"], kwargs["length"], theta1=theta1, theta2=theta2, linewidth=2
        )
        ax.add_patch(arc)
        if "seg0" in self.__dict__:
            ax.plot([a0[0], b0[0]], [a0[1], b0[1]], lw=2, color="b")
        if "seg1" in self.__dict__:
            ax.plot([a1[0], b1[0]], [a1[1], b1[1]], lw=2, color="r")
        patch = patches.PathPatch(path, facecolor="orange", lw=2, alpha=0.3)
        ax.add_patch(patch)
        ax.axis("equal")
        # ax.set_xlim(-2,2)
        # ax.set_ylim(-2,2)

        return (fig, ax)
예제 #5
0
파일: cone.py 프로젝트: HSID/pylayers
    def show(self, **kwargs):
        """ show cone

        Parameters
        ----------

        length : float

        """

        defaults = {'length': 15.}
        for k in defaults:
            if k not in kwargs:
                kwargs[k] = defaults[k]

        if 'seg1' not in self.__dict__:    
            verts = [tuple(self.apex),
                     tuple(self.apex + kwargs['length'] * self.u),
                     tuple(self.apex + kwargs['length'] * self.v),
                     tuple(self.apex)
                    ]
            codes = [Path.MOVETO,
                Path.LINETO,
                Path.LINETO,
                Path.CLOSEPOLY,
            ]

        else:
            a1 = self.seg1[:,0]
            b1 = self.seg1[:,1]
            if 'seg0' not in self.__dict__:    
                a0 = self.apex
                b0 = self.apex
            else:
                a0 = self.seg0[:,0]
                b0 = self.seg0[:,1]

            if not(self.degenerated):
                #verts = [tuple(self.apex),
                #         tuple(a1),
                #         tuple(b1),
                #         tuple(self.apex)
                #        ]
                verts = [tuple(self.apex),
                     tuple(self.apex + kwargs['length'] * self.u),
                     tuple(self.apex + kwargs['length'] * self.v),
                     tuple(self.apex)
                    ]
                codes = [Path.MOVETO,
                Path.LINETO,
                Path.LINETO,
                Path.CLOSEPOLY,
                ]
            else:
                if (geu.ccw(a0,b0,b1) ^
                    geu.ccw(b0,b1,a1) ):
                    verts = [tuple(b0),
                             tuple(a1),
                             tuple(b1),
                             tuple(a0),
                             tuple(b0)
                        ]

                else:
                    verts = [tuple(b0),
                             tuple(b1),
                             tuple(a1),
                             tuple(a0),
                             tuple(b0)
                        ]

                codes = [Path.MOVETO,
                Path.LINETO,
                Path.LINETO,
                Path.LINETO,
                Path.CLOSEPOLY,
                ]


        path = Path(verts, codes)

        if 'fig' not in kwargs:
            fig = plt.figure(figsize=(10,10))
        else:
            fig = kwargs['fig']
        if 'ax' not in kwargs:    
            ax = fig.add_subplot(111)
        else:
            ax = kwargs['ax']

        ax.plot([self.apex[0],self.apex[0]+kwargs['length']*self.u[0]],
                [self.apex[1],self.apex[1]+kwargs['length']*self.u[1]],lw=1,color='b')
        ax.plot([self.apex[0],self.apex[0]+kwargs['length']*self.v[0]],
                [self.apex[1],self.apex[1]+kwargs['length']*self.v[1]],lw=1,color='r')
        if 'seg0' in self.__dict__:
            ax.plot([a0[0],b0[0]],[a0[1],b0[1]],lw=2,color='b')
        if 'seg1' in self.__dict__:
            ax.plot([a1[0],b1[0]],[a1[1],b1[1]],lw=2,color='r')
        patch = patches.PathPatch(path, facecolor='orange', lw=2, alpha=0.3)
        ax.add_patch(patch)
        ax.axis('equal')
        # ax.set_xlim(-2,2)
        # ax.set_ylim(-2,2)

        return(fig, ax)