BASH, двугранный угол с четырьмя точками

Точки:

A -2.08576        1.76533       -0.46417
B -0.95929        0.87554        0.03365
C  0.28069        1.66193        0.42640
D  0.62407        2.22927       -0.44649

До сих пор я сделал:

#!/bin/bash
awk 'NR==1' $FILE > LINEA
awk 'NR==1' $FILE > LINEB
awk 'NR==1' $FILE > LINEC
awk 'NR==1' $FILE > LINED
x1=`awk '{print $2}' LINEA` # x1
y1=`awk '{print $3}' LINEA` # y1
z1=`awk '{print $4}' LINEA` # z1
x2=`awk '{print $2}' LINEB` # x2
y2=`awk '{print $3}' LINEB` # y2
z2=`awk '{print $4}' LINEB` # z2
x3=`awk '{print $2}' LINEC` # x3
y3=`awk '{print $3}' LINEC` # y3
z3=`awk '{print $4}' LINEC` # z3
x4=`awk '{print $2}' LINED` # x4
y4=`awk '{print $3}' LINED` # y4
z4=`awk '{print $4}' LINED` # z4
v1x=`calc "($x1)-($x2)" | sed 's/^\t//g'`
v1y=`calc "($y1)-($y2)" | sed 's/^\t//g'`
v1z=`calc "($z1)-($z2)" | sed 's/^\t//g'`
v2x=`calc "($x4)-($x3)" | sed 's/^\t//g'`
v2y=`calc "($y4)-($y3)" | sed 's/^\t//g'`
v2z=`calc "($z4)-($z3)" | sed 's/^\t//g'`
v1mag=`calc "sqrt(($v1x)**2+($v1y)**2+($v1z)**2)" | sed 's/^\t//g'`
v2mag=`calc "sqrt(($v2x)**2+($v2y)**2+($v2z)**2)" | sed 's/^\t//g'`
calc "acos((($v1x)/($v1mag))*(($v2x)/($v2mag))+(($v1y)/($v1mag))*(($v2y)/($v2mag))+(($v1z)/($v1mag))*(($v2z)/($v2mag)))*180/3.141592653589793" | sed 's/^\t//g' | sed 's/^~//g'
calc "acos((($x1)*($x4)+($y1)*($y4)+($z1)*($z4))/(sqrt(($x1)**2+($y1)**2+($z1)**2)*sqrt(($x4)**2+($y4)**2+($z4)**2)))*180/3.141592653589793" | sed 's/^\t//g' | sed 's/^~//g'

Я нашел эти связанные ссылки 1, 2 и 3.

Ссылочное значение 58.7 $^{o}$

Значение, которое я получаю: 70.62525933704842342761 $^{o}$ и 64.23010091217222985704 $^{o}$

Кто-нибудь знает, какой алгоритм лучше всего подходит для его правильного получения?


person Another.Chemist    schedule 09.10.2017    source источник
comment
Итак, результат должен быть -58.7 ?   -  person RomanPerekhrest    schedule 09.10.2017
comment
bash действительно неправильный язык для использования здесь. Вы могли бы (почти) сделать все это с помощью одного сценария awk, но использование надлежащего языка программирования общего назначения было бы намного проще.   -  person chepner    schedule 09.10.2017
comment
Вы намеренно намеревались перенаправить только первую строку данных примера в каждый из файлов LINE[A-D]? Многое легко сделать за один процесс awk. Удачи.   -  person shellter    schedule 09.10.2017
comment
@RomanPerekhrest да, нашел с помощью графического инструмента   -  person Another.Chemist    schedule 09.10.2017
comment
@shellter Это часть большого кода. Но спасибо за ваш дружеский комментарий.   -  person Another.Chemist    schedule 09.10.2017
comment
@chepner, да, я полностью согласен, я бы предпочел сделать это на C++. Но моя большая проблема заключается в том, что я не знаю, какой алгоритм будет лучшим для нахождения угла кручения, и я также не умею работать с awk.   -  person Another.Chemist    schedule 09.10.2017
comment
как лучше всего найти угол кручения: по-видимому, существует множество способов его вычисления: см. stackoverflow.com/questions/20305272/ . Удачи.   -  person shellter    schedule 09.10.2017


Ответы (3)


