{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cd50d796-3660-417f-ac6f-8db6ec6db8ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from dash import dcc, html\n",
    "from dash.dependencies import Output, Input\n",
    "import dash_bootstrap_components as dbc\n",
    "from jupyter_dash import JupyterDash\n",
    "import plotly.graph_objects as go\n",
    "import warnings\n",
    "\n",
    "warnings.filterwarnings('ignore') \n",
    "app = JupyterDash(external_stylesheets=[dbc.themes.FLATLY])\n",
    "\n",
    "name=['a','b','n','p1','p2','q']\n",
    "value=[[1,5,1,1],[1,5,1,4],[1,5,1,1],[-4,4,2,-1],[-4,4,2,-1],[1,5,1,1]]\n",
    "mark=[{i: {'label': str(i), 'style': {'fontSize': 18}} \n",
    "       for i in range(v[0], v[1] + 1, v[2])} for v in value]\n",
    "tooltip={'placement':'bottom','always_visible':True}\n",
    "rows=[dbc.Row([dbc.Col([html.H4(name)], width=1),\n",
    "               dbc.Col([dcc.Slider(id=name, min=v[0], max=v[1], value=v[3], \n",
    "                                   marks=mk,step=0.1,tooltip='tooltip')])], \n",
    "              style={'height': '8vh'})\n",
    "      for name, v, mk in zip(name, value, mark)]\n",
    "sidebar=html.Div([dbc.Row([html.Br()],style={\"height\": \"13vh\"}),*rows])\n",
    "\n",
    "content = html.Div([\n",
    "    dbc.Row([dbc.Col([dcc.Graph(id='graph', figure={})])]),\n",
    "    dbc.Row([dcc.Interval(id='interval-component',interval=1*1000, n_intervals=0)])])\n",
    "\n",
    "@app.callback(\n",
    "    Output('graph', 'figure'),\n",
    "    [Input(sid, 'value') for sid in name],Input('interval-component', 'n_intervals'))\n",
    "\n",
    "def update_figure(a,b,n,p1,p2,q,interval):\n",
    "    layout=go.Layout(width=700,height=700,yaxis_scaleanchor='x',\n",
    "                     font_size=22,font_color='darkblue',hoverlabel_font_size=25,\n",
    "                     title=dict(text='Gielis Curve',x=0.5,y=0.9),showlegend=False)\n",
    "    t=np.linspace(0,40*np.pi+0.1,5000)    \n",
    "    r=(np.abs(1/a*np.cos(n*t/4))**p1+np.abs(1/b*np.sin(n*t/4))**p2)**(-1/q)\n",
    "    x,y=r*np.cos(t),r*np.sin(t)\n",
    "    fig=go.Figure(go.Scatter(x=x,y=y),layout=layout)\n",
    "    \n",
    "    return fig\n",
    "\n",
    "app.layout = dbc.Container(\n",
    "    [dbc.Row([dbc.Col(sidebar, width=4),dbc.Col(content, width=8)])],fluid=True)\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    app.run(host='127.0.0.1',port=8050)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "287e0080-e6b5-4269-831f-d5649183735a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
