from manimlib.imports import *

class ElementaryArea(GraphScene):
    CONFIG = {
        "x_min" : 0,
        "x_max" : 2,
        "y_min" : 0,
        "y_max" : 2, 
        "x_tick_frequency" : 1,
        "y_tick_frequency" : 1,
     #   "x_labeled_nums": list(np.arange(0,3)),
      #  "y_labeled_nums": list(np.arange(0 ,3)),
        "x_axis_width": 6,
        "y_axis_height": 6,
        "graph_origin": ORIGIN+3.5*LEFT+3.5*DOWN,    
    }

    def construct(self):
        X = self.x_axis_width/(self.x_max- self.x_min)
        Y = self.y_axis_height/(self.y_max- self.y_min)
        self.X=X ;self.Y=Y 
        self.setup_axes(animate=False)
        
        caption=TextMobject("The elementary area in ").to_edge(UP)
        rect_text=TextMobject("Cartesian Coordinates").next_to(caption,DOWN,)
        polar_text=TextMobject("Polar Coordinates").next_to(caption,DOWN,) 
        
        self.add(caption)
        self.play(Write(rect_text))
        self.get_rect_element()
    #    self.play(Write(polar_text))
        self.play(ReplacementTransform(rect_text,polar_text),
          FadeOut(VGroup(self.dydx,self.rect_brace_gr)))
        self.get_polar_element()
        
        
        
    def get_rect_element(self):
        rect=Rectangle(
            height=2, width=3,fill_color=BLUE_D,
            fill_opacity=1, color=BLUE_D
            ).scale(.75).move_to(
            self.graph_origin+(RIGHT*self.X+UP*self.Y)
            )
        dx_brace=Brace(rect, DOWN, buff = SMALL_BUFF)
        dx_label=dx_brace.get_text("$dx$", buff = SMALL_BUFF)
        dx_brace_gr=VGroup(dx_brace,dx_label)
        
        dy_brace=Brace(rect,RIGHT, buff = SMALL_BUFF)
        dy_label=dy_brace.get_text("$dy$", buff = SMALL_BUFF)
        dy_brace_gr=VGroup(dy_brace,dy_label)
        
        brace_gr=VGroup(dx_brace_gr,dy_brace_gr)
        
        dydx=TextMobject("$dxdy$",color=BLACK).next_to(rect,IN)

        self.play(FadeIn(rect))
        self.play(GrowFromCenter(brace_gr))
        self.play(GrowFromCenter(dydx))
                 
        self.rect=rect
        self.rect_brace_gr=brace_gr
        self.dydx=dydx
        self.wait(2)
  
        
    def  get_polar_element(self):
        X=self.X ;Y=self.Y 
        theta1=25*DEGREES
        dtheta=TAU/12
        r_in=1.3*X ; r_out=1.9*X
        
        arc=AnnularSector(
        arc_center=self.graph_origin,
        inner_radius=r_in,
        outer_radius=r_out ,
        angle= dtheta,
        start_angle= theta1,
        fill_opacity= 1,
        stroke_width= 0,
        color= BLUE_D, 
        )
        
        
    # # #getting braces
        r_in_theta1=self.graph_origin+r_in*(np.cos(theta1)*RIGHT+np.sin(theta1)*UP)
        dr_line=Line(r_in_theta1,r_in_theta1+RIGHT*(r_out-r_in))
        dr_brace=Brace(dr_line, DOWN, buff = SMALL_BUFF
            ).rotate(theta1, about_point=r_in_theta1
            )
        dr_label=dr_brace.get_text("$dr$", buff = SMALL_BUFF)
        dr_brace_gr=VGroup(dr_brace,dr_label)
        
        theta2=theta1+dtheta
        r_out_theta2=self.graph_origin+r_out*(
            np.cos(theta2)*RIGHT+np.sin(theta2)*UP
            )
        rdt_line=Line(r_out_theta2,r_out_theta2
            +DOWN*(r_out*dtheta)
            )
        rdt_brace=Brace(rdt_line, RIGHT, 
            buff = MED_SMALL_BUFF).rotate(
            theta2-(dtheta/2), about_point=r_out_theta2
            )
        rdt_label=rdt_brace.get_text("$rd\\theta$",buff = SMALL_BUFF)
        rdt_brace_gr=VGroup(rdt_brace,rdt_label)
   
   #getting label r and dtheta 
        r1=DashedLine(self.graph_origin,r_in_theta1).set_color(RED)
        r2=DashedLine(self.graph_origin,r_out_theta2).set_color(RED)   
        r_brace=Brace(r1, DOWN, buff = SMALL_BUFF).rotate(theta1, about_point=self.graph_origin)
        r_label=r_brace.get_text("$r$", buff = SMALL_BUFF)
        r_brace_gr=VGroup(r_brace,r_label)
        
        dtheta_arc=Arc(
        arc_center=self.graph_origin,
        radius=.5*X,
        angle= dtheta,
        start_angle=  theta1,
        )
        dtheta_arc_label=TextMobject("$d\\theta$").move_to(.99*dtheta_arc.get_corner(UR))
        dtheta_label=VGroup(dtheta_arc,dtheta_arc_label)
        
        
        rdrdt=TextMobject("$rdrd\\theta$",color=BLACK).next_to(arc,IN)
        self.play(ReplacementTransform(self.rect,arc))
        self.wait()
        self.play(ShowCreation(r1),
                ShowCreation(r2)
                )
        self.play(ShowCreation(r_brace_gr),
                Write(dtheta_label)
                )
        self.wait()
        self.play(GrowFromCenter(rdt_brace_gr))
        self.wait(.5)
        self.play(GrowFromCenter(dr_brace_gr))
        self.wait(.5)
        self.play(GrowFromCenter(rdrdt))
        
        self.wait(2)
        
        
  #uploaded by Somnath Pandit.FSF2020_Double_Integral