Основываясь на вашем усовершенствованном коде оболочки в другом месте этой темы, я также транскрибировал это в решение awk. Поскольку люди, похоже, нашли применение версии _docd, я включу ее в конец. Я также включаю отладочную версию (в середине ответа).

cat torsion2.awk

-

#!/bin/awk -f  
BEGIN {
  # dbg=0 # turns off dbg output
  # see below for debug version of this script
}
function acos(x)  { return atan2((1.-x^2)^0.5,x) }    
NR==1 {x1=$2; y1=$3; z1=$4}
NR==2 {x2=$2; y2=$3; z2=$4}
NR==3 {x3=$2; y3=$3; z3=$4}
NR==4 {
  x4=$2; y4=$3; z4=$4  
  # all of this code below is only executed when you read in the 4th line
  # because then you have all the data
  #
  v1x=x2-x1 ; v1y=y2-y1 ; v1z=z2-z1     #plane1
  v2x=x3-x2 ; v2y=y3-y2 ; v2z=z3-z2     #plane1
  v3x=x2-x3 ; v3y=y2-y3 ; v3z=z2-z3     #plane2
  v4x=x3-x4 ; v4y=y3-y4 ; v4z=z3-z4     #plane2

  plane1_x=(v1y*v2z)-(v1z*v2y)  # normal vector 1
  plane1_y=(v2x*v1z)-(v2z*v1x)  # normal vector 1
  plane1_z=(v1x*v2y)-(v1y*v2x)  # normal vector 1
  plane2_x=(v3y*v4z)-(v3z*v4y)  # normal vector 2
  plane2_y=(v4x*v3z)-(v4z*v3x)  # normal vector 2
  plane2_z=(v3x*v4y)-(v3y*v4x)  # normal vector 2

  v1mag=sqrt(((plane1_x)**2)+((plane1_y)**2)+((plane1_z)**2)) # magnitude normal vector 1
  v2mag=sqrt(((plane2_x)**2)+((plane2_y)**2)+((plane2_z)**2)) # magnitude normal vector 2
  vn1x=(plane1_x)/(v1mag) ; vn1y=(plane1_y)/(v1mag) ; vn1z=(plane1_z)/(v1mag) # normalization normal vector 1
  vn2x=(plane2_x)/(v2mag) ; vn2y=(plane2_y)/(v2mag) ; vn2z=(plane2_z)/(v2mag) # normalization normal vector 2

  print acos((vn1x*vn2x)+(vn1y*vn2y)+(vn1z*vn2z))*180/3.141592653589793
}

После сохранения файла вы должны пометить скрипт как исполняемый:

chmod +x ./torsion2.awk

Затем вы можете запустить его с предоставленными демонстрационными данными:

./torsion2.awk data.txt

Выход

58.6892

Вот полная отладочная версия. Мне это было нужно, потому что у меня были ошибки редактирования, такие как изменение y2=$3 только на y=$3! (Такое случается ;-/ )

cat torsion2_debug.awk
#!/bin/awk -f

BEGIN {
  dbg=1   # turns on dbg output
  # dbg=0 # turns off dbg output
}
function acos(x)  { return atan2((1.-x^2)^0.5,x) }

