def __init__(self,*args,**kws):
       self.Not_null = True
       self._pos=None

      #inherit default attributes and functions common to all PyGeo elements. Overide
      #defaults where desired.
       Element.__init__(self,*args,**kws)
       
       self.color = kws.get("color",CYAN)
      #set defaults for keyword arguments specific to Points and derived classes.
       self.pointsize=kws.get("pointsize",.1)
       if self.label:
           self.fontsize=kws.get("fontsize",TINYFONT)
           self.fontcolor=kws.get("fontcolor",BLACK)
           self.fontXoffset=kws.get("fontXoffset",self.pointsize/10.+3)
           self.fontYoffset=kws.get("fontYoffset",self.pointsize/10.+3)
       if self.trace:
           self.tmparray=CPosition()
           self.tmparray.set(self)
           self.tracecurve=kws.get("tracecurve",True)
           self.mintrace=kws.get("mintrace",.0001)
           self.maxtrace=kws.get("maxtrace",50.)
           self.tracewidth=kws.get("tracewidth",self.pointsize/2.0)
           self.tracecolor=kws.get("tracecolor",self.color)
       self.deps=[]
class _zPoint(CPosition,Element,Z_Draw.zPoint):
   """
:definition: an O dimensional object with a defined postion on the complex plane . 
:inherits:  `class. Element`,base.CPosition, base.zdraw.zPoint 
:site ref: http://en.wikipedia.org/wiki/Complex_number
:attributes: 

   - real: the real coordinate
   - imag  the imaginary coordinate
   
:keywords: 

   inherited keywords: from `class Element`_ :

   ===========   ============================     =================  =====================
   Keyword       Definition                        Type               Default 
   ===========   ============================     =================  =====================
   color         drawn color of object            list of 3 numbers  [0,1,1] (CYAN) 
   level         visibility "level" - see GUI     integer            1
   trace         toggle for tracing function      boolean            False 
   texture       texture for Povray output        string             None
   ===========   ============================     =================  =====================

   class keywords:  

   ===========   ==========================   ===================  =====================
   pointsize     size of drawn point          numeric               .1 
   label         label rendered for point     string                 None 
   tracewidth    width of trace curve         numeric                pointsize/2  
   tracecolor    color of trace curve         list of 3 numbers      color
   fontsize      fontsize of label            constant               TINYFONT
   fontcolor     color of label font          constant               BLACK
   fontXoffset   horizontal offset of label   numeric                pointsize/10.+ 3.0
   fontYoffset   vertical offset of label     numeric                pointsize/10.+ 3.0
   ===========   ==========================   ===================  =====================
   """
   __slots__= ("_pos","args","Not_null")
   __opts__= Element.__opts__[:] + ["pointsize","tracewidth","tracecolor",
                                    "maxtrace","mintrace", "fontsize",
                                    "fontcolor","fontXofffset","fontYofffset","tracecurve"]
   def __init__(self,*args,**kws):
       self.Not_null = True
       self._pos=None

      #inherit default attributes and functions common to all PyGeo elements. Overide
      #defaults where desired.
       Element.__init__(self,*args,**kws)
       
       self.color = kws.get("color",CYAN)
      #set defaults for keyword arguments specific to Points and derived classes.
       self.pointsize=kws.get("pointsize",.1)
       if self.label:
           self.fontsize=kws.get("fontsize",TINYFONT)
           self.fontcolor=kws.get("fontcolor",BLACK)
           self.fontXoffset=kws.get("fontXoffset",self.pointsize/10.+3)
           self.fontYoffset=kws.get("fontYoffset",self.pointsize/10.+3)
       if self.trace:
           self.tmparray=CPosition()
           self.tmparray.set(self)
           self.tracecurve=kws.get("tracecurve",True)
           self.mintrace=kws.get("mintrace",.0001)
           self.maxtrace=kws.get("maxtrace",50.)
           self.tracewidth=kws.get("tracewidth",self.pointsize/2.0)
           self.tracecolor=kws.get("tracecolor",self.color)
       self.deps=[]


   def __description(self, precision):
       if self.real != 0.:
           return self.__class__.__name__ + "(%.*g%+.*gj)"%(precision, 
                                             self.real, precision, self.imag)
       else:
           return self.__class__.__name__ + "%.*gj"%(precision, self.imag)


   def __repr__(self):
       return self.__description(self.PREC_REPR)


   def __str__(self):
       return self.__description(self.PREC_STR)
  
   def do_trace(self):
      #If, on update, traced point has moved within limits defined by
      #'mintrace' and 'maxtrace' append its new position to the trace
      #curve

      delta= self.distance(self.tmparray)
      if (self.mintrace < delta < self.maxtrace):
          from pygeo.classes_complex.z_points import zFixedPoint
          self.rtrace.append(zFixedPoint(self.real,self.imag,pointsize=self.pointsize,color=self.tracecolor,
                  level=self.level))
          if self.tracecurve:
             self.ntrace.append(pos=self.pos)
      self.tmparray.set(self)

   def reset_trace(self):
      #Re-intialize list of traced curves to None"""
      if self.trace:
         for r in self.rtrace:
            r.show=False
            r.setshow()
         self.rtrace=[]
         self.tmparrayset(self)

   def reset_trace_curves(self):
      #Re-intialize list of traced curves to None"""
      if self.trace:
         self.ntrace.pos=[]
   
   def _findSelf(self):
       return True


   def _redraw(self):
      #If point is to be rendered, filter its postion to within drawing
      #range and set the position of the VPython sphere object,
      #representing the point, to the filtered position. Same as to any associated
      #label to be rendered.

       self.rend[0].pos =self.pos
       if self.label:
           self.lab.pos= self.pos

   def transform(self,mat,w_point):
       try:
          t1=inverse(mat)
       except LinAlgError:
          return False
       t2= conjugate(t1)
       t3= transpose(t1)
       h=Hermitian(matrixmultiply(t3,matrixmultiply(self.setHermitian(),t2)))
       w_point.from_hermitian(h)
       return True

   def uRotate(self,ucenter,angle):
       h_angle=angle/2.
       cs=cos(h_angle)
       sn=sin(h_angle)
       a=complex(cs,ucenter.z*sn)
       b=complex(-ucenter.y,ucenter.x)*sn
       c=-b.conjugate()
       d=a.conjugate()
       mat1=([[a,b],[c,d]])
       mat2=self.homogenous()
       self.toC(matrixmultiply(mat1,mat2))
       return True

   def toC(self,h_array):
       self.set(h_array[0]/h_array[1])
       return True
    
   def uVector(self):
       modplus=self.mod2()+1
       modminus=self.mod2()-1
       xy=2*self/modplus
       z=modminus/modplus
       return vector(xy.real,xy.imag,z)   

   def to_uSphere(self,upoint): 
       upoint.set(self.uVector())
       return True
  
       
 
   def from_hermitian(self,h):
       self.set(-h.C/h.A)
 

   def setHermitian(self):
       A=1
       C=-self
       B=C.conjugate()
       D = B*C
       self._hermitian = Hermitian(conjugate(transpose(array([[A,B],[C,D]]))))
       return self._hermitian