Spaces:
Sleeping
Sleeping
| import sys | |
| from io import StringIO | |
| import streamlit as st | |
| import numpy as np | |
| from PIL import Image, ImageDraw, ImageColor | |
| from canvas import * | |
| from streamlit_ace import st_ace | |
| import extra_streamlit_components as stx | |
| from sewar.full_ref import uqi | |
| from lines import * | |
| from triangle import * | |
| from circle import * | |
| st.set_page_config(page_title="How to play Shape Puzzle", page_icon=":notebook:") | |
| with st.sidebar: | |
| color = st.color_picker('color picker', '#00f900', key='l_c') | |
| st.write(ImageColor.getrgb(color)) | |
| st.header("Chapter 2: Arcs and Circles") | |
| st.write("##") | |
| st.divider() | |
| with st.expander("Tutorial No.1: Circles in different way of drawing"): | |
| st.markdown("#### Let's start with circle functions.") | |
| st.markdown( | |
| """ | |
| 1. Easy like previously, define or claim the key variables, then call the function to draw a circle. | |
| Be aware that once the size or circle are larger than our size of canvas, that part would not be shown on the canvas. | |
| ```python | |
| ## Claim the center and radiu | |
| center = (100, -100) | |
| radiu = 400 | |
| ## Call the function | |
| circle_c_r(center, radiu, fill = (201, 30, 30), color = (201, 30, 30)) | |
| ``` | |
| Now, by simply design the center of circles and the radius, you can generate some cool design, for example | |
| ```python | |
| ## Claim the center and radiu | |
| center = (100, -100) | |
| radiu = 400 | |
| ## Call the function | |
| circle_c_r(center, radiu, fill = (201, 30, 30), color = (201, 30, 30)) | |
| c1 = (150, -80) | |
| r1 = 150 | |
| circle_c_r(c1, r1, fill = 'white', color = 'white') | |
| ``` | |
| 2. Our 2nd circle function, circle_draw(): | |
| Sometimes, we might not be able to "see" the center but rather starting at a point on the canvas, | |
| with some idea of the 'size' in mind, and draw a circle to meet the starting point. | |
| This way of drawing a circle might be more natural for some design | |
| - In the code window below, define a point to start and the 'size', i.e. diameter of circle: | |
| ```python | |
| a = (-100, 0) ## the x-axis is -100 and y-axis is 0 | |
| angle = 45 ## 45 degree anti-clock wise | |
| length = 200 ## length of the drawing | |
| lineDraw(a, angle, length, width=50) ## then call our lineDraw function to draw the line | |
| ## We can also specify the width of drawing by passing parameter explicitly. | |
| ``` | |
| You should see a slant line-segment in the canvas. | |
| 3. Release the power of for-loop: | |
| The most powerful part of drawing through code is the capability of producing iterative graphs. | |
| The more detailed instruction about Python for-loops, please check [here](https://www.w3schools.com/python/python_for_loops.asp) | |
| - In the code window below, define a startinig point and using for-loop and lineDraw: | |
| ```python | |
| c = (-50,-100) ## The starting point to draw | |
| lst = [c] ## Create a list for later reference | |
| for i in range (100): ## Iterate 100 rounds | |
| l = lineDraw(lst[-1], i*125, 300, (212, 16, 16), width=2) ## Try to figure out what are we doing here? | |
| lst.append(l['end']) ## add the end-point of the line drawn to the list for the next iteration | |
| ``` | |
| 4. Now, see if you can produce a shape stated in "target shape": | |
| ```python | |
| s = (0,0) ## The starting point | |
| n = 8 ## | |
| lst = [s] | |
| #### Start your for-loop here #### | |
| #### End of your for-loop #### | |
| ``` | |
| Having fun!! | |
| """ | |
| ) | |
| st.divider() | |
| st.markdown("###### Write your code here") | |
| ## Code input | |
| code1 = st_ace(language="python", theme="tomorrow_night_bright", keybinding="vscode", font_size=14, tab_size=4, show_gutter=True, min_lines=10, key="ace",) | |
| o1, o2 = st.columns(2) | |
| if code1: | |
| ImageDraw.Draw(img).rectangle([(0, 0), (c_length,c_height)], fill = c_color, outline = c_outline, width=2) | |
| redirected_output = sys.stdout = StringIO() | |
| try: | |
| exec(code1) | |
| result = str(redirected_output.getvalue()) | |
| st.code(result) | |
| except Exception as e: | |
| st.code(str(e)) | |
| with o1: | |
| st.markdown("##### Target Shape:"); target = Image.open('image/T1_t.jpg') | |
| t2 = target.resize((c_length,c_height)) | |
| ImageDraw.Draw(img_t).rectangle([(0, 0), (c_length,c_height)], fill = c_color, outline = c_outline, width=2) | |
| img_t.paste(t2); st.image(img_t); st.session_state['imt'] = np.array(img_t) | |
| with o2: | |
| st.markdown("##### Output Shape"); st.image(img, caption=''); st.session_state['imo'] = np.array(img) | |
| sim = round(uqi(st.session_state['imt'],st.session_state['imo']),4) | |
| st.write(f"The similarity score between target and output: {sim}") |