NR==1 {x1=$2; y1=$3; z1=$4}
NR==2 {x2=$2; y2=$3; z2=$4}
NR==3 {x3=$2; y3=$3; z3=$4}
NR==4 {
  x4=$2; y4=$3; z4=$4

  if (dbg) {
    print "x1="x1 "\ty1="y1 "\tz1=" z1
    print "x2="x2 "\ty2="y2 "\tz2=" z2
    print "x3="x3 "\ty3="y3 "\tz3=" z3
    print "x4="x4 "\ty4="y4 "\tz4=" z4
  }

  # all of this code below is only executed when you read in the 4th line
  # because then you have all the data
  #
  v1x=x2-x1 ; v1y=y2-y1 ; v1z=z2-z1     #plane1
  v2x=x3-x2 ; v2y=y3-y2 ; v2z=z3-z2     #plane1
  v3x=x2-x3 ; v3y=y2-y3 ; v3z=z2-z3     #plane2
  v4x=x3-x4 ; v4y=y3-y4 ; v4z=z3-z4     #plane2

  if (dbg) {
    print "#dbg: v1x="v1x "\tv1y=" v1y "\tv1z="v1z
    print "#dbg: v2x="v2x "\tv2y=" v2y "\tv2z="v2z
    print "#dbg: v3x="v3x "\tv3y=" v3y "\tv3z="v3z
    print "#dbg: v4x="v4x "\tv4y=" v4y "\tv4z="v4z
  }

  plane1_x=(v1y*v2z)-(v1z*v2y)  # normal vector 1
  plane1_y=(v2x*v1z)-(v2z*v1x)  # normal vector 1
  plane1_z=(v1x*v2y)-(v1y*v2x)  # normal vector 1
  plane2_x=(v3y*v4z)-(v3z*v4y)  # normal vector 2
  plane2_y=(v4x*v3z)-(v4z*v3x)  # normal vector 2
  plane2_z=(v3x*v4y)-(v3y*v4x)  # normal vector 2
  if (dbg) {
    print "#dbg: plane1_x=" plane1_x "\tplane1_y=" plane1_y "\tplane1_z=" plane1_z
    print "#dbg: plane2_x=" plane2_x "\tplane2_y=" plane2_y "\tplane2_z=" plane2_z
  }

  v1mag=sqrt(((plane1_x)**2)+((plane1_y)**2)+((plane1_z)**2)) # magnitude normal vector 1
  v2mag=sqrt(((plane2_x)**2)+((plane2_y)**2)+((plane2_z)**2)) # magnitude normal vector 2
  if (dbg) {
    print "#dbg: v1mag=" v1mag "\tv2mag="v2mag
  }

  vn1x=(plane1_x)/(v1mag) ; vn1y=(plane1_y)/(v1mag) ; vn1z=(plane1_z)/(v1mag) # normalization normal vector 1
  vn2x=(plane2_x)/(v2mag) ; vn2y=(plane2_y)/(v2mag) ; vn2z=(plane2_z)/(v2mag) # normalization normal vector 2

  if (dbg) {
    print "#dbg: " (vn1x*vn2x) " "  (vn1y*vn2y)  " " ((vn1z*vn2z)*180/3.141592653589793)
  }
  print acos((vn1x*vn2x)+(vn1y*vn2y)+(vn1z*vn2z))*180/3.141592653589793
}

А вот транскрибированная оболочка в awk-версию

Я настоятельно рекомендую Grymoire's Awk Tutorial, чтобы помочь вам понять awk парадигма программирования и ее встроенные переменные, такие как NR (количество записей).

cat torsion2_docd.awk
#!/bin/awk -f

function acos(x)  { return atan2((1.-x^2)^0.5,x) }

