Pain Scale

From BITPlan Wiki
Revision as of 17:51, 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

Comparative Pain Scale
# Icon Level Header text
0 Pain0.svg Example Example
1 Pain1.svg Very Mild Example Example
2 Pain2.svg Discomforting Example Example
3 Pain3.svg Tolerable Example Example
4 Pain4.svg Distressing Example Example
5 Pain5.svg Very Distressing Example Example
6 Pain6.svg Intense Example Example
7 Pain7.svg Very Intense Example Example
8 Pain8.svg Utterly Horrible Example Example
9 Pain9.svg Excruciating Unbearable Example Example
10 Pain10.svg Unimaginable Unspeakable Example Example


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