Pain Scale

From BITPlan Wiki
Revision as of 06:34, 7 August 2021 by Wf (talk | contribs) (→‎Properly PNG rendered icons)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

see the 2002 web article by - Jack Harich

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

Comparative Pain Scale
# Icon Level Name Description
0 Pain0.svg.png No pain. Feeling perfectly normal.
1 Pain1.svg.png Minor
Does not interfere with most activities.
Able to adapt to pain psychologically and with medication or devices such as cushions.
Very Mild Very light barely noticeable pain, like a mosquito bite or a poison ivy itch.


Most of the time you never think about the pain.

2 Pain2.svg.png Discomforting Minor pain, like lightly pinching the fold of skin between the thumb and first finger with the other hand, using the fingernails.


Note that people react differently to this self-test.

3 Pain3.svg.png Tolerable Very noticeable pain, like an accidental cut, a blow to the nose causing a bloody nose, or a doctor giving you an injection.

The pain is not so strong that you cannot get used to it. Eventually, most of the time you don’t notice the pain. You have adapted to it.

4 Pain4.svg.png Moderate
Interferes with many activities.

Requires lifestyle changes but patient remains independent.
Unable to adapt to pain.

Distressing Strong, deep pain, like an average toothache, the initial pain from a bee sting, or minor trauma to part of the body, such as stubbing your toe real hard.

So strong you notice the pain all the time and cannot completely adapt.
This pain level can be simulated by pinching the fold of skin between the thumb and first finger with the other hand, using the fingernails, and squeezing real hard.
Note how the similated pain is initially piercing but becomes dull after that

5 Pain5.svg.png Very Distressing Strong, deep, piercing pain, such as a sprained ankle when you stand on it wrong, or mild back pain.

Not only do you notice the pain all the time, you are now so preoccupied with managing it that you normal lifestyle is curtailed.
Temporary personality disorders are frequent.

6 Pain6.svg.png Intense Strong, deep, piercing pain so strong it seems to partially dominate your senses, causing you to think somewhat unclearly.

At this point you begin to have trouble holding a job or maintaining normal social relationships.
Comparable to a bad non-migraine headache combined with several bee stings, or a bad back pain.

7 Pain7.svg.png Severe
Unable to engage in normal activities.

Patient is disabled and unable to function independently.

Very Intense Same as 6 except the pain completely dominates your senses, causing you to think unclearly about half the time.

At this point you are effectively disabled and frequently cannot live alone.
Comparable to an average migraine headache.

8 Pain8.svg.png Utterly Horrible Pain so intense you can no longer think clearly at all, and have often undergone severe personality change if the pain has been present for a long time.

Suicide is frequently contemplated and sometimes tried.
Comparable to childbirth or a real bad migraine headache.

9 Pain9.svg.png Excruciating Unbearable Pain so intense you cannot tolerate it and demand pain killers or surgery, no matter what the side effects or risk.

If this doesn’t work, suicide is frequent since there is no more joy in life whatsoever.
Comparable to throat cancer.

10 Pain10.svg.png Unimaginable Unspeakable Pain so intense you will go unconscious shortly.

Most people have never experienced this level of pain.
Those who have suffered a severe accident, such as a crushed hand, and lost consciousness as a result of the pain and not blood loss, have experienced level 10.


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 Category:Pain Scale. Click on any of the icons above to get to those files. Please note that the SVG gradient used is not properly rendered in the PNG preview of the files as of 2021-08.

Properly PNG rendered icons

The properly rendered icons are: Pain 0 png rendered.png Pain 1 png rendered.png Pain 2 png rendered.png Pain 3 png rendered.png Pain 4 png rendered.png Pain 5 png rendered.png Pain 6 png rendered.png Pain 7 png rendered.png Pain 8 png rendered.png Pain 9 png rendered.png Pain 10 png rendered.png

The following script creates the above icons:

generate pain scale icons

Since the HSL color space is used directly you'll need SVG 2 support to render these. If you have an older library use the script for the Wikimedia Commons below.

#!/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

Works around https://phabricator.wikimedia.org/T288103

#!/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