# x1=`awk '{print $2}' LINEA` # x1
# y1=`awk '{print $3}' LINEA` # y1
# z1=`awk '{print $4}' LINEA` # z1
# x2=`awk '{print $2}' LINEB` # x2
# y2=`awk '{print $3}' LINEB` # y2
# z2=`awk '{print $4}' LINEB` # z2
# x3=`awk '{print $2}' LINEC` # x3
# y3=`awk '{print $3}' LINEC` # y3
# z3=`awk '{print $4}' LINEC` # z3
# x4=`awk '{print $2}' LINED` # x4
# y4=`awk '{print $3}' LINED` # y4
# z4=`awk '{print $4}' LINED` # z4
NR==1 {x1=$2; y1=$3; z1=$4}
NR==2 {x2=$2; y2=$3; z2=$4}
NR==3 {x3=$2; y3=$3; z3=$4}
NR==4 {
  x4=$2; y=$3; z4=$4

  # all of this code below is only executed when you read in the 4th line
  # because then you have all the data
  #
  # v1x=`calc "($x2)-($x1)" | sed 's/^\t//g'` #plane1
  # v1y=`calc "($y2)-($y1)" | sed 's/^\t//g'` #plane1
  # v1z=`calc "($z2)-($z1)" | sed 's/^\t//g'` #plane1
  # v2x=`calc "($x3)-($x2)" | sed 's/^\t//g'` #plane1
  # v2y=`calc "($y3)-($y2)" | sed 's/^\t//g'` #plane1
  # v2z=`calc "($z3)-($z2)" | sed 's/^\t//g'` #plane1
  # v3x=`calc "($x2)-($x3)" | sed 's/^\t//g'` #plane2
  # v3y=`calc "($y2)-($y3)" | sed 's/^\t//g'` #plane2
  # v3z=`calc "($z2)-($z3)" | sed 's/^\t//g'` #plane2
  # v4x=`calc "($x3)-($x4)" | sed 's/^\t//g'` #plane2
  # v4y=`calc "($y3)-($y4)" | sed 's/^\t//g'` #plane2
  # v4z=`calc "($z3)-($z4)" | sed 's/^\t//g'` #plane2

  v1x=x2-x1 ; v1y=y2-y1 ; v1z=z2-z1     #plane1
  v2x=x3-x2 ; v2y=y3-y2 ; v2z=z3-z2     #plane1
  v3x=x2-x3 ; v3y=y2-y3 ; v3z=z2-z3     #plane2
  v1x=x2-x1 ; v1y=y2-y1 ; v1z=z2-z1     #plane1
  v2x=x3-x2 ; v2y=y3-y2 ; v2z=z3-z2     #plane1
  v3x=x2-x3 ; v3y=y2-y3 ; v3z=z2-z3     #plane2
  v4x=x3-x4 ; v4y=y3-y4 ; v4z=z3-z4     #plane2 

  # plane1_x=`calc "($v1y)*($v2z)-($v1z)*($v2y)" | sed 's/^\t//g'` # normal vector 1
  # plane1_y=`calc "($v2x)*($v1z)-($v2z)*($v1x)" | sed 's/^\t//g'` # normal vector 1
  # plane1_z=`calc "($v1x)*($v2y)-($v1y)*($v2x)" | sed 's/^\t//g'` # normal vector 1
  # plane2_x=`calc "($v3y)*($v4z)-($v3z)*($v4y)" | sed 's/^\t//g'` # normal vector 2
  # plane2_y=`calc "($v4x)*($v3z)-($v4z)*($v3x)" | sed 's/^\t//g'` # normal vector 2
  # plane2_z=`calc "($v3x)*($v4y)-($v3y)*($v4x)" | sed 's/^\t//g'` # normal vector 2

  plane1_x=(v1y*v2z)-(v1z*v2y)  # normal vector 1
  plane1_y=(v2x*v1z)-(v2z*v1x)  # normal vector 1
  plane1_z=(v1x*v2y)-(v1y*v2x)  # normal vector 1
  plane2_x=(v3y*v4z)-(v3z*v4y)  # normal vector 2
  plane2_y=(v4x*v3z)-(v4z*v3x)  # normal vector 2
  plane2_z=(v3x*v4y)-(v3y*v4x)  # normal vector 2

  # v1mag=`calc "sqrt(($plane1_x)**2+($plane1_y)**2+($plane1_z)**2)" | sed 's/^\t//g'`  # magnitude normal vector 1
  # v2mag=`calc "sqrt(($plane2_x)**2+($plane2_y)**2+($plane2_z)**2)" | sed 's/^\t//g'`  # magnitude normal vector 2

  v1mag=sqrt((plane1_x)**2+(plane1_y)**2+(plane1_z)**2) # magnitude normal vector 1
  v2mag=sqrt((plane2_x)**2+(plane2_y)**2+(plane2_z)**2) # magnitude normal vector 2

  # vn1x=`calc "($plane1_x)/($v1mag)" | sed 's/^\t//g'`  # normalization normal vector 1
  # vn1y=`calc "($plane1_y)/($v1mag)" | sed 's/^\t//g'`  # normalization normal vector 1
  # vn1z=`calc "($plane1_z)/($v1mag)" | sed 's/^\t//g'`  # normalization normal vector 1
  # vn2x=`calc "($plane2_x)/($v2mag)" | sed 's/^\t//g'`  # normalization normal vector 2
  # vn2y=`calc "($plane2_y)/($v2mag)" | sed 's/^\t//g'`  # normalization normal vector 2
  # vn2z=`calc "($plane2_z)/($v2mag)" | sed 's/^\t//g'`  # normalization normal vector 2

  vn1x=(plane1_x)/(v1mag) ; vn1y=(plane1_y)/(v1mag) ; vn1z=(plane1_z)/(v1mag) # normalization normal vector 1
  vn2x=(plane2_x)/(v2mag) ; vn2y=(plane2_y)/(v2mag) ; vn2z=(plane2_z)/(v2mag) # normalization normal vector 2

  # calc "acos(($vn1x)*($vn2x)+($vn1y)*($vn2y)+($vn1z)*($vn2z))*180/3.141592653589793" | sed 's/^\t//g' | sed 's/^~//g'

  print acos((vn1x*vn2x)+(vn1y*vn2y)+(vn1z*vn2z))*180/3.141592653589793
}
person shellter    schedule 19.10.2017
comment
разница большая, более практичная, большое спасибо за ваше время и терпение, добрый день - person Another.Chemist; 19.10.2017

