Archived
1
0
Fork 0
This repository has been archived on 2024-02-06. You can view files and clone it, but cannot push or open issues or pull requests.
SMS-Geography/shape.ipynb

1137 lines
241 KiB
Text
Raw Normal View History

2022-02-04 20:24:40 +09:00
{
"cells": [
{
"cell_type": "markdown",
"id": "62555b4e-5276-4457-a870-dc3d6edb65f9",
"metadata": {},
"source": [
"# SMS Shape Notebook"
]
},
{
"cell_type": "markdown",
"id": "7f65558a-315c-44cf-a3dc-17a92eefe171",
"metadata": {},
"source": [
"## 準備 Preparation"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1bba5694-e605-4c44-b263-aa9beb3ac116",
"metadata": {},
"outputs": [],
"source": [
"# 必要なパッケージをインストール\n",
"# Install the required packages\n",
"!pip install numpy matplotlib"
]
},
{
"cell_type": "code",
2022-03-11 21:31:38 +09:00
"execution_count": 2,
2022-02-04 20:24:40 +09:00
"id": "bb2b194e-b451-4a35-ba17-f74619d658c5",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from numpy import array\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.path import Path\n",
"from matplotlib import patches\n",
"import matplotlib.ticker as plticker\n",
"normalize = lambda x: x/np.linalg.norm(x)\n",
"tau = 2*np.pi"
]
},
{
"cell_type": "markdown",
"id": "00ec378c-11c0-48fa-b863-430c82d5b015",
"metadata": {},
"source": [
"### 日本語を含む図の作成 <br> Making plot containing Japanese\n",
"日本語を含む図を作成する際に、次のパッケージをインストールしてimportする必要があります。 \n",
"If you are making plots containing Japanese, you have to install\n",
"and import the following package."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cd3ea05f-666b-420c-a020-e53b01ade1ae",
"metadata": {},
"outputs": [],
"source": [
"!pip install japanize_matplotlib"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b4fa0f55-3570-47f6-9f5f-0da6bb6e9f7f",
"metadata": {},
"outputs": [],
"source": [
"import japanize_matplotlib"
]
},
{
"cell_type": "markdown",
"id": "528ea79d-13f4-4c98-a306-1fa55071f05c",
"metadata": {},
"source": [
"### class of shapes\n",
"多角形と凸多面体を実装したクラス \n",
"Classes that implement polygon and convex polyhedron"
]
},
{
"cell_type": "code",
2022-03-11 21:31:38 +09:00
"execution_count": 3,
2022-02-04 20:24:40 +09:00
"id": "21603f5b-59ad-45d3-945e-58978b8b3099",
"metadata": {},
"outputs": [],
"source": [
"# 多角形\n",
"class Polygon():\n",
" def __init__(self, verts):\n",
" '''\n",
" * self.verts:\n",
" 頂点の配列\n",
" Array of vertices\n",
" '''\n",
" self.verts = np.array(verts)\n",
" def clipLine(self, p, n, c=0):\n",
" '''\n",
" 半平面 (x-p)・n >= c との共通部分の多角形を返す\n",
" Return the intersection polygon with half plane (x-p)・n >= c\n",
" * p:\n",
" 直線上の一点\n",
" Any point on the line\n",
" * n:\n",
" 直線の法線ベクトル\n",
" Normal vector of the line\n",
" * c:\n",
" 定数\n",
" Constant\n",
" '''\n",
" p, n, c = map(array, (p, n, c))\n",
" r = np.dot(self.verts-p, n)-c\n",
" verts = []\n",
" for i in range(len(r)):\n",
" v0, r0 = self.verts[i-1], r[i-1]\n",
" v1, r1 = self.verts[i], r[i]\n",
" if r1 >= 0:\n",
" if r0 < 0: # (- +)\n",
" verts.append((r1*v0-r0*v1)/(-r0+r1))\n",
" verts.append(v1)\n",
" elif r0 >= 0: # (+ -)\n",
" verts.append((-r1*v0+r0*v1)/(r0-r1))\n",
" return Polygon(array(verts).reshape(-1, self.verts.shape[1]))\n",
" def path(self, axis=(0, 1)):\n",
" '''\n",
" Get Path instance\n",
" * axis:\n",
" 用いる軸を指定(デフォルトxとy)\n",
" - ``(0, 2)'': xとz\n",
" - ``(2, 1)'': zとy\n",
" The axes to use (Defaults: x, y)\n",
" - ``(0, 2)'': x and z\n",
" - ``(2, 1)'': z and y\n",
" '''\n",
" if self.verts.shape[0] == 0: return Path(np.zeros((0, 2)))\n",
" verts = self.verts[:, axis]\n",
" assert verts.shape[-1] == 2, 'verts should be 2D'\n",
" return Path([*verts, (0, 0)], [\n",
" Path.MOVETO,\n",
" *(Path.LINETO for _ in range(1, verts.shape[0])),\n",
" Path.CLOSEPOLY,\n",
" ])\n",
" def plot(self, axis=(0, 1), margin=0.05, facecolor='#2ee5b8', lw=1):\n",
" '''\n",
" この多角形を描画し、figとaxを返す\n",
" Plot this polygon and return ``fig'' and ``ax''\n",
" * axis:\n",
" self.pathを参照\n",
" See self.path\n",
" * margin:\n",
" Margin of the plot\n",
" * facecolor:\n",
" 面の色\n",
" Face color\n",
" * lw:\n",
" 線の太さ\n",
" Line width\n",
" '''\n",
" fig, ax = plt.subplots()\n",
" if self.verts.shape[0] == 0: return fig, ax\n",
" # path\n",
" path = self.path(axis)\n",
" patch = patches.PathPatch(path, facecolor=facecolor, lw=lw)\n",
" ax.add_patch(patch)\n",
" verts = self.verts[:, axis]\n",
" xMax, yMax = verts.max(axis=0)\n",
" xMin, yMin = verts.min(axis=0)\n",
" xMg, yMg = verts.ptp(axis=0)*margin\n",
" ax.set_xlim(xMin-xMg, xMax+xMg)\n",
" ax.set_ylim(yMin-yMg, yMax+yMg)\n",
" return fig, ax\n",
" def __repr__(self):\n",
" return f'Polygon with {len(self.verts)}vertices:\\n{self.verts}'\n",
"\n",
"# 多面体\n",
"class Polyhedron:\n",
" def __init__(self, verts, edges):\n",
" '''\n",
" * self.verts:\n",
" 頂点の配列\n",
" Array of vertices\n",
" * self.edges:\n",
" 辺(2頂点の番号)の配列\n",
" Array of edges (indices of 2 vertices)\n",
" '''\n",
" self.verts = np.array(verts)\n",
" self.edges = edges\n",
" def clipPlane(self, p, n, c=0):\n",
" '''\n",
" 半空間 (x-p)・n >= c との共通部分の多面体を返す\n",
" Return the intersection polyhedron with half space (x-p)・n >= c\n",
" * p:\n",
" 平面上の一点\n",
" Any point on the plane\n",
" * n:\n",
" 直線の法線ベクトル\n",
" Normal vector of the plane\n",
" * c:\n",
" 定数\n",
" Constant\n",
" '''\n",
" p, n, c = map(array, (p, n, c))\n",
" r = np.dot(self.verts-p, n)-c\n",
" rb = [s>=0 for s in r]\n",
" # map vertex indices old to new\n",
" io2n = {\n",
" iO: iN\n",
" for iN, iO in enumerate(iO for iO, sb in enumerate(rb) if sb)\n",
" }\n",
" # handle old vert\n",
" verts = [v for v, sb in zip(self.verts, rb) if sb]\n",
" edges = []\n",
" for i0, i1 in self.edges:\n",
" if rb[i0] and rb[i1]:\n",
" # remain\n",
" edges.append((io2n[i0], io2n[i1]))\n",
" elif rb[i0] or rb[i1]:\n",
" # new vert\n",
" v0, r0 = self.verts[i0], abs(r[i0])\n",
" v1, r1 = self.verts[i1], abs(r[i1])\n",
" vN = (r1*v0+r0*v1)/(r0+r1)\n",
" edges.append((io2n[i0 if rb[i0] else i1], len(verts)))\n",
" verts.append(vN)\n",
" # else drop edge\n",
" # add new face\n",
" nOld = len(io2n)\n",
" vNews = verts[nOld:]\n",
" if len(vNews):\n",
" assert len(vNews) >= 3\n",
" p0, p1 = vNews[:2]\n",
" # choose p1-p0 as e1\n",
" e1 = normalize(p1-p0)\n",
" # choose e2 that ⊥ n, e1\n",
" e2 = normalize(np.cross(n, e1))\n",
" # set (p0+p1)/2 as new origin, and use {e1, e2} as new basis\n",
" cNews = np.dot(vNews-(p0+p1)/2, array([e1, e2]).transpose())\n",
" # indices of new verts CCW\n",
" jNews = nOld+np.arctan2(cNews[:,0], cNews[:,1]).argsort()\n",
" # add to edge\n",
" for i in range(len(vNews)):\n",
" edges.append((jNews[i-1], jNews[i]))\n",
" # final\n",
" return Polyhedron(array(verts).reshape(-1, self.verts.shape[1]), edges)\n",
" def slicePlane(self, p, n):\n",
" '''\n",
" 平面 (x-p)・n=0 との共通部分(多角形)の頂点を返す\n",
" Return vertices of intersection(polygon) with plane (x-p)・n=0\n",
" * p:\n",
" 平面上の一点\n",
" Any point on the plane\n",
" * n:\n",
" 平面の法線ベクトル\n",
" Normal vector of the plane\n",
" '''\n",
" p, n = map(array, (p, n))\n",
" r = np.dot(self.verts-p, n)\n",
" vNews = []\n",
" # handle old verts\n",
" for i0, i1 in self.edges:\n",
" # two vertices on other side of the plane\n",
" if np.sign(r[i0]) != np.sign(r[i1]):\n",
" v0, r0 = self.verts[i0], abs(r[i0])\n",
" v1, r1 = self.verts[i1], abs(r[i1])\n",
" vN = (r1*v0+r0*v1)/(r0+r1)\n",
" vNews.append(vN)\n",
" # new verts\n",
" if len(vNews):\n",
" assert len(vNews) >= 2\n",
" p0, p1 = vNews[:2]\n",
" e1 = normalize(p1-p0)\n",
" e2 = normalize(np.cross(n, e1))\n",
" cNews = np.dot(vNews-(p0+p1)/2, array([e1, e2]).transpose())\n",
" jNews = np.arctan2(cNews[:,0], cNews[:,1]).argsort()\n",
" return array([vNews[j] for j in jNews])\n",
" else:\n",
" return array(np.zeros((0, self.verts.shape[-1])))\n",
" def __repr__(self):\n",
" return 'Polyhedron with %d vertices and %d edges:\\n%s'%(\n",
" len(self.verts), len(self.edges),\n",
" #'\\n'.join(line for line in str(\n",
" array([self.verts[[i0, i1]] for i0, i1 in self.edges])\n",
" #).split('\\n') if line)\n",
" )"
]
},
{
"cell_type": "code",
2022-03-11 21:31:38 +09:00
"execution_count": 4,
2022-02-04 20:24:40 +09:00
"id": "a2316c48-2614-4f93-b152-f0d8ab379c9b",
"metadata": {},
"outputs": [],
"source": [
"# 等高線図\n",
"def contourMap(poly, ys, colors, margin=0.05, lw=1):\n",
" '''\n",
" 与えたy座標に対して多面体の等高線図を描画\n",
" Plot a contour map of polyhedron with given y\n",
" * poly:\n",
" 多面体\n",
" Polyhedron\n",
" * ys:\n",
" 等高線のy座標配列\n",
" Array of y coordinate of the contour map\n",
" * colors:\n",
" 各層の色の配列\n",
" Array of colors of each layer\n",
" * margin:\n",
" Margin of the plot\n",
" * lw:\n",
" 線の太さ\n",
" Line width\n",
" '''\n",
" fig, ax = plt.subplots()\n",
" xyMin = array([np.inf]*2)\n",
" xyMax = -xyMin\n",
" for y, color in zip(ys, colors):\n",
" verts = poly.slicePlane((0, y, 0), (0, 1, 0))\n",
" verts = verts[:, (0, 2)] # (x, z)\n",
" path = Polygon(verts).path()\n",
" ax.add_patch(patches.PathPatch(path, facecolor=color, lw=lw))\n",
" # update xyMin, xyMax\n",
" xyMin = np.min([xyMin, *verts], axis=0)\n",
" xyMax = np.max([xyMax, *verts], axis=0)\n",
" # 座標の範囲を設定\n",
" # set range of coordinate\n",
" xyRg = (xyMax-xyMin)*margin\n",
" xyMax += xyRg\n",
" xyMin -= xyRg\n",
" ax.set_xlim(xyMin[0], xyMax[0])\n",
" ax.set_ylim(xyMin[1], xyMax[1])\n",
" return fig, ax"
]
},
{
"cell_type": "markdown",
"id": "83b62be5-adad-43f4-af69-6a0895c4c6da",
"metadata": {},
"source": [
"## すり抜け可能領域の可視化 <br> Visualization of the area that you can clip through"
]
},
{
"cell_type": "markdown",
"id": "05bb2811-1590-4315-8c74-1cf3643683c0",
"metadata": {},
"source": [
"### 三角形の座標\n",
"調べたい三角形の座標を入力しましょう。例としてシレナINの地面三角形を使います。 \n",
"Fill in the coordinates of the triangle that you want to research on.\n",
"I will use the floor triangle of Sirena IN as an example."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b6d717b7-2cb5-4843-850c-deefd755cac4",
"metadata": {},
"outputs": [],
"source": [
"tri = array([\n",
" (-331.148, 2064.531, 1757.190),\n",
" (174.367, 2357.666, 1443.628),\n",
" (-174.367, 2357.666, 1443.628),\n",
"])"
]
},
{
"cell_type": "markdown",
"id": "958256e5-ba48-4d89-a5d9-cfffedd2095c",
"metadata": {},
"source": [
"hex形式の座標データを使う場合、次のように配列に変換することができます。 \n",
"If you use the hex form of the coordinate data,\n",
"you can convert it to array as shown below."
]
},
{
"cell_type": "code",
2022-03-11 21:31:38 +09:00
"execution_count": 23,
2022-02-04 20:24:40 +09:00
"id": "f0c3daf3-4b26-4a4e-a7bf-ad6a7e7e89a0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-331.14801025, 2064.53100586, 1757.18994141],\n",
" [ 174.36700439, 2357.66601562, 1443.62805176],\n",
" [-174.36700439, 2357.66601562, 1443.62805176]])"
]
},
2022-03-11 21:31:38 +09:00
"execution_count": 23,
2022-02-04 20:24:40 +09:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw = 'C3 A5 92 F2 45 01 08 7F 44 DB A6 14 43 2E 5D F4 45 13 5A A8 44 B4 74 19 C3 2E 5D F4 45 13 5A A8 44 B4 74 19'\n",
2022-03-11 21:31:38 +09:00
"tri = np.frombuffer(bytes.fromhex(raw), '>f').astype('d').reshape(-1, 3)[:3, :]\n",
2022-02-04 20:24:40 +09:00
"tri"
]
},
{
"cell_type": "markdown",
"id": "a59964d7-767e-49ee-b510-c9f9fafb62ce",
"metadata": {},
"source": [
"### すり抜け可能領域 <br> The area that you can clip through\n",
"マリオの位置を`M`、水平速度を`vh`、鉛直速度を`vy`とし、三角形の境界は水平方向で`B`を通って`nB`を単位法線ベクトル(三角形外向き)とした直線とし、すり抜ける地面の高さを`yB`とすると、すり抜ける条件は次の通りです。 \n",
"1. `M`が三角形の上方にある\n",
"2. 1QF後マリオが地面の判定の下にいる`M.y + vy/4 < yB-30`\n",
"3. 1QF後マリオが水平方向で境界を超える`(M+vh/4-B)・nB > 0`\n",
"\n",
"Let `M` be Mario's position,\n",
"`vh` be his horizontal speed, and `vy` be his vertical speed,\n",
"the border of the triangle be a line passes `B`\n",
"with normalized normal vector `nB` (point outward from the triangle)\n",
"horizontally, and the height of the triangle Mario that clips though be `yB`,\n",
"he can clip through the floor if the following conditions are met.\n",
"1. `M` is above the triangle\n",
"2. Mario is below the hitbox of the floor triangle after 1 QF: `M.y + vy/4 < yB-30`\n",
"3. Mario cross the border horizontally after 1 QF: `(M+vh/4-B)・nB > 0`"
]
},
{
"cell_type": "code",
2022-03-11 21:31:38 +09:00
"execution_count": 6,
2022-02-04 20:24:40 +09:00
"id": "4a7cc39b-1506-46ba-a6d9-2f9714d6b747",
"metadata": {},
"outputs": [],
"source": [
"def getClipThroughArea(vh, vy, B, nB, yB):\n",
" # 法線ベクトルを正規化\n",
" # normalize normal vector\n",
" nB = normalize(nB) \n",
" \n",
" # 条件1において、三角形以上の領域は無限に続く三角柱であるが、\n",
" # 無限の処理はややこしいため、ここでは適当な上限(yMax+75)を設けて\n",
" # 多面体である三角柱にする。\n",
" # For condition 1, the area above the triangle is a\n",
" # triangular prism that extends infinitely.\n",
" # However, it is difficult to deal with infinity,\n",
" # and therefore we choose an appropriate upper bound (yMax+75)\n",
" # and make the area a finite triangular prism.\n",
" poly = Polyhedron([\n",
" # 下の三角形 = 地面三角形\n",
" # the bottom triangle = the floor triangle\n",
" *tri,\n",
" # 上の三角形xとz座標を固定してyをyMax+75とする\n",
" # the upper triangle: fix x and z coordinate and set y=yMax+75\n",
" *(\n",
" [v[0], tri[:,1].max()+75, v[2]]\n",
" for v in tri\n",
" )\n",
" ], [\n",
" e for i in range(3)\n",
" for e in [\n",
" # 下の三角形の辺\n",
" # the edge of the bottom triangle\n",
" (i, (i+1)%3),\n",
" # 上の三角形の辺\n",
" # the edge of the upper triangle\n",
" (3+i, 3+(i+1)%3),\n",
" # 下の三角形から上の三角形を繋ぐ辺\n",
" # the edge that connect the bottom triangle and the upper triangle\n",
" (i, 3+i),\n",
" ]\n",
" ])\n",
"\n",
" # 条件2において、M.y + vy/4 < yB-30より、\n",
" # For confition 2, since M.y + vy/4 < yB-30,\n",
" # -M.y > vy/4+30-yB\n",
" # (M-0)・(0, -1, 0) > vy/4+30-yB\n",
" poly = poly.clipPlane((0, 0, 0), (0, -1, 0), vy/4+30-yB)\n",
"\n",
" # 条件3において、(M-(B-vh/4))・nB > 0\n",
" # For condition 3, (M-(B-vh/4))・nB > 0\n",
" poly = poly.clipPlane(B-vh/4, nB)\n",
" \n",
" # 条件1~3を満たす領域はpolyとなる\n",
" # Now the area satisfies condition 1.~3. is exactly poly\n",
" return poly"
]
},
{
"cell_type": "markdown",
"id": "7f2c757f-995a-4075-9bf4-478a7377a713",
"metadata": {},
"source": [
"シレナINの例で定数は次のように与えられたとすると、上記の関数を用いれば、すり抜け可能領域が求まります。 \n",
"In the Sirena IN example, suppose the constants are given as below.\n",
"You can then simply use the function above to get the area\n",
"that you can clip though."
]
},
{
"cell_type": "code",
2022-03-11 21:31:38 +09:00
"execution_count": 24,
2022-02-04 20:24:40 +09:00
"id": "2f14f7cf-0187-4fdb-9d18-0e9ef08ff423",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"poly = getClipThroughArea(\n",
" # 水平速度 horizontal speed\n",
" vh = array([0, 0, -50]),\n",
" # 鉛直速度 vertical speed\n",
" vy = -75,\n",
" # 境界上の一点 a point on the border\n",
" B = tri[1],\n",
" # 境界の法線ベクトル normal vector of the border\n",
2022-03-11 21:31:38 +09:00
" # -(n.x, 0, n.z); n = cross(P1-P0, P2-P1) in game\n",
" nB = np.cross(tri[0]-tri[1], tri[2]-tri[1])*(1, 0, 1),\n",
2022-02-04 20:24:40 +09:00
" # すり抜ける地面の高さ\n",
" # height of the triangle that Mario clips through\n",
" yB = tri[1][1],\n",
")\n",
"\n",
"# x=0のときの断面図を描画。図の横軸をz軸(2)、縦軸をy軸(1)とする\n",
"# plot the cross section when x = 0\n",
"# use z(2) as horizontal axis and y(1) as vertical axis\n",
"fig, ax = Polygon(poly.slicePlane((0, 0, 0), (1, 0, 0))).plot(axis=(2, 1))\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "6ed1e86e-e805-4be4-acde-0446cdf4063c",
"metadata": {},
"source": [
"生成した図に関して、matplotlibで色々設定できます。 \n",
"You can configure the generated plot with matplotlib."
]
},
{
"cell_type": "code",
2022-03-11 21:31:38 +09:00
"execution_count": 25,
2022-02-04 20:24:40 +09:00
"id": "0b64860d-b36b-4b5c-bb03-3e00daca9014",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = Polygon(poly.slicePlane((0, 0, 0), (1, 0, 0))[:,[2,1]]).plot()\n",
"\n",
"# 図のサイズを設定 resize figure\n",
"fig.set_size_inches(6, 6)\n",
"\n",
"# タイトルを設定\n",
"ax.set_title('SB Pipe (vy=-75, vz=-50)')\n",
"# x軸のラベルを設定\n",
"ax.set_xlabel('z')\n",
"# y軸のラベルを設定\n",
"ax.set_ylabel('y')\n",
"\n",
"# 0.05刻みにする\n",
"# set tick interval to 0.05\n",
"ax.xaxis.set_major_locator(plticker.MultipleLocator(base=0.05))\n",
"ax.yaxis.set_major_locator(plticker.MultipleLocator(base=0.05))\n",
"\n",
"# ラベルのフォーマットを設定(xは目盛の値、iは番号)\n",
"# set the format of the labels\n",
"# (x is the value of the tick, and i is the index)\n",
2022-03-11 21:31:38 +09:00
"ax.xaxis.set_major_formatter(plticker.FormatStrFormatter('%.2f'))\n",
"ax.yaxis.set_major_formatter(plticker.FormatStrFormatter('%.2f'))\n",
2022-02-04 20:24:40 +09:00
"\n",
"# x軸のラベルを30度回転\n",
"# rotate x label 30 deg\n",
"ax.xaxis.set_tick_params(rotation=30)\n",
"\n",
"# グリッドを表示 show grid\n",
"ax.grid()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
2022-03-11 21:31:38 +09:00
"id": "9163f1a0-9c6b-45ea-a856-ba98a6c9303c",
2022-02-04 20:24:40 +09:00
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "335e87c1-0a22-4b1c-8161-c684c3dd7105",
"metadata": {},
"source": [
"## 付録:本ライブラリによる図の描画 <br> Appendix: Plot with this library"
]
},
{
"cell_type": "markdown",
"id": "19d9404c-fead-4a44-a188-6a62da53b932",
"metadata": {},
"source": [
"毎回`fig.set_size_inches`でサイズを設定する代わりに、次の命令で図のデフォルトサイズを設定することができます。 \n",
"Instead of using `fig.set_size_inches` every time,\n",
"you can use the following instruction to set the default figure size."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "38910dd9-8393-48e9-8856-9d38ce8ef7e0",
"metadata": {},
"outputs": [],
"source": [
"plt.rcParams[\"figure.figsize\"] = (5, 5)"
]
},
{
"cell_type": "markdown",
"id": "3cb0f6a6-9feb-457e-a093-7ccda1f36f7b",
"metadata": {},
"source": [
"### 多角形 Polygon"
]
},
{
"cell_type": "markdown",
"id": "6253eec4-a591-48b5-a4be-e791c14273ae",
"metadata": {},
"source": [
"例として、ある正七角形といくつかの半平面との共通部分の描画方法を示します。 \n",
"As an example, I will demonstrate how to draw the intersection polygon\n",
"of a regular heptagon (7-gon) and some half planes."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "7456018c-e8af-4ee7-b23c-4b7699d550f8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# (1.5, 0.5)を中心とし、外接円半径2、-0.4 radだけ回転した正七角形\n",
"# A heptagon with center (1, 0.5), circumradius 2, rotated 0.05 rad\n",
"poly0 = Polygon(array([\n",
" [f(tau/7*i-0.4) for f in (np.cos, np.sin)]\n",
" for i in range(7)\n",
"])*2+(1.5, 0.5))\n",
"\n",
"# 描画 plot\n",
"fig, ax = poly0.plot()\n",
"# 図のサイズを設定 resize figure\n",
"fig.set_size_inches(5, 5)\n",
"# タイトルを設定\n",
"ax.set_title('7-gon')\n",
"# x軸のラベルを設定\n",
"ax.set_xlabel('x')\n",
"# y軸のラベルを設定\n",
"ax.set_ylabel('y')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "81c98984-dbab-4111-8769-673c40c047e9",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# x+y>=1 との共通部分を取る\n",
"# Take the intersection with x+y>=1\n",
"## P=(1, 0) n=(1, 1)\n",
"poly1 = poly0.clipLine((1, 0), (1, 1))\n",
"fig, ax = poly1.plot()\n",
"fig.set_size_inches(5, 5)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "daad4079-a225-4665-84fc-cd84be429871",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 更に -x+4y<=6 との共通部分を取る\n",
"# Also take the intersection with -x+4y<=6\n",
"## P=(-6, 0) n=-(-1, 4)\n",
"poly2 = poly1.clipLine((-6, 0), (1, -4))\n",
"fig, ax = poly2.plot()\n",
"fig.set_size_inches(5, 5)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "8b749f43-a34f-4834-8b08-40e1c3bcb610",
"metadata": {},
"source": [
"### 多面体 Polyhedron\n",
"例として、立方体といくつかの半空間との共通部分の**断面図**と**等高線図**の描画方法を示します。 \n",
"As an example, I will demonstrate how to plot the **cross section** and\n",
"**contour map** of the intersection of a cube and some half-spaces."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "26cf21b3-2d63-4667-953d-f443f09ac658",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Polyhedron with 8 vertices and 12 edges:\n",
"[[[0 0 0]\n",
" [0 0 1]]\n",
"\n",
" [[0 0 0]\n",
" [1 0 0]]\n",
"\n",
" [[0 0 1]\n",
" [1 0 1]]\n",
"\n",
" [[0 1 1]\n",
" [1 1 1]]\n",
"\n",
" [[1 0 0]\n",
" [1 1 0]]\n",
"\n",
" [[1 0 1]\n",
" [1 1 1]]\n",
"\n",
" [[0 1 0]\n",
" [0 1 1]]\n",
"\n",
" [[1 1 0]\n",
" [1 1 1]]\n",
"\n",
" [[0 0 0]\n",
" [0 1 0]]\n",
"\n",
" [[1 0 0]\n",
" [1 0 1]]\n",
"\n",
" [[0 1 0]\n",
" [1 1 0]]\n",
"\n",
" [[0 0 1]\n",
" [0 1 1]]]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cube = Polyhedron([\n",
" (i>>2&1, i>>1&1, i&1) for i in range(8)\n",
"], list({\n",
" (i, j)\n",
" for i in range(8)\n",
" for j in (i^4, i^2, i^1)\n",
" if i < j\n",
"}))\n",
"\n",
"cube"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "ab435fc3-6818-498b-8abd-97a1bb6e0327",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Polyhedron with 10 vertices and 15 edges:\n",
"[[[0. 0. 0. ]\n",
" [0. 0. 1. ]]\n",
"\n",
" [[0. 0. 0. ]\n",
" [1. 0. 0. ]]\n",
"\n",
" [[0. 0. 1. ]\n",
" [0.5 0. 1. ]]\n",
"\n",
" [[1. 0. 0. ]\n",
" [1. 1. 0. ]]\n",
"\n",
" [[0. 1. 0. ]\n",
" [0. 1. 0.5 ]]\n",
"\n",
" [[1. 1. 0. ]\n",
" [1. 1. 0. ]]\n",
"\n",
" [[0. 0. 0. ]\n",
" [0. 1. 0. ]]\n",
"\n",
" [[1. 0. 0. ]\n",
" [1. 0. 0.75 ]]\n",
"\n",
" [[0. 1. 0. ]\n",
" [1. 1. 0. ]]\n",
"\n",
" [[0. 0. 1. ]\n",
" [0. 0.33333333 1. ]]\n",
"\n",
" [[0. 1. 0.5 ]\n",
" [0. 0.33333333 1. ]]\n",
"\n",
" [[0. 0.33333333 1. ]\n",
" [0.5 0. 1. ]]\n",
"\n",
" [[0.5 0. 1. ]\n",
" [1. 0. 0.75 ]]\n",
"\n",
" [[1. 0. 0.75 ]\n",
" [1. 1. 0. ]]\n",
"\n",
" [[1. 1. 0. ]\n",
" [0. 1. 0.5 ]]]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 2x+3y+4z<=5 との共通部分\n",
"# Intersection with x+y+z<=2\n",
"## P=(1,1,0), n=-(2,3,4)\n",
"poly3 = cube.clipPlane((1,1,0), (-2,-3,-4))\n",
"poly3"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "d3174a4e-0f45-4088-9c99-1f50e7591e35",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"vertices:\n",
"[[1. 0.5 0. ]\n",
" [1. 0.5 0.375]\n",
" [0. 0.5 0.875]\n",
" [0. 0.5 0. ]]\n",
"\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# y=0.5の時の断面図\n",
"# Cross section when y=0.5\n",
"## P=(0,0.5,0), n=(0,1,0)\n",
"cs3 = poly3.slicePlane((0, 0.5, 0), (0, 1, 0))\n",
"print('vertices:', cs3, sep='\\n', end='\\n\\n')\n",
"\n",
"# only use coordinate of x and z axis (0, 2)\n",
"fig, ax = Polygon(cs3[:, [0, 2]]).plot()\n",
"fig.set_size_inches(5, 5)\n",
"ax.set_title('y = 0.5')\n",
"ax.set_xlabel('x')\n",
"ax.set_ylabel('z')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "dfb82844-c7a1-4cbd-a20c-6c92aaeba3c3",
"metadata": {},
"source": [
"等高線図は、複数の断面図の合成とみなせます。 \n",
"Contour map can be seen as composition of several cross sections."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "667bd35d-b3bd-4d52-a2de-144990e07377",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# y=0, 0.1, 0.2, ..., 1.0 とする\n",
"# Let y=0, 0.1, 0.2, ..., 1.0\n",
"ys = np.arange(11)/10\n",
"\n",
"# 各層の色\n",
"# Colors for each layer\n",
"colors = [\n",
" # red to yellow: 4\n",
" *('#FF%02X3F'%g for g in 0x3F+191*np.arange(4)//4),\n",
" # yellow to green: 1\n",
" *('#%02XFF3F'%r for r in 0xFF-191*np.arange(1)//1),\n",
" # green to cyan: 1\n",
" *('#3FFF%02X'%b for b in 0x3F+191*np.arange(1)//1),\n",
" # cyan to blue: 4\n",
" *('#3F%02XFF'%g for g in 0xFF-191*np.arange(4)//4),\n",
"][::-1] # reverse order\n",
"\n",
"# plot\n",
"fig, ax = contourMap(poly3, ys, colors)\n",
"fig.set_size_inches(6, 6)\n",
"\n",
"# 0.1刻みにする\n",
"# set tick interval to 0.1\n",
"ax.xaxis.set_major_locator(plticker.MultipleLocator(base=0.1))\n",
"ax.yaxis.set_major_locator(plticker.MultipleLocator(base=0.1))\n",
"\n",
"# グリッドを表示\n",
"# show grid\n",
"ax.grid()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "5dfbf5df-68ca-415b-b9a3-5667403904b1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 更に 4x-y-z>=1 と 2x-y>=0.4 との共通部分を取る\n",
"# Also take the intersection with 4x-y-z>=1 and 2x-y>=0.4\n",
"poly4 = poly3.clipPlane((0, 0, -1), (4, -1, -1))\n",
"poly4 = poly4.clipPlane((0.2, 0, 0), (2, -1, 0))\n",
"\n",
"fig, ax = contourMap(poly4, ys, colors)\n",
"fig.set_size_inches(6, 6)\n",
"\n",
"# 0.1刻みにする\n",
"# set tick interval to 0.1\n",
"ax.xaxis.set_major_locator(plticker.MultipleLocator(base=0.1))\n",
"ax.yaxis.set_major_locator(plticker.MultipleLocator(base=0.1))\n",
"\n",
"# グリッドを表示\n",
"# show grid\n",
"ax.grid()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a5222815-2553-46e7-a846-fb6d3c91d56c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "fb96d7a1-070a-4003-83f0-fb484d66603c",
"metadata": {},
"source": [
"## LICENSE"
]
},
{
"cell_type": "raw",
"id": "38626361-2823-4fd2-909e-200da839b233",
"metadata": {},
"source": [
"Copyright (c) 2022 sup39[サポミク]\n",
"\n",
"Permission is hereby granted, free of charge, to any person\n",
"obtaining a copy of this software and associated documentation\n",
"files (the \"Software\"), to deal in the Software without\n",
"restriction, including without limitation the rights to use,\n",
"copy, modify, merge, publish, distribute, sublicense, and/or sell\n",
"copies of the Software, and to permit persons to whom the\n",
"Software is furnished to do so, subject to the following\n",
"conditions:\n",
"\n",
"The above copyright notice and this permission notice shall be\n",
"included in all copies or substantial portions of the Software.\n",
"\n",
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n",
"EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n",
"OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n",
"NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n",
"HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n",
"WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n",
"FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n",
"OTHER DEALINGS IN THE SOFTWARE."
]
},
2022-03-11 21:31:38 +09:00
{
"cell_type": "raw",
"id": "0412e7fe-ec24-43d4-bac0-ff42ab11bcd0",
"metadata": {},
"source": [
"なおさん(@naosan_RTA2)が一部の数式を追加し、Formatterのバグを修正してくださいました。ありがとうございます"
]
},
2022-02-04 20:24:40 +09:00
{
"cell_type": "code",
"execution_count": null,
"id": "71e144f3-6bff-4901-81b2-eb54c66576cc",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.9.1"
}
},
"nbformat": 4,
"nbformat_minor": 5
}