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)
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()
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()
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)
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)