EDIT: Если ваш интернет-поиск torsion.awk привел вас сюда, просто перейдите выше к принятому ответу, так как он использует усовершенствованный алгоритм OP для вычисления кручения, но все же демонстрирует преобразование кода оболочки в awk.

Предыдущие читатели также отмечают улучшения в использовании этого кода во втором редактировании ниже.


Я только что заметил оговорку "правильно" в конце ;-/

Вот ваш код, преобразованный в один процесс awk.

У меня нет опыта работы с этим уровнем математики, поэтому я не могу сказать, что он действительно вычисляет нужный вам результат.

Кроме того, часто возникают вопросы о точности в awk-программах, которые на самом деле относятся к базовым c языковым библиотекам, которые компилируются.

В любом случае, со всеми оговорками, вот базовое преобразование вашего кода.

кот torsion_docd.awk

#!/bin/awk -f

function acos(x)        { return atan2((1.-x^2)^0.5,x) }

# x1=`awk '{print $2}' LINEA` # x1
# y1=`awk '{print $3}' LINEA` # y1
# z1=`awk '{print $4}' LINEA` # z1
# x2=`awk '{print $2}' LINEB` # x2
# y2=`awk '{print $3}' LINEB` # y2
# z2=`awk '{print $4}' LINEB` # z2
# x3=`awk '{print $2}' LINEC` # x3
# y3=`awk '{print $3}' LINEC` # y3
# z3=`awk '{print $4}' LINEC` # z3
# x4=`awk '{print $2}' LINED` # x4
# y4=`awk '{print $3}' LINED` # y4
# z4=`awk '{print $4}' LINED` # z4
NR==1 {x1=$2; y=$3; z1=$4}
NR==2 {x2=$2; y=$3; z2=$4}
NR==3 {x3=$2; y=$3; z3=$4}
NR==4 {
        x4=$2; y=$3; z4=$4

        # all of this code below is only executed when you read in the 4th line
        # becuase then you have all the data
        # v1x=`calc "($x1)-($x2)" | sed 's/^\t//g'`
        # v1y=`calc "($y1)-($y2)" | sed 's/^\t//g'`
        # v1z=`calc "($z1)-($z2)" | sed 's/^\t//g'`
        # v2x=`calc "($x4)-($x3)" | sed 's/^\t//g'`
        # v2y=`calc "($y4)-($y3)" | sed 's/^\t//g'`
        # v2z=`calc "($z4)-($z3)" | sed 's/^\t//g'`

        v1x=x1-x2 ; v1y=y1-y2 ; v1z=z1-z2
        v2x=x4-x3 ; v2y=y4-y3 ; v2z=z4-z3

        # v1mag=`calc "sqrt(($v1x)**2+($v1y)**2+($v1z)**2)" | sed 's/^\t//g'`
        # v2mag=`calc "sqrt(($v2x)**2+($v2y)**2+($v2z)**2)" | sed 's/^\t//g'`

        v1mag=sqrt((v1x)**2+(v1y)**2+(v1z)**2)
        v2mag=sqrt((v2x)**2+(v2y)**2+(v2z)**2)   

        # calc "acos((($v1x)/($v1mag))*(($v2x)/($v2mag))+(($v1y)/($v1mag))*(($v2y)/($v2mag))+(($v1z)/($v1mag))*(($v2z)/($v2mag)))*180/3.141
592653589793" | sed 's/^\t//g' | sed 's/^~//g'
        # calc "acos((($x1)*($x4)+($y1)*($y4)+($z1)*($z4))/(sqrt(($x1)**2+($y1)**2+($z1)**2)*sqrt(($x4)**2+($y4)**2+($z4)**2)))*180/3.14159
2653589793" | sed 's/^\t//g' | sed 's/^~//g'

        print acos(((v1x)/(v1mag))*((v2x)/(v2mag))+((v1y)/(v1mag))*((v2y)/(v2mag))+((v1z)/(v1mag))*((v2z)/(v2mag)))*180/3.141592653589793
        print acos(((x1)*(x4)+(y1)*(y4)+(z1)*(z4))/(sqrt((x1)**2+(y1)**2+(z1)**2)*sqrt((x4)**2+(y4)**2+(z4)**2)))*180/3.141592653589793
}

