Pain Scale

From BITPlan Wiki
Revision as of 17:45, 4 August 2021 by Wf (talk | contribs)
Jump to navigation Jump to search

see https://en.wikipedia.org/wiki/Pain_scale see

You may use the painscale icons below under Creative Commons CC BY 4.0

Pain0.svg Pain1.svg Pain2.svg Pain3.svg Pain4.svg Pain5.svg Pain6.svg Pain7.svg Pain8.svg Pain9.svg Pain10.svg

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 Icons are also available at Wikimedia Commons:

  1. https://commons.wikimedia.org/wiki/File:Pain0.svg
  2. https://commons.wikimedia.org/wiki/File:Pain1.svg
  3. https://commons.wikimedia.org/wiki/File:Pain2.svg
  4. https://commons.wikimedia.org/wiki/File:Pain3.svg
  5. https://commons.wikimedia.org/wiki/File:Pain4.svg
  6. https://commons.wikimedia.org/wiki/File:Pain5.svg
  7. https://commons.wikimedia.org/wiki/File:Pain6.svg
  8. https://commons.wikimedia.org/wiki/File:Pain7.svg
  9. https://commons.wikimedia.org/wiki/File:Pain8.svg
  10. https://commons.wikimedia.org/wiki/File:Pain9.svg
  11. https://commons.wikimedia.org/wiki/File:Pain10.svg
900px-Pain1.svg.png


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