Pain Scale: Difference between revisions
Jump to navigation
Jump to search
| Line 96: | Line 96: | ||
echo "generating pain icon for $pain" | echo "generating pain icon for $pain" | ||
onepain $pain $color $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg | onepain $pain $color $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg | ||
pain=$(($pain+1)) | |||
done | |||
</source> | |||
= Script with RGB Conversion (for Wikimedia Commons = | |||
<source lang='bash'> | |||
#!/bin/bash | |||
# WF 2021-08-04 | |||
# | |||
# create 0-10 painscale svg images | |||
# | |||
# (c) Copyright 2021 Wolfgang Fahl | |||
# see http://wiki.bitplan.com/index.php/Pain_Scale | |||
# | |||
# | |||
# convert hsl to rgb | |||
# | |||
hsl2grb() { | |||
local l_hue="$1" | |||
local l_sat="$2" | |||
local l_lum="$3" | |||
# https://stackoverflow.com/a/2353265/1497139 | |||
python -c "import sys;import colorsys;argv=sys.argv[1:];hs=argv[0];ss=argv[1];ls=argv[2];h=float(hs)/360;s=float(ss)/100;l=float(ls)/100;r,g,b=colorsys.hls_to_rgb(h, l, s);rgbStr=f'rgb({(r*256):3.0f},{(g*256):3.0f},{(b*256):3.0f})';print (rgbStr)" "$l_hue" "$l_sat" "$l_lum" | |||
} | |||
# | |||
# generate a single pain icon | |||
# | |||
onepain() { | |||
# pain level on a scale from 0 to 11 | |||
local l_pain="$1" | |||
# (hue degree in HSL color space) | |||
local l_hue="$2" | |||
# mouth y position | |||
local l_mouthy="$3" | |||
# mouth expression x and y arc | |||
local l_mouthrx="$4" | |||
local l_mouthry="$5" | |||
# which route to sweep | |||
local l_sweepflag="$6" | |||
local sat="80" | |||
# get eyecolor | |||
local l_eyecolor=$(hsl2grb $l_hue $sat 30) | |||
# get mouth color | |||
local l_mouthcolor="$l_eyecolor" | |||
# start/stop colors | |||
local startcolor1=$(hsl2grb $hue $sat 70) | |||
local stopcolor1=$(hsl2grb $hue $sat 60) | |||
local stopcolor2=$(hsl2grb $hue $sat 50) | |||
local stopcolor3=$(hsl2grb $hue $sat 40) | |||
cat << EOF | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<!-- Copyright (c) 2021 Wolfgang Fahl see http://wiki.bitplan.com/index.php/Pain_Scale --> | |||
<svg | |||
xmlns:svg="http://www.w3.org/2000/svg" | |||
xmlns="http://www.w3.org/2000/svg" | |||
width="210mm" | |||
height="210mm" | |||
id="pain${l_pain}" | |||
version="1.1" | |||
viewBox="0 0 220 220"> | |||
<defs> | |||
<!-- radial Gradient --> | |||
<radialGradient | |||
id="grad1" gradientUnits="userSpaceOnUse"> | |||
<stop offset="0%" style="start-color:$startcolor1;stop-color:$stopcolor1; "/> | |||
<stop offset="70%" style="stop-color:$stopcolor2; "/> | |||
<stop offset="100%" style="stop-color:$stopcolor3; "/> | |||
</radialGradient> | |||
</defs> | |||
<!-- face --> | |||
<circle cx="105" cy="105" r="100" style="fill:url(#grad1);" stroke="black" | |||
stroke-width="2" ></circle> | |||
<!-- eyes --> | |||
<circle id="lefteye" cx= "65" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle> | |||
<circle id="righteye" cx="145" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle> | |||
<!-- mouth --> | |||
<path id="mouth" d="M 35 $l_mouthy A $l_mouthrx $l_mouthry 0 0 $l_sweepflag 175 $l_mouthy" stroke="$l_mouthcolor" fill="none" stroke-width="5"/> | |||
</svg> | |||
EOF | |||
} | |||
# for test should give rgb 158,233,53 | |||
#hsl2grb 85 80 56 | |||
pain=0 | |||
while [ $pain -lt 11 ] | |||
do | |||
hue=$((100-pain*10)) | |||
mouthy=$((105+pain*6)) | |||
sweepflag=0 | |||
factor=$((5-pain)) | |||
if [ $pain -ge 5 ] | |||
then | |||
factor=$((pain-5)) | |||
sweepflag=1 | |||
fi | |||
mouthrx=$((205-factor*10)) | |||
mouthry=$((factor*90)) | |||
echo "generating pain icon for $pain" | |||
onepain $pain "$hue" $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg | |||
pain=$(($pain+1)) | pain=$(($pain+1)) | ||
done | done | ||
</source> | </source> | ||
Revision as of 16:14, 4 August 2021
see https://en.wikipedia.org/wiki/Pain_scale
You may use the painscale icons below under Creative Commons CC BY 4.0
The idea of the above pain scale icons is to generate them programmatically to give a proportional expression in terms of color and mouth expression. The following script creates the above icons:
generate pain scale icons
#!/bin/bash
# WF 2021-08-04
#
# create 0-10 painscale svg images
#
# (c) Copyright 2021 Wolfgang Fahl
# see http://wiki.bitplan.com/index.php/Pain_Scale
#
#
# generate a single pain icon
#
onepain() {
# pain level on a scale from 0 to 11
local l_pain="$1"
# color (hue in HSL space)
local l_color="$2"
# mouth y position
local l_mouthy="$3"
# mouth expression x and y arc
local l_mouthrx="$4"
local l_mouthry="$5"
# which route to sweep
local l_sweepflag="$6"
local l_sat="80%"
cat << EOF
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Copyright (c) 2021 Wolfgang Fahl see http://wiki.bitplan.com/index.php/Pain_Scale -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="210mm"
height="210mm"
id="pain${l_pain}"
version="1.1"
viewBox="0 0 220 220">
<defs>
<!-- radial Gradient -->
<radialGradient
id="grad1" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="start-color:hsl($l_color,$l_sat,70%);stop-color:hsl($l_color,$l_sat,60%); "/>
<stop offset="70%" style="stop-color:hsl($l_color,$l_sat,50%); "/>
<stop offset="100%" style="stop-color:hsl($l_color,$l_sat,40%); "/>
</radialGradient>
</defs>
<!-- face -->
<circle cx="105" cy="105" r="100" style="fill:url(#grad1);" stroke="black"
stroke-width="2" ></circle>
<!-- eyes -->
<circle id="lefteye" cx= "65" cy="65" r="12" style="fill:hsl($l_color,$l_sat,30%)" ></circle>
<circle id="righteye" cx="145" cy="65" r="12" style="fill:hsl($l_color,$l_sat,30%)" ></circle>
<!-- mouth -->
<path id="mouth" d="M 35 $l_mouthy A $l_mouthrx $l_mouthry 0 0 $l_sweepflag 175 $l_mouthy" stroke="hsl($l_color,$l_sat,30%)" fill="none" stroke-width="5"/>
</svg>
EOF
}
pain=0
while [ $pain -lt 11 ]
do
color=$((100-pain*10))
mouthy=$((105+pain*6))
sweepflag=0
factor=$((5-pain))
if [ $pain -ge 5 ]
then
factor=$((pain-5))
sweepflag=1
fi
mouthrx=$((205-factor*10))
mouthry=$((factor*90))
echo "generating pain icon for $pain"
onepain $pain $color $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg
pain=$(($pain+1))
done
Script with RGB Conversion (for Wikimedia Commons
#!/bin/bash
# WF 2021-08-04
#
# create 0-10 painscale svg images
#
# (c) Copyright 2021 Wolfgang Fahl
# see http://wiki.bitplan.com/index.php/Pain_Scale
#
#
# convert hsl to rgb
#
hsl2grb() {
local l_hue="$1"
local l_sat="$2"
local l_lum="$3"
# https://stackoverflow.com/a/2353265/1497139
python -c "import sys;import colorsys;argv=sys.argv[1:];hs=argv[0];ss=argv[1];ls=argv[2];h=float(hs)/360;s=float(ss)/100;l=float(ls)/100;r,g,b=colorsys.hls_to_rgb(h, l, s);rgbStr=f'rgb({(r*256):3.0f},{(g*256):3.0f},{(b*256):3.0f})';print (rgbStr)" "$l_hue" "$l_sat" "$l_lum"
}
#
# generate a single pain icon
#
onepain() {
# pain level on a scale from 0 to 11
local l_pain="$1"
# (hue degree in HSL color space)
local l_hue="$2"
# mouth y position
local l_mouthy="$3"
# mouth expression x and y arc
local l_mouthrx="$4"
local l_mouthry="$5"
# which route to sweep
local l_sweepflag="$6"
local sat="80"
# get eyecolor
local l_eyecolor=$(hsl2grb $l_hue $sat 30)
# get mouth color
local l_mouthcolor="$l_eyecolor"
# start/stop colors
local startcolor1=$(hsl2grb $hue $sat 70)
local stopcolor1=$(hsl2grb $hue $sat 60)
local stopcolor2=$(hsl2grb $hue $sat 50)
local stopcolor3=$(hsl2grb $hue $sat 40)
cat << EOF
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Copyright (c) 2021 Wolfgang Fahl see http://wiki.bitplan.com/index.php/Pain_Scale -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="210mm"
height="210mm"
id="pain${l_pain}"
version="1.1"
viewBox="0 0 220 220">
<defs>
<!-- radial Gradient -->
<radialGradient
id="grad1" gradientUnits="userSpaceOnUse">
<stop offset="0%" style="start-color:$startcolor1;stop-color:$stopcolor1; "/>
<stop offset="70%" style="stop-color:$stopcolor2; "/>
<stop offset="100%" style="stop-color:$stopcolor3; "/>
</radialGradient>
</defs>
<!-- face -->
<circle cx="105" cy="105" r="100" style="fill:url(#grad1);" stroke="black"
stroke-width="2" ></circle>
<!-- eyes -->
<circle id="lefteye" cx= "65" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle>
<circle id="righteye" cx="145" cy="65" r="12" style="fill:$l_eyecolor" stroke="black" stroke-width="1" ></circle>
<!-- mouth -->
<path id="mouth" d="M 35 $l_mouthy A $l_mouthrx $l_mouthry 0 0 $l_sweepflag 175 $l_mouthy" stroke="$l_mouthcolor" fill="none" stroke-width="5"/>
</svg>
EOF
}
# for test should give rgb 158,233,53
#hsl2grb 85 80 56
pain=0
while [ $pain -lt 11 ]
do
hue=$((100-pain*10))
mouthy=$((105+pain*6))
sweepflag=0
factor=$((5-pain))
if [ $pain -ge 5 ]
then
factor=$((pain-5))
sweepflag=1
fi
mouthrx=$((205-factor*10))
mouthry=$((factor*90))
echo "generating pain icon for $pain"
onepain $pain "$hue" $mouthy $mouthrx $mouthry $sweepflag> /tmp/pain$pain.svg
pain=$(($pain+1))
done