А без конверсионной документации это выглядит как

кот торсион.awk

#!/bin/awk -f

function acos(x)        { return atan2((1.-x^2)^0.5,x) }

NR==1 {x1=$2; y=$3; z1=$4}
NR==2 {x2=$2; y=$3; z2=$4}
NR==3 {x3=$2; y=$3; z3=$4}
NR==4 {
        x4=$2; y=$3; z4=$4

        # all of this code below is only executed when you read in the 4th line
        # because then you have all the data

        v1x=x1-x2 ; v1y=y1-y2 ; v1z=z1-z2
        v2x=x4-x3 ; v2y=y4-y3 ; v2z=z4-z3

        v1mag=sqrt((v1x)**2+(v1y)**2+(v1z)**2)
        v2mag=sqrt((v2x)**2+(v2y)**2+(v2z)**2)   

        print acos(((v1x)/(v1mag))*((v2x)/(v2mag))+((v1y)/(v1mag))*((v2y)/(v2mag))+((v1z)/(v1mag))*((v2z)/(v2mag)))*180/3.141592653589793
        print acos(((x1)*(x4)+(y1)*(y4)+(z1)*(z4))/(sqrt((x1)**2+(y1)**2+(z1)**2)*sqrt((x4)**2+(y4)**2+(z4)**2)))*180/3.141592653589793
}

Обратите внимание, что я добавил операторы печати перед двумя последними строками acos.

На моей машине я запускаю его как

awk -f torsion.awk data.txt

EDIT: я исправил #!/bin/awk в верхней части скрипта. Итак, вам нужно пометить скрипт как исполняемый с помощью

 chmod +x ./torsion.awk

И тогда вы можете запустить его так же, как

