File: eulerians.asy

package info (click to toggle)
hkl 5.0.0.2456-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 37,696 kB
  • sloc: ansic: 25,256; python: 4,325; haskell: 3,794; cpp: 976; makefile: 700; sh: 179; perl: 133; xml: 90; lisp: 54
file content (36 lines) | stat: -rw-r--r-- 1,413 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import diffractometer;

void eulerians(real omega, real chi, real phi, real kalpha=50, int solution=1)
{
  real hight = 3*10;
  real detector_arm_support_radius= 2*10;
  real detector_arm_length = 3*10;
  real diffractometer_support_radius = 1.5*10;
  triple KAPPA = -cos(radians(kalpha))*Y - sin(radians(kalpha))*Z;
  real komega;
  real kappa;
  real kphi;
  real p = degrees(asin(tan(radians(chi/2.))/tan(radians(kalpha))));

  if (solution == 1){
    komega = omega - p + 90;
    kappa = degrees(2 * asin(sin(radians(chi/2.))/sin(radians(kalpha))));
    kphi = phi - p - 90;
  }else{
    komega = omega + p - 90;
    kappa = degrees(-2 * asin(sin(radians(chi/2.))/sin(radians(kalpha))));
    kphi = phi + p + 90;
  }
  
  // support
  draw(_support(hight, diffractometer_support_radius, 0, 0, true), blue);

  // eulerian part
  draw(rotate(-omega, Y) * chi_circle(diffractometer_support_radius, 1), cyan+opacity(.8));
  //draw(rotate(-omega, Y) * rotate(chi, X) * rotate(-phi, Y) * sample_holder(diffractometer_support_radius, 1), yellow);

  // kappa part
  draw(rotate(-komega, Y) * komega_circle(diffractometer_support_radius, 1, kalpha=kalpha), green);
  draw(rotate(-komega, Y) * rotate(kappa, KAPPA) * kappa_circle(diffractometer_support_radius, 1, kalpha=kalpha), cyan);
  draw(rotate(-komega, Y) * rotate(kappa, KAPPA) * rotate(-kphi, Y) * sample_holder(diffractometer_support_radius, 1), yellow);
}