Validation_codes/.ipynb_checkpoints/Twin_reorientation_check-ch...

806 lines
81 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "e2ae546c-570b-4245-99fa-60519f448e1e",
"metadata": {},
"source": [
"# Code to verify and visualize reorientation caused twinning in the deformation gradient.\n",
"## Using the correspondence matrix method.\n",
"By Satyapriya Gupta, Achal H P\n",
"\n",
"Reference Niewczas, Acta Materialia, 2010"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "8faa8558-2109-45ed-b795-94150b3c998d",
"metadata": {},
"outputs": [],
"source": [
"import math\n",
"import numpy as np\n",
"import scipy.linalg\n",
"from numpy.linalg import inv\n",
"import damask"
]
},
{
"cell_type": "markdown",
"id": "bc185fbf-e55d-445e-b8aa-f17abdd93b9a",
"metadata": {},
"source": [
"### Test Case: Extension Twinning $( \\bar{1} 0 1 2)$ $[1 0 \\bar{1} 1] $\n",
"\n",
"Conversion to Miller indices: $ (\\bar{1} 0 2) [2 1 1] $"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "fee7fbb5-3a4b-421c-bbe7-636c3fd412e9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.3743159014756228\n",
"1.6881920256873888\n",
"[0.63176092 0.36474734 0.68398649]\n",
"[-0.59234968 -0.34199325 0.72949468]\n"
]
}
],
"source": [
"# Twin direction:\n",
"m = np.array([2, 1, 1])\n",
"# Habit plane normal\n",
"n = np.array([-1, 0, 2])\n",
"# Mapping from Miller indes to cartesian coordinate system\n",
"matA=np.array([[1, -0.5, 0],[0, 0.5*np.sqrt(3), 0],[0, 0, 1.624]])\n",
"#norm of twin direction\n",
"norm_mcart=np.linalg.norm(np.matmul(matA,m))\n",
"# norm of twin plane\n",
"norm_ncart=np.linalg.norm(np.matmul(n,inv(matA)))\n",
"# normalized unit vectors:\n",
"unit_mcart = np.matmul(matA,m)/norm_mcart\n",
"unit_ncart = np.matmul(n, inv(matA))/norm_ncart\n",
"# Characteristic shear for Extension twin of Mg\n",
"s = 0.128917\n",
"print(norm_mcart)\n",
"print(norm_ncart)\n",
"print(unit_mcart)\n",
"print(unit_ncart)"
]
},
{
"cell_type": "markdown",
"id": "716495ad-76ca-4790-b1f4-a2f249e452db",
"metadata": {},
"source": [
"### Please provide Euler Angles Here:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "eaa69469-71ca-42fc-a4ed-afa0fb84a230",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-0.94733416 -0.26950574 0.17298739]\n",
" [-0.18994613 0.03796355 -0.98106026]\n",
" [ 0.25783416 -0.96225019 -0.08715574]]\n"
]
}
],
"source": [
"phi_1 = 15\n",
"phi_ = 95\n",
"phi_2 = 170\n",
"\n",
"init = damask.Orientation.from_Euler_angles(phi=[phi_1,phi_,phi_2],degrees=True,family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235).as_matrix()\n",
"print(init)\n"
]
},
{
"cell_type": "markdown",
"id": "1262386a-1d9c-4bb0-a147-c409f45ec751",
"metadata": {},
"source": [
"### Initial Undeformed Condition, $ F = Identity matrix $"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "689c6399-fd48-4456-be57-a8f7f7e16276",
"metadata": {},
"outputs": [],
"source": [
"F = np.identity(3)"
]
},
{
"cell_type": "markdown",
"id": "64b46853-7012-432f-93c1-4acb1fe4dc9a",
"metadata": {},
"source": [
"### If $F = I$, then inverse of $F$ gives $F_e$."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "3c3bfb00-2af0-4754-8d4e-89ee10d62519",
"metadata": {},
"outputs": [],
"source": [
"Fp=init\n",
"Fe=inv(Fp)\n",
"Rinv = inv(init)"
]
},
{
"cell_type": "markdown",
"id": "6786e80d-c9b2-41de-9fc1-40e8d3fc5acd",
"metadata": {},
"source": [
"### Shape change by twinning in the reference configuration:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "83c683bf-e3b8-4ec3-9e59-d0a25a55ca0e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"deformation gradient of shape change= \n",
" [[ 0.94841878 0.03517917 -0.01073607]\n",
" [-0.0855022 1.05831379 -0.01779635]\n",
" [-0.03234646 0.02206077 0.99326744]]\n"
]
}
],
"source": [
"S_ref= s * np.einsum('i,j',np.matmul(Rinv,unit_mcart),np.matmul(Rinv,unit_ncart)) + np.identity(3)\n",
"print(\"deformation gradient of shape change= \\n\", S_ref)"
]
},
{
"cell_type": "markdown",
"id": "eb708c6b-38ea-4f4a-ac59-91e31b55df95",
"metadata": {},
"source": [
"### After twinning, $ F_1 = Fe_1 * {F_p}_1 $ , where $ {F_p}_1 = C * {F_p}$"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "b1ad7d3a-fcf2-4116-9339-0451961ece5d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"with determinant of 1.0000001660951479\n"
]
}
],
"source": [
"F1=S_ref\n",
"C=np.array([[-0.25,0.433013,-0.923645],[0.433013,-0.75,-0.533267],[-0.812, -0.468808, 0]])\n",
"Fe1=np.matmul(F1,inv(np.matmul(C,Fp)))\n",
"print (\"with determinant of \",np.linalg.det(Fe1))"
]
},
{
"cell_type": "markdown",
"id": "d21c31d5-72b1-43ed-91e4-2b194cd4eaaf",
"metadata": {},
"source": [
"### Right polar decomposition of $F_e$, $ F_e = R U $ gives the rotation of deformed voxel."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "9e5edf14-8645-4816-86ee-89d0fb02335e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[203.36501298 70.4635392 80.71378207]\n"
]
}
],
"source": [
"(R_,U_) = scipy.linalg.polar(Fe1,'right')\n",
"check = damask.Orientation.from_matrix(R=R_,family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235).as_Euler_angles(degrees=True)\n",
"print(check)"
]
},
{
"cell_type": "markdown",
"id": "749c4997-c181-41c7-8359-f0fd37ee1a38",
"metadata": {},
"source": [
"### Get the orientation details"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e6e8b162-7e0b-45dc-a37f-bee3071ce353",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 99.28621793 70.4635392 336.63498702]\n"
]
}
],
"source": [
"new_ori = damask.Orientation.from_matrix(R=np.linalg.inv(R_),family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235)\n",
"print(damask.Orientation.from_matrix(R=np.linalg.inv(R_),family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235).as_Euler_angles(degrees=True))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "80ac2638-3ebd-47c6-8e80-243a1c69fce1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Crystal family: hexagonal\n",
"Bravais lattice: hP\n",
"a=1 m, b=1 m, c=1.6235 m\n",
"α=90°, β=90°, γ=120°\n",
"Quaternion [ 0.02946883 -0.15957602 0.71980092 -0.6749472 ]\n"
]
}
],
"source": [
"old_ori = damask.Orientation.from_Euler_angles(phi=[phi_1,phi_,phi_2],degrees=True,family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235)\n",
"print(old_ori)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "cc1b231c-16e6-4d7d-bda2-8d0a4799839f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Crystal family: hexagonal\n",
"Bravais lattice: hP\n",
"a=1 m, b=1 m, c=1.6235 m\n",
"α=90°, β=90°, γ=120°\n",
"Quaternion [7.29494643e-01 6.83986524e-01 3.14974754e-08 1.07984812e-07]\n",
"[ 0. 86.31191012 0. ]\n"
]
}
],
"source": [
"dis = old_ori.disorientation(new_ori)\n",
"print(dis)\n",
"print(dis.as_Euler_angles(degrees=True))"
]
},
{
"cell_type": "markdown",
"id": "3efee0a1-5ebe-42bd-bb05-61721097458d",
"metadata": {},
"source": [
"## Result: Print the disorientation between undeformed and deformed voxel."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "10b562ea-c067-4ec0-8b26-59dd8722305a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"disorientation = 86.31191011698503 degrees\n"
]
}
],
"source": [
"print('disorientation =',dis.as_axis_angle(degrees=True,pair=True)[1],'degrees')"
]
},
{
"cell_type": "markdown",
"id": "10bdf007-9926-4e38-9195-dd3fd349f634",
"metadata": {},
"source": [
"# Code to visualization of lattice reorientation caused by twinning.\n",
"\n",
"First cell below gives HCP unit cell with euler angles 0,0,0.\n",
"\n",
"Second cell below rotates unit cell by provided euler angles.\n",
"\n",
"Third cell below shows reorientation done after twinning."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "37f8aa5b-a6df-45be-861f-46bdd218154a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"from math import cos, sin, radians\n",
"\n",
"# Define the line\n",
"x = np.linspace(0, 1.2, 100)\n",
"y = np.zeros_like(x)\n",
"z = np.zeros_like(x)\n",
"\n",
"x1 = np.zeros_like(x)\n",
"y1 = np.zeros_like(x)\n",
"z1 = np.linspace(0, 1.2, 100)\n",
"\n",
"x2 = np.zeros_like(x)\n",
"y2 = np.linspace(0, 1.2, 100)\n",
"z2 = np.zeros_like(x)\n",
"\n",
"h11 = np.linspace(1,0.5,100)\n",
"h12 = h11*np.sqrt(3) - np.sqrt(3)\n",
"h13 = np.zeros_like(h11)\n",
"\n",
"h21 = np.linspace(-0.5, 0.5, 100)\n",
"h22 = np.ones_like(h21) * np.sqrt(3) / 2\n",
"h23 = np.zeros_like(h21)\n",
"\n",
"h31 = np.linspace(-0.5, 0.5, 100)\n",
"h32 = - np.ones_like(h31) * np.sqrt(3) / 2\n",
"h33 = np.zeros_like(h31)\n",
"\n",
"h41 = np.linspace(1,0.5,100)\n",
"h42 = - h41*np.sqrt(3) + np.sqrt(3)\n",
"h43 = np.zeros_like(h41)\n",
"\n",
"h51 = np.linspace(-1,-0.5,100)\n",
"h52 = - h51*np.sqrt(3) - np.sqrt(3)\n",
"h53 = np.zeros_like(h51)\n",
"\n",
"h61 = np.linspace(-1,-0.5,100)\n",
"h62 = h61*np.sqrt(3) + np.sqrt(3)\n",
"h63 = np.zeros_like(h61)\n",
"\n",
"k11 = np.linspace(1,0.5,100)\n",
"k12 = k11*np.sqrt(3) - np.sqrt(3)\n",
"k13 = np.ones_like(k11)\n",
"\n",
"k21 = np.linspace(-0.5, 0.5, 100)\n",
"k22 = np.ones_like(k21) * np.sqrt(3) / 2\n",
"k23 = np.ones_like(k21)\n",
"\n",
"k31 = np.linspace(-0.5, 0.5, 100)\n",
"k32 = - np.ones_like(k31) * np.sqrt(3) / 2\n",
"k33 = np.ones_like(k31)\n",
"\n",
"k41 = np.linspace(1,0.5,100)\n",
"k42 = - k41*np.sqrt(3) + np.sqrt(3)\n",
"k43 = np.ones_like(k41)\n",
"\n",
"k51 = np.linspace(-1,-0.5,100)\n",
"k52 = - k51*np.sqrt(3) - np.sqrt(3)\n",
"k53 = np.ones_like(k51)\n",
"\n",
"k61 = np.linspace(-1,-0.5,100)\n",
"k62 = k61*np.sqrt(3) + np.sqrt(3)\n",
"k63 = np.ones_like(k61)\n",
"\n",
"\n",
"\n",
"v11 = np.ones_like(x) * 0.5\n",
"v12 = np.ones_like(x) * np.sqrt(3) / 2\n",
"v13 = np.linspace(0, 1, 100)\n",
"\n",
"v21 = - np.ones_like(x) * 0.5\n",
"v22 = np.ones_like(x) * np.sqrt(3) / 2\n",
"v23 = np.linspace(0, 1, 100)\n",
"\n",
"v31 = - np.ones_like(x) * 0.5\n",
"v32 = - np.ones_like(x) * np.sqrt(3) / 2\n",
"v33 = np.linspace(0, 1, 100)\n",
"\n",
"v41 = np.ones_like(x) * 0.5\n",
"v42 = - np.ones_like(x) * np.sqrt(3) / 2\n",
"v43 = np.linspace(0, 1, 100)\n",
"\n",
"v51 = - np.ones_like(x)\n",
"v52 = np.zeros_like(x)\n",
"v53 = np.linspace(0, 1, 100)\n",
"\n",
"v61 = np.ones_like(x)\n",
"v62 = np.zeros_like(x)\n",
"v63 = np.linspace(0, 1, 100)\n",
"\n",
"# Plot the line\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111, projection='3d')\n",
"ax.plot(x, y, z)\n",
"ax.plot(x1, y1, z1)\n",
"#ax.plot(x2, y2, z2)\n",
"ax.plot(h11, h12, h13, 'k-')\n",
"ax.plot(h21, h22, h23, 'k-')\n",
"ax.plot(h31, h32, h33, 'k-')\n",
"ax.plot(h41, h42, h43, 'k-')\n",
"ax.plot(h51, h52, h53, 'k-')\n",
"ax.plot(h61, h62, h63, 'k-')\n",
"ax.plot(k11, k12, k13, 'k-')\n",
"ax.plot(k21, k22, k23, 'k-')\n",
"ax.plot(k31, k32, k33, 'k-')\n",
"ax.plot(k41, k42, k43, 'k-')\n",
"ax.plot(k51, k52, k53, 'k-')\n",
"ax.plot(k61, k62, k63, 'k-')\n",
"ax.plot(v11, v12, v13, 'k-')\n",
"ax.plot(v21, v22, v23, 'k-')\n",
"ax.plot(v31, v32, v33, 'k-')\n",
"ax.plot(v41, v42, v43, 'k-')\n",
"ax.plot(v51, v52, v53, 'k-')\n",
"ax.plot(v61, v62, v63, 'k-')\n",
"\n",
"ax.set_xticks([])\n",
"ax.set_yticks([])\n",
"ax.set_zticks([])\n",
"\n",
"ax.set_xlabel('')\n",
"ax.set_ylabel('')\n",
"ax.set_zlabel('')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "a523f432-ce0a-4506-9d83-bd469e1c9ba3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA6aUlEQVR4nO2deVxU5ffH3zPs7omAogkKZvpVQC3NRNxwyVg1NxS+uOfPLb9imUu5pLnkUmpmKpTmkoCKirjgguS+4JqWW2oKYhqyM8Dc3x82EyA7dza879drXhnMvfcwcz/3PM95zjmPTBAEJCQk9A+5rg2QkJAoHEmcEhJ6iiROCQk9RRKnhISeIolTQkJPMS7h91IoV0JC88gK+6HkOSUk9BRJnBISeookTgkJPUUSp4SEniKJU0JCT5HEKSGhp0jilJDQUyRxSkjoKZI4JST0FEmcEhJ6iiROCQk9RRKnhISeIolTQkJPkcQpIaGnSOKUkNBTJHHqAEEQyM3NRep8KFEcJRVbS4iMIAgoFAoyMzMRBAEjIyNMTEwwNjbGyMgImazQuluJVxBZCU9v6dEuIkqlEoVCgSAI5OTkIAiC+qVCEusrSaFfsiROLaASY05Ojlps2dnZhb5PEASUSqX6fZJYXwkkceoCpVJJdna2WnAymUw9tC1JaIWJ1djYWP2SxFppKPRLlOacGkIV9FF5SJUwy4LqGLlc/tI584pV5Vnlcrkk1kqEJE4NUHAYK5ZgihJrTk6O+vd5h8GSWA0bSZwiU9gwtigEQaiQeAqevzCx5h0GS2I1LKQ5p0gUHHKWJAJV1FaTYikYDZbEqrdIASFNIQgC2dnZ5ObmlnoYqw1xFkQVXFKhEquJiQlGRkaSWHWHJE5NkHftsizzS12IsyCFiTXvso0kVq0hiVNMKhr00QdxFkQl1rwPGpVYjY2NRQ1uSeRDEqdYqNYpSxP0KQp9FGdBihKrahgsiVU0JHGKQU5OToXWLlUYgjjzorpP8g6D5XL5S3NWiXIhibMiiL12aWjiLIgkVlGRxFleyrJ2WVoMXZwFkcRaISRxlpWCKXhi3lyVTZwFKaziRi6XvxQNlgAkcZaN8qxdloXKLs6CFFceZ2RkpI4Gv6JI4iwt5V27LAuvmjgLItWy5kMSZ0loKmG9MPLOYSVeebFK4iwOMdYuy4IkzuJ5xcQqibMoVEEfTQ5jCyKJs2xU8i4RkjgLos1hbEEkcVaMSiZWSZx50cTaZVmQxCkuRbV0UUWD9VysUpsSEKd9iIT+UVKXCDC8li6vlDg1vXYpoT9Uhi4Rr4w4tbF2KaG/FCbWgkUM+ibWSj/nLGv7EG0hzTn1Cx23dHn1AkLaXrssC5I49Rstd4l4tcSp78NYSZyGRXFiFaFLxKshTl2uXZaFnJwcdWBKwvDI2yUC/q24KWeXiELfWKlqdlTDWH0XpoTho2rgnddzKhQK0tLSSE5OZt68edy7d69C16gU4lR5y8zMTL2cX0pUflRiVc1HT58+TW5uboXOafDizBsSVy1C67Mwp06dSlxcnLRxbiVGJpORlpZGtWrVKnQeg17n1HUKXlkQBIHFixezfPlyli9fjomJCW+88QZNmzbFwcGBJk2a4OjoSJMmTahZs6auzZUohLLU36alpVG9evUKXc8gxVlw7VLf211kZGQwYcIENm7cSNOmTcnMzOTevXvcvn2bx48fs2PHjnye1MrKSi3UvP9t1KgRpqamOvxLJEpLVlZWhb8rgxOnoaXg3b9/n4EDB3LhwgWmTZvGjBkzkMlkREVFMWfOHC5evIiDgwNDhw7F3t6eO3fucPPmTW7dukVUVBRPnjxRn0sul2NnZ4ejo+NL4q1Xr57eP6QMnbLeaxX9PgxqKUXf1y4LcuTIEfz9/VEoFAQHB+Ph4aH+nWqeHBUVxRdffMGvv/7Kf/7zH6ZNm4aHh4f6b0tKSuLWrVvcunWLmzdvcvv2bfX/p6enq89XpUoV9fDYwcEhn3hr1aql7T/9lUYQBNzc3IiLiyvtPWq465yGsnapQhAEvv76a6ZNm0bTpk3Ztm0bTZo0yfce1d8jl8tRKpWEh4czf/58bt++TatWrZgxYwbu7u5F/q2CIPDo0SO1l1WJ99atW9y7dy/fgrlqmJxXsKphspmZmUY/i1cRQRDo1KkTcXFxpT3EMMWpzyl4hZGamsqYMWMIDQ3F19eX77//vtDAQF5x5v3Z1q1bWbBgAffv36d9+/bMnDkTV1fXMtmgUCi4e/duPsGqXomJier3FRwm5xWvra2tNEwuJ7m5uXTt2pULFy6U9hDDE6dYWx9oi9u3b9O/f3+uX7/O7NmzCQoKKtLmwsSpQqFQsGHDBhYvXkx8fDxdunRh+vTptG3btsI2JiUlcfv27ZdEW3CYbGFhkS+KrBJutWrVsLe3x9zcvMK2VFZSUlLo378/v/zyS2kPMRxxGtowFmDfvn0EBgYil8v58ccf6d69e7HvV0Wbi/NOGRkZrF+/nqVLl/LXX3/Rq1cvZsyYgZOTk9jmIwgC8fHx3Lx586Wh8v379/MtqNeqVYtt27bxzjvviG5HZSAhIYFx48axf//+0h5iGOI0pLVLeGHvggULmDt3Lk5OTmzdupVGjRqVeFxpxKkiNTWV7777jm+++YakpCR8fHyYNm0ab775phh/QokoFAru3bvH1atXGT58OHK5HIVCQZcuXZg6dSrt27fXih2Gwu3bt5k7dy7h4eGlPUS/c2tV3jIrKwulUqn3mT4Az58/p3///syZM4eBAwdy5MiRUgmzrFSrVo2goCAuX77MlClTiI6Opl27dowcOZI7d+6Ifr2CmJqa0qRJE3x9fWnSpAldunRh3rx5XL16lZ49e+Ll5cXJkyc1boehkJqaStWqVSt8Hr0Qp2rt0lCSCgBu3LiBq6srUVFRLFmyhODgYKpUqaLRa9aqVYuZM2dy5coVJkyYwK5du2jTpg0TJkzgzz//1Oi1Vdja2pKYmMj48eO5fPky8+bN49q1a5JI85CWllY5xKlUKsnKyjKYpAKAnTt34urqyvPnz9m3bx9jx47Vqt2WlpbMnTuXy5cvM2LECDZv3oyLiwtTpkzh8ePHGr12vXr1SEhIAKBq1aqMHz+eK1euMH/+fEmk/yBGXi3oUJwqb5mVlfXCEAMYxubm5jJz5kwGDhxI8+bNOXHiBB07dtSZPTY2NixevJi4uDgGDRrEunXrcHJyYubMmTx9+lQj16xXrx6PHz/O19WuSpUqjBs3rlCRnjhxQiN26DMGLU5DrLt89uwZPj4+LF68mGHDhnHw4EEaNGiga7MAeP3111mxYgXnzp3Dy8uLb775BicnJ+bNm8fz589FvZatrS1KpbJQD11QpL/++iu9evXSG5EW3N5BUxjssDY3N1cd9DEUYV6+fJl3332XmJgYVq1axbfffquXmTUODg6sXbuW06dP07VrVxYuXEjLli1ZsmQJqampolzD1tYWgPj4+CLfoxLp5cuX84nU09NTZyLN27hL06SmphqW51QNYxUKxYsLG8AwFmDLli106tSJ7OxsDh48yPDhw3VtUom8+eabbNy4kdjYWNq1a8fs2bNxcnJi5cqVZGRkVOjc9erVA4oXp4qCIr1+/bpORKpNYQKkp6dXuFwMtCROVcK6IQ1js7OzmTJlCkOHDqVNmzacOHGCdu3a6dqsMuHs7ExoaCjR0dG0aNGCadOm4eLiwrp169QPybKi8pyPHj0q9THFifT48ePlsqOsaPOeM4hhbcG1S0MRZmJiIr1792bFihWMHTuWqKgobGxsRL2GNj+Htm3bsmvXLvbs2UPDhg353//+R5s2bdi0aVO+wE5pqFOnDiYmJqXynAUpTKTvvfceHh4eGhWptu85vQ8IFbZ2aQjCPHv2LO3bt+fs2bMEBwezZMkSTExMdG2WKLi5uXHgwAHCwsKoXbs2Y8aMoW3btoSFheWrYikOuVxO3bp1y+Q5C5JXpF9++SW//fabVkSqLfRanIa4dgkQEhJCt27dMDY25ujRo/j5+enaJNGRyWT06NGDo0ePsmnTJkxMTBg2bBgdOnRgz549pYpm1qtXr1yesyBVqlRh7NixlU6kejmszTuMBcMJ+mRlZTF27FjGjBlDx44dOXHiBC4uLro2S6PIZDI8PT05efIk69evJysrCz8/P7p06UJ0dHSxIrW1ta2Q5yyIhYVFkSItQ2WH3iBG/yAQUZyqtUt925OkJB4+fEiPHj1Yv349QUFB7Nq1C0tLS12bpTXkcjn9+vXjzJkzrFq1ir/++os+ffrQq1cvYmNjyczMfOkYsTxnQQoTae/evXn//fcNSqRiDWtFrUrJysoqU4cyXfPLL78wePBg0tLS+P777+nTp4/Wrq2KYOtbHrFCoeDHH39k8eLFJCQkYGRkRO/evXF0dKRx48Y0btyYw4cPs2TJEh4+fCiKhyiKjIwMgoODWb58OY8fP6Zjx45MnTpVp1lZpaFbt24cO3asLDWvmi8ZU5V66TuCILB69Wo+/vhj7O3tCQ0NpVmzZlq1QV/FCS9GEwMHDuTSpUu89tpr1K5dm/v376sL31U0btyYZs2aqUWrejVo0AAjIyPR7MnIyCAkJIRly5YZhEg7duxYlv5BIInzBRkZGYwdO5bNmzfz/vvvExwcrJM+sfoqzlOnTjF48GAyMzNZu3Yt7733HvAis+vPP//kzp07HDhwgG+//Za2bduSnJzMH3/8kW/4a2Jigr29PY0aNconWgcHBxo2bFju6HdGRgY//PADy5YtIyEhAVdXVz799FO9E6kkznLwxx9/qD3CjBkz+PTTT3UmDn0UZ0hICEFBQTRs2JAtW7YUWcx969YtWrduzXfffYefnx9KpZL4+Hju3LnDnTt3uH37Nnfu3OHu3bvcuXOHtLQ09bFGRka8/vrr+QSr+rednV2phoLp6en8+OOPeilSVXOvCxcu6Jc4VTtn6SOHDh0iICCAnJwcfvjhB7VH0BWqjg/6MD9XKBR8/PHHBAcH4+7uTnBwcLHtNNPT06lbty6ff/45kydPLvbcgiCQmJjI7du3uXv37kvCzZuYL5PJaNCgwUvD5MaNG9OoUSOqVKmSLxWvoCft0KEDn376KW5ubqJ8LuWhHJ33oAhxGlxT6bIiCAJLly5l5syZvPnmm2zbtg1HR0ddm6U3JCYm4u/vz8mTJ5k0aRKfffZZifPFKlWqUKtWrVItp8hkMmxsbLCxseHdd9/N9ztBEHj27JlasHlfERERPHv2LN/769atS6NGjXBwcMDBwYFGjRrRvn17+vTpw/bt21m2bBkeHh5qkXbs2FHrD7/c3FzRRkOVWpypqamMHj2a8PBw+vbty5o1a0QJcVcWLly4wODBg3n27Bnr16+nX79+pT5WjOUUmUyGpaUllpaWhXYWTEpKKtTbHjx4kJ9++infe62srLCzs8PW1pZLly7h4eGBk5MTn3zyCe7u7lhYWFTI1tIiVgICVGJx3rp1i/79+3Pjxg3mz5/PpEmT9GIIqS9s3bqVCRMmYGVlxYEDB3B2di7T8fXq1RM1EaEwatWqhYuLCy4uLi99d6mpqWrhqkSreqnK4y5fvszgwYOxtrbm1q1bGrVVhd6KU19u/r179zJ06FCMjY3ZvXs33bp107VJhaKLNeGcnBw+++wzVq5ciaurKxs2bKBOnTplPo+trS3Xr1/XgIX/UlypV7Vq1WjZsiUtW7Z86XcZGRn88ccf3Lhxg1GjRmFnZ6dRO/Mipjj1J1QoAkqlki+++II+ffrQuHFjTpw4obfCBO0/zJ49e0bfvn1ZuXIlo0aNIiIiolzChMLblYhJRWowLSwsaNasGb6+vjRt2lSrGV9iFVpDJRrWJiUlMWzYMPbu3cvgwYNZuXKl1uYZ5UHbwvz1118ZOHAgjx49YtWqVfj7+1fofKp2JYmJieoaTzER6/OpU6dOvi0oNI1YbTFBZM+pq2Htr7/+iqurKwcOHGD58uWsW7dOr4WpbXbt2kW3bt3IzMxk7969FRYm/NsRQdPzzopibW3NX3/9pbXrpaeni+Y5DXpYq1Qq2b59Ox07diQlJYX9+/fz4Ycf6s3cV9colUrmzZvHkCFDaNasGTExMaLstwJla1eiS6ytrUlMTNRKYy8QL+kdDHxY26RJEx4+fIizszM7duzQyPDKUElOTmbUqFHs3buXIUOGsHTpUlE3HypPuxJdYG1tTWZmJikpKdSoUUPj19PbgJC2PZZqW+/r16+zatUqkpOTtXr9UpP8EAp5cmvqaX7r1i26devG/v37WbRoEatWrRJ9VzArKyuMjY3VDab1FVXAS1vzTjE9p0EPa8eMGQOAl5cXS5YsoWXLlvz444/6ld+blYppSHdMNvkgi7+Y71eaeJgdPHiQLl268OTJEyIiIjQ2zBejXYk2sLa2BtDavFMS5z+odoseN24csbGx2NvbM3r0aDp27Kg/2wGYmJPTcQqypzcx/aEHxrvGwPMHol9GEASWL1/OBx98QMOGDYmJidF4jml5s4S0Nf+DFx4etOc5xVxKMehhrSpH9tatW7z99tscOXKE4OBg9YazAQEBWtvgp0jkxihbD0Xx4Wly2k9E/lskpmvexfjoXMgSZxienp7OsGHD+Oyzz/D19eXAgQNaWXi3tbXl4cOHZTpGm8KEfz2ntsQpRWv/wc7ODrlcrk7Nksvl+Pn5ceXKFaZOnUpERAQtW7Zk3rx5FW6mXGHMqpPbeTqK0SdRNvPC+NRKqgV3xCQuBHKzSz6+CO7fv0+PHj3Yvn07n3/+OSEhIaIFJEoi76ZGJZF3KwRtPsRVc84nT55o5Xp6LU5tfvCmpqbY2dlx+/btfD+vWrUqs2bN4tKlS7z33nvqjW3DwsK0/uR+iRr1yfFcRVbgQZSWTTE/PJOqP3bF+Oa+QoNGxREbG0unTp24d+8e27ZtY/LkyVr9/G1tbUlJSSElJaXY9+UVpbZHVyYmJtSuXVurw1q9jNbqAkdHx5fEqcLe3p7Nmzdz4MABXnvtNYYMGUL37t25ePGido0sBKGuE+n9fibd5wcEmREWu0Zgse0D5Akl2yYIAmvWrMHLywtLS0sOHz5Mz549NW90AerWrQsUv9apC29ZECsrK615TrE670ElEKeDgwO3bt0q1iO6ublx8uRJVq5cyY0bN2jfvj1jxozRalpXochk5Dq4k/7faDLdv0T+9BZVN3lgHjkOWXLhc+WsrCzGjx/PlClT6NGjB4cPH1YHxrRN/fr1gaLXOvVBmPBi3ikNa9FNUCg5ObnEULmRkREjRozg6tWrjB8/no0bN9KiRQuWL19e7n1DRENuTLazP2nDfyGr3QSMb0VRNbgTpsfmQea/nQISEhJ4//332bBhA1OmTGHLli1aWVgvCpXnLEyc+iJMeOE5pXVOHeDg4ABQ6nq9WrVqsWjRIs6fP0/79u2ZOnUqbdq0ISoqSpNmlg6z6ihcPyZtaCw5TT0xPfsdVde7YnIhmDOnTuDm5sa1a9fYsGEDM2fO1Hn/IZXnzDus1VXgpzi0OazNyckRbfsOgxdn3uWUstC0aVMiIiLYuXMnMpkMX19fPD09uXHjhibMLBNCDVsy31tO+pAolNbN2bpsKr3few9zIyXRBw/i4+OjaxOBl9uV6DLwUxzW1tYkJycX2iBbnzH4Ya1qOaWooFBJ9OrVi/Pnz7No0SLOnDlDmzZtCAoK4u+//xbZ0rKTVbsp48/aMTQiE1eHapzzS+etq58hjy9T8yiNkpOTw549e1AoFHonShWqtU5Ne09V8bxYn4HBe86illPKgomJCRMmTODq1asEBgayatUqWrRowdq1a3XWTfDp06f4+vry3XffMXbsWMJO3Kaq1yLkf9+h6mZPzPeMRaaBTKPSolAo+Oijj0hNTSU+Pp42bdqwbds2/Uqd/AdtZgmJuVRn8OKEfyO2FcXKyopVq1Zx6tQpmjdvzvjx43nnnXc4evRoxY0sA1euXKFz586cPn2a7777ji+//BJjU3OynYf8GzS6vZ+qIZ0wi/kiX9BIG/z11194e3sTHBzMRx99RGhoKDVq1GDEiBF07NiRgwcP6n49OQ8qcWrac2ZnZ2NsLF6hl8EPa+HftU6xbghnZ2cOHDjA5s2bef78Ob169WLgwIHcvXtXlPMXx/bt23F3dyc7O5t9+/a9vA2habUXQaNhx8h50xuTc2uotr4DJhfWQ67mo86qB8f58+dZt24dc+bMoWfPnsTGxrJu3TpSUlLo27cvHh4enD17VuP2lAZtDWvFLBeDSuI5VcspYn74MpmMPn36cOnSJT7//HMOHDiAi4sLn332mbq7m5jk5uYya9YsAgMDcXJyIiYmhjZt2hT5fqG6LZm9lpHuv49c6xaYH/mcqj90xfjm3jJnGpWWiIgIunfvrn5w9O/fX/07uVxO//79OXfuHIsWLeL69et069aNIUOGcPPmTY3YU1q0lV8r5jIKVCJxQtkjtqXBwsKCTz/9lCtXrtCnTx8WLVpEy5Yt2bRpk2jzq6SkJPr378/SpUsJDAwkMjKy1NvcK63/Q8YHW0j3/RHByBSLXaOw+Lkv8vgLotgG/3ZU8Pf3p3nz5sTExNC6detC32tqasqHH37IpUuXmDp1KocPH6Zt27ZMmDBBZ+VlFhYWVKtWTSvi1GvPqYthrWqtsyJBoZKoX78+ISEhxMTEUL9+fYYPH07nzp05c+ZMuc+pVCq5fv06Xbt25ciRIyxdupRvvvlGXUReamQycht3Iz3gAJndFyD/+y5VN3v9EzS6X2774EWuqL+/PwsXLmTw4MFERUWpkw+Ko3r16kybNo1Lly4xcuRINm3ahIuLC59//rlOIuHaWOvUe3HqAnt7e4yMjLTSOLhdu3YcO3aMtWvXcv/+fdzc3Bg2bFiZvIIgCOTm5rJ//37c3d1JSkpix44dBAYGVswby43JdvonaPTOxH+CRp0xOzoXMpPKfLo//viD7t27ExkZyfz58/n2228xMzMr0zmsrKzUSR/e3t4sX74cZ2dnli9frtVKIW2k8IlZywmVRJwmJiYVXk4pC3K5HH9/f65cuUJQUBBhYWG0bNmShQsXlrjQLQgCOTk5LFy4kEGDBuHg4MCxY8fUO2Tl5uaSnZ1NdnY2ubm55ROraVUUHaaQNiyWnDd9MDn/PdXWu2Jyfl2pg0axsbF07tyZhw8fEh4ezrhx4yo0KrK3t2ft2rX88ssvvP3223z22We0atWKDRs2aKz3bV60kcInec4icHBw0Jo4VVSvXp0vvviCixcv0q1bNz7//HN1s7HCIse5ubkkJSUxZMgQ5s6dS//+/YmOjsbOzg4TExPMzMwwNTXFxMQEuVyOUqlUi7U8QhWq1yOz11LS/feTa90S86OzqPpDF4x/jywyaCQIAmvXrsXb25s6depw+PBhURtzt2zZkvDwcPbu3YutrS3jxo2jffv27N69W6PLL9oa1uq159RVhoijo2OJ1SmaonHjxmzbto2oqCiqVavGoEGD6NWrF1euXAH+Hcbevn0bd3d3du/ezfz581m/fv1L/XXlcjlGRkaYmpqqX0ZGRupzqLxqWYSqtG5OxgebSe+zAcHIHIvdo6my1Rf5o/P53qdKLJg8eTLdunXj0KFDGtuRzdXVlUOHDvHTTz8hCAKDBw/G3d2d48ePa+R6VlZWPH36VKNeWu/FqSscHR1JSUnRWoJzYXTp0oXTp0/z9ddfc+XKFdq1a8f48eNJTEzk0KFD6mHijh07mDhxYokPMrlcjlwuz+dVjY2NkclkZR/+ymTkNupKesB+MrsvRPb8PlW3eGO+5/+QJd3jyZMneHl5ERISwqRJk9i6davGd/yWyWR4eXlx6tQpVqxYwcOHD3nvvffo27ev+sEmFtbW1giCwNOnT0U9b17ErOWESiTOslanaApjY2NGjx7NtWvX+PDDDwkODsbBwQEvLy+sra05duwY7u7u5Tq3XC7H2Ng43/DXyMgo3/A3JyeneKHKjcl2GkzasNh/gkYHuDnflS7vuHDhwnnWr1/P7NmzS9yjU0yMjY3573//S1xcHHPmzOHs2bO4uroycuRI7t27J8o1tJGIoPdzTl0Na/VFnCpUpWknTpxAJpNhYmLC0aNH1XZWFNXw18TEBHNzc/XwN69XVSgURXvVf4JGP1lPxzUkjdzMVI4Nr4Vf4+dayTQqDAsLCz766CMuXbrERx99REREBK1bt+aTTz6pcGtLbeTXSsPaIrCzs8PIyEjrQaHCyM3NVc9tWrRowcCBA6levbqoQ56CqIa/qnlqSV5VtSNbwOiJtHBuTcyB3bRq83aeoNEejWUalcRrr73G7NmzuXjxIn5+fqxZswZnZ2cWLFhQ7uwsbWQJidkFATQkTl14TzGqUyqKKmijVCrzlQ45Ojry7NkzjaT9FUbeoFJhXvXZs2f4+fmxaNEiBg8eTGRkJNb/cfsnaLQRwdgci90fUmWLz0tBI21ia2vLihUrOHPmDJ07d2b+/Pk4OzuzZs2aMnevUHlOTTaXljxnMRTX7EvTCIKAUql8SZiAuoesWPOnspLXqz58+JDevXuzb98+5s2bx9dff41MJlN71dxGXUj3P0Bm90XIkh+8CBrt/hBZ0h86sR3gjTfeYNOmTURHR9O0aVOmTJnCW2+9RWhoaKmj1jVr1sTU1FSjnlPMzntQycSpWuvU9nJKUR5Thb29PaA7caqIiYmhc+fOxMfHs3PnTj766CPMzMzUZU7qCHCuksz/DCAlMIasdz7C+M4hqoZ0wezobMjQXRF627ZtiYyMJCwsjOrVqzN8+HDc3NyIjo4u8TuXyWQaT0QwiGitLtc6k5OTtdpVTyXM4qrgGzZsCLxIh9MFqlaanp6eWFtbExMTo04sKGypRpUAkSM3I63tRJIDY8hu3vdFWdrq9lw9tFEnfwe8uLd69OhBbGwsa9euJTk5mT59+uDp6cm5c+eKPVa1HaCmSE9P139x6gpNVqcUhioVD17c5EU9lKytrbGwsNCJ51QoFIwfP57//e9/9OjRgyNHjhQZMVYt1RRMgFBWtSa165c87b+bCzmNuZuunY7yxSGXyxkwYIC6RO3XX3+la9eu+Pv7F1miZmVlpfE5Z5UqVUQ7X6USpzaqU+Bfb5mTk1OqnjEymQx7e3uti/Px48f07t2bkJAQgoKC+Pnnn0vdSjPvUo3Kq5rWd2Ky6UzOCM0rnv8rEgVL1A4dOkTbtm2ZOHHiS82uNT2sVSqV+t0JAXQ3rFUtp2jScxYX+CmOhg0balWccXFxuLm5ERcXxw8//FDhxAKVV7WpYc6TtOzyJUBokIIlaj/99BMuLi7MmjWLpKQk4N/KFE3EJDRxzkrlOVXVKXfu3NHI+csrTECrnjM8PJzu3bsjCALR0dH069dPtHPb1DAjMVVRsQQIDaIqUTt37hyenp4sXboUJycnvv76a2rVqkV2drZarGIjdvfBSiVO+DcBXmxKisiWhJ2dHc+fP9doobFSqWT27NkEBATg5OTEsWPHaNWqlajXqFvDjMfJWfl+VtYECG3QqFEj1q1bpy5RmzlzJsuXLweK3j6ioojtPSvVsBbEb/YF/wZ+BEEoNvBTHJpeTklJSWHgwIEsWrSIgICAUncsKCvW1c1IzswhXVF4y9CiEiBApFrVMuLk5ER4eDhhYWHqxIUVK1aIfh2FQlH2DhYlUCk9Z0pKCo8fP67wuQoGfiqy/YFqOUUT4rxz5w5dunRh3759LF68uFwdC0pL3RovzpuYklXCO19QcKlGrFrVsvDgwQNmzZpFWloaXl5eLFq0SPRriJ30DiBeaElPyBuxrYjnqMj8sjBUnlPstc4jR44QEBCAIAhERETQpUsXUc9fEJvqL8T5ODkLe8uyLRuoHm4qT6oSqOpzVjXwVv1ejL1gTp8+jZ+fHwqFQt12VBOInR0ElXRYCxVb6xRbmPCiSqVmzZqieU5BEFi9ejXe3t7Y2Nhw7NgxjQsTXgSEAB6X0nMWR1EJELm5uaJ41a1bt+Lh4UG1atWIjo7WmDBB/LxaqITD2oYNG1aoOqWigZ+ikMlkoi2nZGVlMW7cOIKCgujVqxeHDx+mcePGIlhZMtb/eM6E5IqLMy8FEyBUQaW8HSBKG1RSBcZGjRpF27ZtOXz4ME2bNhXV3oJIw9pSYGJigpWVFSdPniQlJaVM6VQFM37Ext7evsKR5MePH+Pn58epU6f4+OOPtb4VYBVTI2qYG5d6zlkeihv+qryq6n0FYwGpqamMGjWKPXv2EBgYyJIlS0Tbkq84NOE5K5044cUmQAkJCVhZWVG1alVsbW2xtbWlXr16+f6tetna2mJsbCy6tyxIw4YNOXTokDoPt6zExcUxcOBAnj59yoYNG+jbt68GrCwZm0KWUzSJql0LvBBq3tENvIgCy2QyHj58iJ+fH9euXWPBggWMGTNGa1MsTcw5NSJOXW8D99lnnxESEsKdO3eoUqUKDRo0IDMzk1OnThEfH09W1ss3Vu3atfOJtaB469Wrh7W1dYWybBo1akR6ejqJiYml7uiuIiwsjA8//BBLS0uio6NxcXEptx0Vxaa6mShzzvJQlFc9e/YsgwcPJiMjg82bN9OzZ89yPwTLg+Q5S8mUKVMICgpi+/btTJkyhaNHjzJy5Eh27NhBzZo1efr0KfHx8Tx69IiHDx/y6NEj4uPj1a+rV6+SmJj40vxGLpdjY2Pzkmjr1q2b7/9r165d6E2hquu8f/9+6bdbUCqZO3cuixYton379mzevFld1a8rrKubceOxdgrHS0IulxMaGsqYMWOwtbUlMjISR0dH9XeXk5Oj9ryaHP5L4iwDMpmMvn370r17d2bPns3q1auJiIhg4cKFDBgwAEtLS5o1a1ZkqVdOTg5Pnjx5Sbiq/7979y4nT57k2bNnL13bzMwsn+etW7cutra26hvm1KlTNGvWrMQvMzk5mREjRhAZGUlgYCDLli0TfaG7PNjUMONpqoLsXCUmRrqLKSqVSubMmcPixYvp2LEjP/30E3Xq1Mn3+9LOVStKWlqa6EkfshIyacqdZlPY0FGXxMXFMX78eM6dO0fXrl1ZsmQJjo6OFf6CMjMzSUhIyCdc1b/z/jwtLe2lY2vUqFGo561Xrx53794lJCSEe/fusWjRIkaPHq3z6YKKbecfMSvyN6Intse2prlObEhLS2PkyJFERESU6sFV2FwVxBPqwoULcXJyyrfzWhko9IvVmOeUyWR6tYFqq1atiImJYc2aNcyaNYt27doRFBTE5MmTMTcv/w1mbm6Ovb29OsmgKJKTk4mPj6dz5864uLjg7u6uFnJCQgInTpwgPj6e7OzsfMdNnjxZr4QJedY6k7N0Is4///yT/v37c+XKFRYsWFCqrSLyzlXzBpIKS4Aoj1ClYW0FUD0oRo4ciZeXF1OnTmX+/Pls27aNZcuW0bVrV41ev0aNGtSoUYMmTZpgbGzM5MmTX3qPUqnkr7/+IiEhgbVr13L06FGWLFnCyZMn+eqrr3B2dtaojaWlroiJCGXl7Nmz9O/fn4yMDEJDQ+nVq1eZz6ESX94IcN6hb3mGv2J33oNKmIRQGKqMH1XIvV69evz444/s2rULQRDw9PRk6NChJCQkaNwWOzu7QhMRVHNfa2trnJycWLFiBZcuXWLVqlX8/vvvuLq6MmnSpELnuNombwqfNtm2bRs9e/akatWqHD58uFzCLAwxmnVrIglBY+LUl2FY3nlGwYqSbt26cebMGT799FN27txJ69at+f7779VPTk1gZ2fHgwcPCv2iC35mcrmcwMBALl68yKhRo1i3bh0uLi6EhIRo1MaSqGlhjJmxXGviVEWshw4dyltvvcXRo0dp3ry5Rq5V3mbdYjf3gkruOUvTfMvc3JwZM2Zw5swZWrVqxaRJk+jatStxcXEascne3h6FQvFSC43iHmavvfYaS5Ys4fjx47z55puMGzeOTp06VWjj3oogk8mw1tJaZ3p6Ov7+/ixYsICAgAD27NmTLyKraUpbqyr23pxQicWZt+t6aWowmzRpwp49e1i/fj337t3Dzc2NKVOmkJKSIqpdFenE5+TkxP79+wkODiYhIYEuXbowevRorXYbVFFY0bXYPHz4EHd3dyIiIvjyyy/59ttvdbqUVFSt6pMnTzTyMK904qxI4rpMJmPgwIHExcUxbNgwVq9eTatWrYrcb7M8VLToWiaTMWDAAOLi4pg0aRI///wzLi4urFq16qVIryaxqaFZz3nu3Dnc3Ny4c+cOYWFhTJgwQW+mSirkcjlJSUn4+fmxZcsWbG1txT2/qGfLgy4+SLFKvV577TW+/vprjhw5gpWVFUOGDKFv377cvXu3wjaKVXSt2rj3zJkzvPXWW3z88ce0b9+emJiYCttYGmyqm5GYkqWR5bLQ0FB69uyJmZkZhw4dEi3wIzZPnz6lX79+zJkzh+7du4t+/krjOTVR6vX2228TGxvLwoULOX78OG+99RaLFy8u8z4deTE3N6du3bqiFV2/8cYbREREsHXrVtLT0+nduzcBAQH8+eefopy/KGxqmJGdK/B3unjeWrW5UmBgIK1btyYmJob//Oc/op1fTJKSkujXrx/Tp0+nd+/eGrlGpRBnaQI/5cXY2Jhx48Zx4cIFevbsyaxZs2jfvj2xsbHlPqe9vT33798XzUaZTIanpyfnz59n+vTpREZG0qpVKxYvXqyxTC0bkes609PTCQgI4Msvv8Tf3589e/aoNx/SN5KTk+nXrx9BQUF4e3tr7DoGP6xVBX4q0nyrNNSvX5/NmzcTHh5ORkYGvXr1YtSoUeXajNXOzk4jWzNYWFgwbdo0Lly4gLu7O7NmzeLtt99m3759ol8rb5ZQRXn06BE9evRg586dzJs3j9WrV2usB1JFSU1NZcCAAYwbN44PPvhAo9cyWM9ZcBirrYLjXr16ce7cOSZPnszPP/9M69at+eGHH8rUSsPe3p4///xTYwEcOzs7tmzZQkREBEZGRvTt25d+/fqJ2s9XrCyh8+fP4+bmxs2bN9m2bRsfffSR3gV+VKSnpzNw4ECGDRvGoEGDNH49gxSnJnr8lIUqVaowZ84cTp48SbNmzRg7diw9evTg2rVrpTrezs4OpVLJw4cPNWqnu7s7p0+f5osvvuDYsWO0adOG2bNnk56eXuFzW1Y1xUgmq5DnDA8Pp0ePHpiYmHDo0CGNzd3EICMjg0GDBjFo0CD++9//auWaBjes1bUw89K8eXP279/P6tWr+f3333n33XeZMWNGoRUoeVHVdWpj1zFTU1MmTZrExYsX8fX1ZdGiRaIsDxnJZdSpZlouzykIAvPnzycgIEBdkNCiRYty26JpsrKy8Pf3x9fXlxEjRmjtugblOTXVfKsiyGQyAgICiIuLw8/Pj2XLltGmTRsiIyOLPEYX+3XWq1eP4OBgDhw4wGuvvcaQIUPw9PTk+vXr5T5nedqVZGRk8N///pd58+YxZMiQF7tq67h4vDgUCgWBgYH06NFDq21PwIDEKUbXdU1Su3ZtVq9ezcGDB6lWrRr9+/dnwIABPHjw4KX31q9fHyMjI51sCdihQweOHz/O0qVLiYuL45133mHq1KkkJyeX+VxlbVcSHx9Pjx492L59O1988QXfffed3gZ+ALKzsxk+fDgdOnRg4sSJWr/n9H5YK2bXdU2Rd3j47rvvcvLkSebMmcPhw4dp06YNy5cvzxf8MTExoX79+jrbTNfIyIjRo0dz8eJFhgwZwsqVK3F2dmbz5s1lGuqWxXPGxcXRsWNHfv/9d37++WcmTZqkdw/YvOTk5DB69GhcXFyYMmWKTmzVvzs9D/o0vywK1c2c1zYTExMmT56sTkGbPn06rq6unD59Wv0eXezXWRArKytWrVpFTEwMDRs2ZOTIkbi7u5c6T9SmuilpilxSs3KKfd/27dvp3r07xsbGREdH8/7774thvsbIzc1l3LhxODo6MmPGDJ3dd3orTkMQpoqibLOzsyM0NJStW7fy999/07VrV8aNG8ezZ89o2LChzjxnQdq0acORI0dYvXo1t2/fpmPHjkycOJGnT58We5xNjRddEIrynqrAj7+/v3rXs5YtW4puv5golUomTZpE3bp1mTNnjk7vO70Upz4GfoqiNLtae3p6cuHCBSZMmMCGDRto1aoVycnJJCQkkJmZqSVLi0culxMQEMDFixcZM2YMISEhuLi4sH79+iJrR22qv6gQKUycGRkZBAYGMm/ePPz8/IiKitLrwA+8EOaUKVOoWrUqCxYs0PkUSmMNvqB8Tb403XVd11y+fJmJEyeqazF9fHx4++23sba2zveysrKqUI/cinL16lWCgoKIjY3F2dmZpUuX8s477+R7z/1nGfRaeYp5Xm/i61JP/fP4+HgGDBjAhQsXmDNnjt7PL+GFMKdPn45CoWDVqlXavvcK/XA0Kk6FQlHqAIMhDWMrilKpZOjQoYSFhWFiYlJoppBMJsPS0hIbG5uXhJv3ZWNjQ506dTSy5YAgCISHh/Ppp5/y6NEj/Pz8mDt3rroFZFZOLq3mH2NC50Z86GYPvAj89O/fn+fPnxMcHIyHh4fodomNam+VZ8+esXbtWl04Bf0V56skzLxkZWVhampKcnIyiYmJPHnyhMePH5OYmFjkq6jsHktLyyLFa2VlpRa5lZVVmQuWU1NTWbRoEd988w3m5uZMmzaNMWPGYGJiwruLf6FHcytmvd+UnTt3MmLECOrUqcO2bdtwcnIS42PSKKp58f379/nhhx90NVrRT3G+qsIsL6mpqSUKWPVKTS28K3vt2rVfGkLn9dB5hZx3HfLmzZt8/PHHHDhwgGbNmvHVV1/x9W9VqVvdFPsH+5gzZw7t2rVjy5YtZd5uQhcIgsBXX33FjRs32LhxI8bGOmtGqX1xZmdnF5sQrslSL4kXTaeKEm5BgRfVjqVWrVovCTkpKYno6GiePn2KzRutyBbkPLt5nkGDBrFy5coK9QHWFoIgsGLFCs6ePcvWrVu1shNZMeiXOCt74MfQyMjIKFHAqtfz589fOn7atGlMmzbNIB6wgiCwZs0ajh49SlhYmD5scaE/4jSUZRKJwsnMzFTPjxeE7OBo7AkeXTiEqbH+P2QFQSA4OJioqCi2b9+uL15eu9sxwMtrgNL8snJgbm7O66+/zuuvv84go/r8auNOYkoWDV6z0LVpJbJx40Z2795NRESEvgizSLT2qCvYdV0SZuVAVXQt9jb0mmDLli1s27aNHTt2YGGh/w8SrYSn8gZ+9LGiRKL8WP/TS0iT29CLQXh4OBs2bGDPnj2ib5ugKTQuzoLC1De0uftxZcQQPOeuXbtYs2YNe/bsEX3LBE2iUbVcv35dvWiur8KUqBjVzIywMDHSW88ZFRXF119/za5du6hVq5auzSkTGlVMWFgYbm5ujB49mr179+pNkjcUXuolUXZkMhl1a5jppeeMjo5m4cKF7N69m9q1a+vanDKj0aUUeLFscuLECcLDwzl06BDNmzfHx8eH7t27U6VKlYqeXkIPGLohjsxsJVuGt9G1KWpiYmKYOXMmkZGRhpCtpP11zoIolUrOnTtHaGgoBw8exMHBAS8vL3r16mVQcwGJ/Oy6nEC6IpeBb9XXtSkAHD9+nE8++YTIyEjq1atX8gG6R/fizItSqeTSpUuEhoayb98+GjRogJeXF7179za4uYGE/nD69Gn+97//sXv3bho0aKBrc0qLfokz30UEgWvXrhEWFkZkZCSWlpb4+Pjw/vvvY2lpqQ0TJCoB58+fZ/z48URERKjbjxoI+ivOfBcUBH7//XfCwsLYvXs31atXx8vLC09PT6ysrKQAjkShXLp0iQ8//JDw8HAcHR11bU5ZMQxx5ru4IHDnzh3Cw8PZuXMnpqameHl54e3tTd26dSWhSgBw7do1hg8fTmhoKE2bNtW1OeXB8MSZF0EQePDgAeHh4ezYsQOlUomHhwe+vr40aNBAEuoryo0bNwgMDGTLli16u11gKTBsceZFEATi4+PZvn07O3bsIC0tDQ8PD7y9vWncuLEk1FeEmzdv4u/vz8aNG3F2dta1ORWh8oizIImJiezYsYPt27fz7NkzevfujY+PD2+88YYk1ErKH3/8waBBgwgJCaF169a6NqeiVF5x5uXZs2dEREQQHh5OfHw8PXv2xNfXl2bNmullCqFE2Xnw4AEDBgzg+++/p23btro2RwxeDXHm5fnz5+zevZvw8HD++OMP3N3d8fHxwdnZWRKqgfLo0SP69evHihUrcHV11bU5YvHqiTMvKSkp7N27l7CwMH7//Xe6dOmCj48Pb731liRUAyEhIYF+/fqxZMkSOnfurGtzxOTVFmdeMjIy2LdvH2FhYVy+fBk3Nzd8fHx45513dNrIWaJonjx5Qp8+fViwYAHdu3fXtTliUznEKXY1SVZWFgcPHiQsLIxz587x7rvv4uvrS4cOHXTZKlEiD0+fPqVv377MmjVLr3e/rgCVR5yaisAqFAqOHDlCeHg4J06coG3btnh7e9OpUyd96ND2SpKUlESfPn2YNm0aXl5eujZHU1QOcWqLnJwcYmNjCQ0N5dixY7Rq1Qpvb2+6du2q942hKgvJycn07duXSZMm8cEHH+jaHE0iibO85Obmcvz4ccLDwzl8+LBUk6oFUlNT+eCDDxgzZgyDBg3StTmaRhKnGCiVSs6ePauuSXV0dMTHx4cePXpINakikZaWxoABAwgMDCQgIEDX5mgDSZxio1QquXjxorom9fXXX8fb25vevXtTs2ZNXZtnkGRkZDBw4EAGDBjAiBEjdG2OtpDEqUkEQeDq1avqmlQrKyu8vb3x8PAwyP41uiArKws/Pz88PT0ZM2bMq5R6KYlTWwiCwG+//UZYWJi6HaNUk1o8CoWCgIAAunbtysSJE1+1z0gSpy4QBIHbt28THh5OREQEZmZmeHp6SjWpecjOzmbYsGG0a9eOKVOmvIqfiSROXSMIAvfv31fXpAJ4eHjg4+Pzytak5uTkMGrUKFq0aMH06dNfyc8ASZz6haomVSXUjIwMdU1qo0aNXombNDc3l//7v//D3t6eOXPmvBJ/cxFI4tRXBEHIV5P6999/V/qaVKVSycSJE7G0tGTBggWvevGBJE5D4enTp+qa1ISEhEpXk6pUKgkKCsLc3JylS5dWir+pgkjiNESSkpLy1aR2794dX19fnJycDPKmViqVTJs2jZycHFauXGmQf4MGkMRp6KSkpBAZGUl4eDi//fYb3bp1w9vb22BqUpVKJbNnz+bvv//m+++/NwibtYQkzspEeno6UVFRhIeHc+XKFTp16oS3t7fe1qQKgsD8+fN58OABISEhemmjDpHEWVnJzMxU16SeP3+eDh064OPjozc1qYIg8NVXX3Hjxg02btyoFzbpGZI4XwUUCgWHDx8mPDyckydP0rZtW3x8fHBzc9NJTaogCKxYsYJz586xZcsWTExMtG6DASCJ81UjJyeHY8eOERoaSmxsLK1atcLHx4cuXbpopSZVEATWrFlDTEwMoaGhUsF60UjifJVR1aSGhYVx+PBhWrRogY+PD+7u7hqpSRUEgfXr17Nv3z527NiBmZmZ6NeoREjilHiBUqnkzJkz6prUJk2a4OPjQ8+ePalWrZoo19iwYQPbt28nIiICCwsLUc5ZiZHEKfEySqWSuLg4QkND2b9/Pw0bNlTvk1remtQtW7awadMmdu/eTdWqVUW2uFIiiVOieJRKZb6aVGtr6zLXpIaFhbF+/XoiIyNF88KvAJI4JUqPIAjcuHFDXZNas2ZNvLy88PDwKLImddeuXaxcuZLIyEipE0TZkMQpUT5UNalhYWHs2rULMzMz9T6pNjY2yGQyoqKi+Oqrr4iMjJQ6P5QdSZwSFUcQBO7du6fe0BjgjTfe4OLFi+zfv586dero1kDDRBKnhLgIgsCjR4+YOXMmn3zyiaHuKq0PSOKUkNBTChWnVBYgIaGnSOKUkNBTJHFKSOgpkjglJPQUSZwSEnqKJE4JCT1FEqeEhJ4iiVNCQk+RxCkhoadI4pSQ0FMkcUpI6CmSOCUk9JSSGohWvh10JCQMBMlzSkjoKZI4JST0FEmcEhJ6iiROCQk9RRKnhISeIolTQkJP+X90HyREHKiqhQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Define the rotation angles (in radians)\n",
"alpha = radians(phi_1) # Rotation around the x-axis\n",
"beta = radians(phi_) # Rotation around the y-axis\n",
"gamma = radians(phi_2) # Rotation around the z-axis\n",
"\n",
"# Create the rotation matrices\n",
"Rx = np.array([[1, 0, 0],\n",
" [0, cos(alpha), -sin(alpha)],\n",
" [0, sin(alpha), cos(alpha)]])\n",
"\n",
"Ry = np.array([[cos(beta), 0, sin(beta)],\n",
" [0, 1, 0],\n",
" [-sin(beta), 0, cos(beta)]])\n",
"\n",
"Rz = np.array([[cos(gamma), -sin(gamma), 0],\n",
" [sin(gamma), cos(gamma), 0],\n",
" [0, 0, 1]])\n",
"\n",
"# Combine the rotation matrices\n",
"R = Rz @ Ry @ Rx\n",
"\n",
"# Apply the rotation to the line\n",
"point1 = np.column_stack((x, y, z))\n",
"point2 = np.column_stack((x1, y1, z1))\n",
"point3 = np.column_stack((h11,h12,h13))\n",
"point4 = np.column_stack((h21, h22, h23))\n",
"point5 = np.column_stack((h31, h32, h33))\n",
"point6 = np.column_stack((h41, h42, h43))\n",
"point7 = np.column_stack((h51, h52, h53))\n",
"point8 = np.column_stack((h61, h62, h63))\n",
"point9 = np.column_stack((k11, k12, k13))\n",
"point10 = np.column_stack((k21, k22, k23))\n",
"point11 = np.column_stack((k31, k32, k33))\n",
"point12 = np.column_stack((k41, k42, k43))\n",
"point13 = np.column_stack((k51, k52, k53))\n",
"point14 = np.column_stack((k61, k62, k63))\n",
"point15 = np.column_stack((v11, v12, v13))\n",
"point16 = np.column_stack((v21, v22, v23))\n",
"point17 = np.column_stack((v31, v32, v33))\n",
"point18 = np.column_stack((v41, v42, v43))\n",
"point19 = np.column_stack((v51, v52, v53))\n",
"point20 = np.column_stack((v61, v62, v63))\n",
"point21 = np.column_stack((x2, y2, z2))\n",
"\n",
"rotated_point1 = np.dot(R, point1.T).T\n",
"rotated_point2 = np.dot(R, point2.T).T\n",
"rotated_point3 = np.dot(R, point3.T).T\n",
"rotated_point4 = np.dot(R, point4.T).T\n",
"rotated_point5 = np.dot(R, point5.T).T\n",
"rotated_point6 = np.dot(R, point6.T).T\n",
"rotated_point7 = np.dot(R, point7.T).T\n",
"rotated_point8 = np.dot(R, point8.T).T\n",
"rotated_point9 = np.dot(R, point9.T).T\n",
"rotated_point10 = np.dot(R, point10.T).T\n",
"rotated_point11 = np.dot(R, point11.T).T\n",
"rotated_point12 = np.dot(R, point12.T).T\n",
"rotated_point13 = np.dot(R, point13.T).T\n",
"rotated_point14 = np.dot(R, point14.T).T\n",
"rotated_point15 = np.dot(R, point15.T).T\n",
"rotated_point16 = np.dot(R, point16.T).T\n",
"rotated_point17 = np.dot(R, point17.T).T\n",
"rotated_point18 = np.dot(R, point18.T).T\n",
"rotated_point19 = np.dot(R, point19.T).T\n",
"rotated_point20 = np.dot(R, point20.T).T\n",
"rotated_point21 = np.dot(R, point21.T).T\n",
"\n",
"# Extract the rotated coordinates\n",
"x_rotated1, y_rotated1, z_rotated1 = rotated_point1.T\n",
"x_rotated2, y_rotated2, z_rotated2 = rotated_point2.T\n",
"x_rotated3, y_rotated3, z_rotated3 = rotated_point3.T\n",
"x_rotated4, y_rotated4, z_rotated4 = rotated_point4.T\n",
"x_rotated5, y_rotated5, z_rotated5 = rotated_point5.T\n",
"x_rotated6, y_rotated6, z_rotated6 = rotated_point6.T\n",
"x_rotated7, y_rotated7, z_rotated7 = rotated_point7.T\n",
"x_rotated8, y_rotated8, z_rotated8 = rotated_point8.T\n",
"x_rotated9, y_rotated9, z_rotated9 = rotated_point9.T\n",
"x_rotated10, y_rotated10, z_rotated10 = rotated_point10.T\n",
"x_rotated11, y_rotated11, z_rotated11 = rotated_point11.T\n",
"x_rotated12, y_rotated12, z_rotated12 = rotated_point12.T\n",
"x_rotated13, y_rotated13, z_rotated13 = rotated_point13.T\n",
"x_rotated14, y_rotated14, z_rotated14 = rotated_point14.T\n",
"x_rotated15, y_rotated15, z_rotated15 = rotated_point15.T\n",
"x_rotated16, y_rotated16, z_rotated16 = rotated_point16.T\n",
"x_rotated17, y_rotated17, z_rotated17 = rotated_point17.T\n",
"x_rotated18, y_rotated18, z_rotated18 = rotated_point18.T\n",
"x_rotated19, y_rotated19, z_rotated19 = rotated_point19.T\n",
"x_rotated20, y_rotated20, z_rotated20 = rotated_point20.T\n",
"x_rotated21, y_rotated21, z_rotated21 = rotated_point21.T\n",
"\n",
"\n",
"# Plot the line\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(projection='3d')\n",
"ax.plot(x_rotated1, y_rotated1, z_rotated1)\n",
"ax.plot(x_rotated2, y_rotated2, z_rotated2)\n",
"#ax.plot(x_rotated21, y_rotated21, z_rotated21)\n",
"ax.plot(x_rotated3, y_rotated3, z_rotated3, 'k-')\n",
"ax.plot(x_rotated4, y_rotated4, z_rotated4, 'k-')\n",
"ax.plot(x_rotated5, y_rotated5, z_rotated5, 'k-')\n",
"ax.plot(x_rotated6, y_rotated6, z_rotated6, 'k-')\n",
"ax.plot(x_rotated7, y_rotated7, z_rotated7, 'k-')\n",
"ax.plot(x_rotated8, y_rotated8, z_rotated8, 'k-')\n",
"ax.plot(x_rotated9, y_rotated9, z_rotated9, 'k-')\n",
"ax.plot(x_rotated10, y_rotated10, z_rotated10, 'k-')\n",
"ax.plot(x_rotated11, y_rotated11, z_rotated11, 'k-')\n",
"ax.plot(x_rotated12, y_rotated12, z_rotated12, 'k-')\n",
"ax.plot(x_rotated13, y_rotated13, z_rotated13, 'k-')\n",
"ax.plot(x_rotated14, y_rotated14, z_rotated14, 'k-')\n",
"ax.plot(x_rotated15, y_rotated15, z_rotated15, 'k-')\n",
"ax.plot(x_rotated16, y_rotated16, z_rotated16, 'k-')\n",
"ax.plot(x_rotated17, y_rotated17, z_rotated17, 'k-')\n",
"ax.plot(x_rotated18, y_rotated18, z_rotated18, 'k-')\n",
"ax.plot(x_rotated19, y_rotated19, z_rotated19, 'k-')\n",
"ax.plot(x_rotated20, y_rotated20, z_rotated20, 'k-')\n",
"\n",
"ax.set_xticks([])\n",
"ax.set_yticks([])\n",
"ax.set_zticks([])\n",
"\n",
"ax.set_xlabel('')\n",
"ax.set_ylabel('')\n",
"ax.set_zlabel('')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "0f461c1e-f9db-4880-8ed3-2a4c841b2251",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Define the rotation angles (in radians)\n",
"alpha = damask.Orientation.from_matrix(R=np.linalg.inv(R_),family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235).as_Euler_angles(degrees=False)[0] \n",
"beta = damask.Orientation.from_matrix(R=np.linalg.inv(R_),family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235).as_Euler_angles(degrees=False)[1] \n",
"gamma = damask.Orientation.from_matrix(R=np.linalg.inv(R_),family='hexagonal',lattice='hP',a=1.0,b=1.0,c=1.6235).as_Euler_angles(degrees=False)[2] \n",
"\n",
"# Create the rotation matrices\n",
"Rx = np.array([[1, 0, 0],\n",
" [0, cos(alpha), -sin(alpha)],\n",
" [0, sin(alpha), cos(alpha)]])\n",
"\n",
"Ry = np.array([[cos(beta), 0, sin(beta)],\n",
" [0, 1, 0],\n",
" [-sin(beta), 0, cos(beta)]])\n",
"\n",
"Rz = np.array([[cos(gamma), -sin(gamma), 0],\n",
" [sin(gamma), cos(gamma), 0],\n",
" [0, 0, 1]])\n",
"\n",
"# Combine the rotation matrices\n",
"R = Rz @ Ry @ Rx\n",
"\n",
"# Apply the rotation to the line\n",
"point21 = np.column_stack((x_rotated1, y_rotated1, z_rotated1))\n",
"point22 = np.column_stack((x_rotated2, y_rotated2, z_rotated2))\n",
"point23 = np.column_stack((x_rotated3, y_rotated3, z_rotated3))\n",
"point24 = np.column_stack((x_rotated4, y_rotated4, z_rotated4))\n",
"point25 = np.column_stack((x_rotated5, y_rotated5, z_rotated5))\n",
"point26 = np.column_stack((x_rotated6, y_rotated6, z_rotated6))\n",
"point27 = np.column_stack((x_rotated7, y_rotated7, z_rotated7))\n",
"point28 = np.column_stack((x_rotated8, y_rotated8, z_rotated8))\n",
"point29 = np.column_stack((x_rotated9, y_rotated9, z_rotated9))\n",
"point30 = np.column_stack((x_rotated10, y_rotated10, z_rotated10))\n",
"point31 = np.column_stack((x_rotated11, y_rotated11, z_rotated11))\n",
"point32 = np.column_stack((x_rotated12, y_rotated12, z_rotated12))\n",
"point33 = np.column_stack((x_rotated13, y_rotated13, z_rotated13))\n",
"point34 = np.column_stack((x_rotated14, y_rotated14, z_rotated14))\n",
"point35 = np.column_stack((x_rotated15, y_rotated15, z_rotated15))\n",
"point36 = np.column_stack((x_rotated16, y_rotated16, z_rotated16))\n",
"point37 = np.column_stack((x_rotated17, y_rotated17, z_rotated17))\n",
"point38 = np.column_stack((x_rotated18, y_rotated18, z_rotated18))\n",
"point39 = np.column_stack((x_rotated19, y_rotated19, z_rotated19))\n",
"point40 = np.column_stack((x_rotated20, y_rotated20, z_rotated20))\n",
"point41 = np.column_stack((x_rotated21, y_rotated21, z_rotated21))\n",
"\n",
"rotated_point21 = np.dot(R, point21.T).T\n",
"rotated_point22 = np.dot(R, point22.T).T\n",
"rotated_point23 = np.dot(R, point23.T).T\n",
"rotated_point24 = np.dot(R, point24.T).T\n",
"rotated_point25 = np.dot(R, point25.T).T\n",
"rotated_point26 = np.dot(R, point26.T).T\n",
"rotated_point27 = np.dot(R, point27.T).T\n",
"rotated_point28 = np.dot(R, point28.T).T\n",
"rotated_point29 = np.dot(R, point29.T).T\n",
"rotated_point30 = np.dot(R, point30.T).T\n",
"rotated_point31 = np.dot(R, point31.T).T\n",
"rotated_point32 = np.dot(R, point32.T).T\n",
"rotated_point33 = np.dot(R, point33.T).T\n",
"rotated_point34 = np.dot(R, point34.T).T\n",
"rotated_point35 = np.dot(R, point35.T).T\n",
"rotated_point36 = np.dot(R, point36.T).T\n",
"rotated_point37 = np.dot(R, point37.T).T\n",
"rotated_point38 = np.dot(R, point38.T).T\n",
"rotated_point39 = np.dot(R, point39.T).T\n",
"rotated_point40 = np.dot(R, point40.T).T\n",
"rotated_point41 = np.dot(R, point41.T).T\n",
"\n",
"# Extract the rotated coordinates\n",
"x_rotated21, y_rotated21, z_rotated21 = rotated_point21.T\n",
"x_rotated22, y_rotated22, z_rotated22 = rotated_point22.T\n",
"x_rotated23, y_rotated23, z_rotated23 = rotated_point23.T\n",
"x_rotated24, y_rotated24, z_rotated24 = rotated_point24.T\n",
"x_rotated25, y_rotated25, z_rotated25 = rotated_point25.T\n",
"x_rotated26, y_rotated26, z_rotated26 = rotated_point26.T\n",
"x_rotated27, y_rotated27, z_rotated27 = rotated_point27.T\n",
"x_rotated28, y_rotated28, z_rotated28 = rotated_point28.T\n",
"x_rotated29, y_rotated29, z_rotated29 = rotated_point29.T\n",
"x_rotated30, y_rotated30, z_rotated30 = rotated_point30.T\n",
"x_rotated31, y_rotated31, z_rotated31 = rotated_point31.T\n",
"x_rotated32, y_rotated32, z_rotated32 = rotated_point32.T\n",
"x_rotated33, y_rotated33, z_rotated33 = rotated_point33.T\n",
"x_rotated34, y_rotated34, z_rotated34 = rotated_point34.T\n",
"x_rotated35, y_rotated35, z_rotated35 = rotated_point35.T\n",
"x_rotated36, y_rotated36, z_rotated36 = rotated_point36.T\n",
"x_rotated37, y_rotated37, z_rotated37 = rotated_point37.T\n",
"x_rotated38, y_rotated38, z_rotated38 = rotated_point38.T\n",
"x_rotated39, y_rotated39, z_rotated39 = rotated_point39.T\n",
"x_rotated40, y_rotated40, z_rotated40 = rotated_point40.T\n",
"x_rotated41, y_rotated41, z_rotated41 = rotated_point41.T\n",
"\n",
"\n",
"# Plot the line\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111, projection='3d')\n",
"ax.plot(x_rotated21, y_rotated21, z_rotated21)\n",
"ax.plot(x_rotated22, y_rotated22, z_rotated22)\n",
"ax.plot(x_rotated23, y_rotated23, z_rotated23, 'k-')\n",
"ax.plot(x_rotated24, y_rotated24, z_rotated24, 'k-')\n",
"ax.plot(x_rotated25, y_rotated25, z_rotated25, 'k-')\n",
"ax.plot(x_rotated26, y_rotated26, z_rotated26, 'k-')\n",
"ax.plot(x_rotated27, y_rotated27, z_rotated27, 'k-')\n",
"ax.plot(x_rotated28, y_rotated28, z_rotated28, 'k-')\n",
"ax.plot(x_rotated29, y_rotated29, z_rotated29, 'k-')\n",
"ax.plot(x_rotated30, y_rotated30, z_rotated30, 'k-')\n",
"ax.plot(x_rotated31, y_rotated31, z_rotated31, 'k-')\n",
"ax.plot(x_rotated32, y_rotated32, z_rotated32, 'k-')\n",
"ax.plot(x_rotated33, y_rotated33, z_rotated33, 'k-')\n",
"ax.plot(x_rotated34, y_rotated34, z_rotated34, 'k-')\n",
"ax.plot(x_rotated35, y_rotated35, z_rotated35, 'k-')\n",
"ax.plot(x_rotated36, y_rotated36, z_rotated36, 'k-')\n",
"ax.plot(x_rotated37, y_rotated37, z_rotated37, 'k-')\n",
"ax.plot(x_rotated38, y_rotated38, z_rotated38, 'k-')\n",
"ax.plot(x_rotated39, y_rotated39, z_rotated39, 'k-')\n",
"ax.plot(x_rotated40, y_rotated40, z_rotated40, 'k-')\n",
"ax.plot(x_rotated40, y_rotated40, z_rotated40, 'k-')\n",
"#ax.plot(x_rotated41, y_rotated41, z_rotated41)\n",
"\n",
"ax.set_xticks([])\n",
"ax.set_yticks([])\n",
"ax.set_zticks([])\n",
"\n",
"ax.set_xlabel('')\n",
"ax.set_ylabel('')\n",
"ax.set_zlabel('')\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}