`./torsion.awk data.txt

В вашей системе может потребоваться другой путь к awk, как в верхней строке (#!/bin/awk). Введите which awk, а затем используйте это значение после #!. Кроме того, в устаревших реализациях Unix часто установлены другие версии awk, поэтому, если это ваша операционная среда, проведите небольшое исследование, чтобы выяснить, какая из них является лучшей awk в вашей системе (часто это gawk).

# -------------- end edit --------------------

вывод

87.6318
131.872

Но учитывая, что вы согласились с тем, что -58.7 является вашим желаемым результатом, я оставлю вам решать, как использовать 2 вычисления acos.

В любом случае, надеюсь, вы видите, насколько проще использовать awk для таких вычислений.

Конечно, надеясь, что настоящие математики проберутся (вдоволь посмеявшись) и помогут это исправить (или предложат свои идеи).

IHTH

person shellter    schedule 09.10.2017
comment
Спасибо, awk действительно очень практичен. - person Another.Chemist; 09.10.2017

После долгой ночи я нашел решение:

awk -v var=$((x+2)) 'NR==var' $FILE > LINEaa
awk -v var=$((y+2)) 'NR==var' $FILE > LINEbb
awk -v var=$((z+2)) 'NR==var' $FILE > LINEcc
awk -v var=$((w+2)) 'NR==var' $FILE > LINEd
x1=`awk '{print $2}' LINEaa` # x1
y1=`awk '{print $3}' LINEaa` # y1
z1=`awk '{print $4}' LINEaa` # z1
x2=`awk '{print $2}' LINEbb` # x2
y2=`awk '{print $3}' LINEbb` # y2
z2=`awk '{print $4}' LINEbb` # z2
x3=`awk '{print $2}' LINEcc` # x3
y3=`awk '{print $3}' LINEcc` # y3
z3=`awk '{print $4}' LINEcc` # z3
x4=`awk '{print $2}' LINEd` # x4
y4=`awk '{print $3}' LINEd` # y4
z4=`awk '{print $4}' LINEd` # z4
v1x=`calc "($x2)-($x1)" | sed 's/^\t//g'` #plane1
v1y=`calc "($y2)-($y1)" | sed 's/^\t//g'` #plane1
v1z=`calc "($z2)-($z1)" | sed 's/^\t//g'` #plane1
v2x=`calc "($x3)-($x2)" | sed 's/^\t//g'` #plane1
v2y=`calc "($y3)-($y2)" | sed 's/^\t//g'` #plane1
v2z=`calc "($z3)-($z2)" | sed 's/^\t//g'` #plane1
v3x=`calc "($x2)-($x3)" | sed 's/^\t//g'` #plane2
v3y=`calc "($y2)-($y3)" | sed 's/^\t//g'` #plane2
v3z=`calc "($z2)-($z3)" | sed 's/^\t//g'` #plane2
v4x=`calc "($x3)-($x4)" | sed 's/^\t//g'` #plane2
v4y=`calc "($y3)-($y4)" | sed 's/^\t//g'` #plane2
v4z=`calc "($z3)-($z4)" | sed 's/^\t//g'` #plane2
plane1_x=`calc "($v1y)*($v2z)-($v1z)*($v2y)" | sed 's/^\t//g'` # normal vector 1
plane1_y=`calc "($v2x)*($v1z)-($v2z)*($v1x)" | sed 's/^\t//g'` # normal vector 1
plane1_z=`calc "($v1x)*($v2y)-($v1y)*($v2x)" | sed 's/^\t//g'` # normal vector 1
plane2_x=`calc "($v3y)*($v4z)-($v3z)*($v4y)" | sed 's/^\t//g'` # normal vector 2
plane2_y=`calc "($v4x)*($v3z)-($v4z)*($v3x)" | sed 's/^\t//g'` # normal vector 2
plane2_z=`calc "($v3x)*($v4y)-($v3y)*($v4x)" | sed 's/^\t//g'` # normal vector 2
v1mag=`calc "sqrt(($plane1_x)**2+($plane1_y)**2+($plane1_z)**2)" | sed 's/^\t//g'`  # magnitude normal vector 1
v2mag=`calc "sqrt(($plane2_x)**2+($plane2_y)**2+($plane2_z)**2)" | sed 's/^\t//g'`  # magnitude normal vector 2
vn1x=`calc "($plane1_x)/($v1mag)" | sed 's/^\t//g'`  # normalization normal vector 1
vn1y=`calc "($plane1_y)/($v1mag)" | sed 's/^\t//g'`  # normalization normal vector 1
vn1z=`calc "($plane1_z)/($v1mag)" | sed 's/^\t//g'`  # normalization normal vector 1
vn2x=`calc "($plane2_x)/($v2mag)" | sed 's/^\t//g'`  # normalization normal vector 2
vn2y=`calc "($plane2_y)/($v2mag)" | sed 's/^\t//g'`  # normalization normal vector 2
vn2z=`calc "($plane2_z)/($v2mag)" | sed 's/^\t//g'`  # normalization normal vector 2
calc "acos(($vn1x)*($vn2x)+($vn1y)*($vn2y)+($vn1z)*($vn2z))*180/3.141592653589793" | sed 's/^\t//g' | sed 's/^~//g'
person Another.Chemist    schedule 10.10.2017
comment
Привет, @AnotherChemist. Я переписал ваше окончательное решение в сценарий одного процесса awk и добавил print перед последней строкой с acos(...). Каков результат, полученный вами из ваших 4 строк данных в вашем вопросе? Я получаю ноль, и я не думаю, что это правильно. Если я знаю, какова цель, я отлажу еще немного и опубликую обновление для вашего обновления. - person shellter; 18.10.2017
comment
@AnotherChemist: Хорошо, я добился прогресса, но я получаю +58.6892, а не отрицательное значение. Вы подтвердили, что вам нужно/хотите/ожидаете отрицательное значение? Я опубликую свою транскрипцию в ближайшие день или два, исправлена ​​она или нет. Надеюсь, более математически способные могут указать на мою ошибку. Всем удачи. - person shellter; 18.10.2017
comment
@shellter Привет! математика проста, есть четыре последовательных точки. Есть две плоскости, первая образована точками 1, 2 и 3. Вторая плоскость образована точками 2, 3 и 4. Затем вы получаете вектор нормали каждой плоскости через векторное произведение. Наконец, вы получаете угол между этими нормальными векторами. - person Another.Chemist; 18.10.2017