見出し画像

変位勾配テンソルによる変形(定数)

これから連続体力学(弾性体力学&流体力学)の勉強を進めていくための準備として、連続体の変位と変形の関係を表す変形勾配テンソルの可視化を3次元グラフィックスで行うよ。変形勾配テンソル($${D}$$)とは、変位$${\delta \boldsymbol{x}}$$に対する変形$${ \delta \boldsymbol{r}}$$ の関係を表すテンソルだよ。

$$
\delta \boldsymbol{r} =\frac{\partial \boldsymbol{r}}{\partial \boldsymbol{x} }\, \delta \boldsymbol{x} \ \ , \ D:=\frac{\partial \boldsymbol{r}}{\partial \boldsymbol{x} }=\left( \begin{matrix} \frac{\partial r_x}{ \partial x} & \frac{\partial r_x}{ \partial y} & \frac{\partial r_x}{ \partial z} \\ \frac{\partial r_y}{ \partial x} & \frac{\partial r_y}{ \partial y} & \frac{\partial r_y}{ \partial z} \\ \frac{\partial r_z}{ \partial x} & \frac{\partial r_z}{ \partial y} & \frac{\partial r_z}{ \partial z} \end{matrix} \right)
$$

このテンソルを用いると、変形後の座標は次のように計算することができるね。

$$
\boldsymbol{r}^{\prime} =\boldsymbol{r} + \delta \boldsymbol{r} = \boldsymbol{r} +D \delta \boldsymbol{x}
$$

任意の行列は対称行列と反対称行列の和で表すことができるので、$${D}$$を対称行列$${E}$$と反対称行列$${F}$$に分けて

$$
D = E + F ,   E_{ij} =\frac{1}{2} \left( D_{ij} +D_{ji} \right) ,   F_{ij} =\frac{1}{2} \left( D_{ij} -D_{ji} \right)
$$

と表すことができるね。詳細は割愛するけれども、このとき$${E}$$は歪(ひずみ)、$${F}$$は回転を表すよ。

この$${E}$$と$${F}$$の成分に対する変形を可視化するツールを作ったよ。インプットフォームに半角小数を与えると、それに対応した変形を見ることができるよ。$${E}$$と$${F}$$は対称行列、反対称行列なので、入力できるのは上三角だけに限定しているよ。下の図は、歪んだ分だけ回転させることで$${x}$$軸上を固定した変形を実現している図だね。色々なパラメータで試してみてください。

ツールURL

https://natural-science.or.jp/files/physics/20241016.html

3次元グラフィックス(three.js)については過去記事を参考にしてください。これからも応援よろしくお願いしまーす!

Javascript プログラムソース

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>変位勾配テンソルによる変形(定数)</title>
<script src="https://natural-science.or.jp/files/physics/UV_Grid_Sm.js"></script>
<script id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<style>
*{padding:0px; margin:0px}
div#canvas-frame{
	width: 1200px;  /* 横幅 */
	height: 900px; /* 縦幅 */
	overflow:hidden;
}
table.matrix input{
	width: 30px;
}
section#field{
	padding: 10px 20px;
	border: 1px solid gray;
	border-radius: 10px;
	margin: 10px 10px;
	width: 1140px;
}
</style>
<script type="importmap">
	{
		"imports": {
			"three": "https://unpkg.com/three@0.168.0/build/three.module.js",
			"three/addons/": "https://unpkg.com/three@0.168.0/examples/jsm/"
		}
	}
</script>
<script type="module">
import * as THREE from 'three';
import { TrackballControls } from 'three/addons/controls/TrackballControls.js';

//初期変位勾配テンソル
let D = [
	[0, 1, 0],
	[0, 0, 0],
	[0, 0, 0]
]

//変位勾配テンソルによる変位計算
function Deformation( D, r ){
	let x = D[ 0 ][ 0 ] * r[ 0 ] + D[ 0 ][ 1 ] * r[ 1 ] + D[ 0 ][ 2 ] * r[ 2 ];
	let y = D[ 1 ][ 0 ] * r[ 0 ] + D[ 1 ][ 1 ] * r[ 1 ] + D[ 1 ][ 2 ] * r[ 2 ];
	let z = D[ 2 ][ 0 ] * r[ 0 ] + D[ 2 ][ 1 ] * r[ 1 ] + D[ 2 ][ 2 ] * r[ 2 ];
	return [ x, y, z ];
}
//格子点座標の初期値
let initialPositionArray = [ ]

////////////////////////////////////////////////////////////////////
// windowイベントの定義
////////////////////////////////////////////////////////////////////
window.addEventListener("load", function () {
	document.querySelector("#E11").value = D[0][0];
	document.querySelector("#E12").value = ( D[0][1] + D[1][0] ) / 2.0;
	document.querySelector("#E13").value = ( D[0][2] + D[2][0] ) / 2.0;
	document.querySelector("#E21").value = ( D[1][0] + D[0][1] ) / 2.0;
	document.querySelector("#E22").value = D[1][1];
	document.querySelector("#E23").value = ( D[1][2] + D[1][2] ) / 2.0;
	document.querySelector("#E31").value = ( D[2][0] + D[0][2] ) / 2.0;
	document.querySelector("#E32").value = ( D[2][1] + D[1][2] ) / 2.0;
	document.querySelector("#E33").value = D[2][2];
	document.querySelector("#F11").value = 0
	document.querySelector("#F12").value = ( D[0][1] - D[1][0] ) / 2.0;
	document.querySelector("#F13").value = ( D[0][2] - D[2][0] ) / 2.0;
	document.querySelector("#F21").value = ( D[1][0] - D[0][1] ) / 2.0;
	document.querySelector("#F22").value = 0
	document.querySelector("#F23").value = ( D[1][2] - D[1][2] ) / 2.0;
	document.querySelector("#F31").value = ( D[2][0] - D[0][2] ) / 2.0;
	document.querySelector("#F32").value = ( D[2][1] - D[1][2] ) / 2.0;
	document.querySelector("#F33").value = 0

	document.querySelector("#field").addEventListener("input", function(){
		document.querySelector("#E21").value = document.querySelector("#E12").value;
		document.querySelector("#E31").value = document.querySelector("#E13").value;
		document.querySelector("#E32").value = document.querySelector("#E23").value;
		document.querySelector("#F21").value = - parseFloat( document.querySelector("#F12").value);
		document.querySelector("#F31").value = - parseFloat( document.querySelector("#F13").value);
		document.querySelector("#F32").value = - parseFloat( document.querySelector("#F23").value);
	})


	threeStart(); //Three.jsのスタート関数の実行
});
////////////////////////////////////////////////////////////////////
// Three.jsスタート関数の定義
////////////////////////////////////////////////////////////////////
function threeStart() {
	initThree();  //Three.js初期化関数の実行
	initLight();  //光源初期化関数の実行
	initObject(); //オブジェクト初期化関数の実行
	initCamera(); //カメラ初期化関数の実行
	loop();       //無限ループ関数の実行
}
////////////////////////////////////////////////////////////////////
// Three.js初期化関数の定義
////////////////////////////////////////////////////////////////////
//グローバル変数の宣言
let renderer,    //レンダラーオブジェクト
    scene,       //シーンオブジェクト
    canvasFrame; //キャンバスフレームのDOM要素
function initThree() {
	//キャンバスフレームDOM要素の取得
	canvasFrame = document.getElementById('canvas-frame');
	//レンダラーオブジェクトの生成
	renderer = new THREE.WebGLRenderer({ antialias: true });

	if (!renderer) alert('Three.js の初期化に失敗しました');
	//レンダラーのサイズの設定
	renderer.setSize(canvasFrame.clientWidth, canvasFrame.clientHeight);
	//キャンバスフレームDOM要素にcanvas要素を追加
	canvasFrame.appendChild(renderer.domElement);

	//レンダラークリアーカラーの設定
	renderer.setClearColor(0xEEEEEE, 1.0);

	//シーンオブジェクトの生成
	scene = new THREE.Scene();
}
////////////////////////////////////////////////////////////////////
// カメラ初期化関数の定義
////////////////////////////////////////////////////////////////////
//グローバル変数の宣言
let camera;    //カメラオブジェクト
let trackball;
function initCamera() {
	//カメラオブジェクトの生成
	camera = new THREE.PerspectiveCamera(45, canvasFrame.clientWidth / canvasFrame.clientHeight, 1, 10000);
	//カメラの位置の設定
	camera.position.set(0, -10, 50);
	//カメラの上ベクトルの設定
	camera.up.set(0, 0, 1);
	//カメラの中心位置ベクトルの設定
	camera.lookAt(new THREE.Vector3(0,0,10)); //トラックボール利用時は自動的に無効

	//トラックボールオブジェクトの宣言
	trackball = new TrackballControls(camera, canvasFrame);

	//トラックボール動作範囲のサイズとオフセットの設定
	trackball.screen.width = canvasFrame.clientWidth;                        //横幅
	trackball.screen.height = canvasFrame.clientHeight;                      //縦幅
	trackball.screen.offsetLeft = canvasFrame.getBoundingClientRect().left;  //左オフセット
	trackball.screen.offsetTop = canvasFrame.getBoundingClientRect().top;    //右オフセット

	//トラックボールの回転無効化と回転速度の設定
	trackball.noRotate = false;
	trackball.rotateSpeed = 2.0;

	//トラックボールの拡大無効化と拡大速度の設定
	trackball.noZoom = false;
	trackball.zoomSpeed = 4.0;

	//トラックボールのカメラ中心移動の無効化と中心速度の設定
	trackball.noPan = false;
	trackball.panSpeed = 1.0;
	trackball.target = new THREE.Vector3(0, 0, 0);

	//トラックボールのスタティックムーブの有効化
	trackball.staticMoving = true;
	//トラックボールのダイナミックムーブ時の減衰定数
	trackball.dynamicDampingFactor = 0.3;

}
////////////////////////////////////////////////////////////////////
// 光源初期化関数の定義
////////////////////////////////////////////////////////////////////
//グローバル変数の宣言
let directionalLight,  //平行光源オブジェクト
    ambientLight;      //環境光オブジェクト
function initLight() {
	//平行光源オブジェクトの生成
	directionalLight = new THREE.DirectionalLight(0xffffff, 2.0, 0);
	//平行光源オブジェクトの位置の設定
	directionalLight.position.set(50, -50, 50);
	//平行光源オブジェクトの影の生成元
	directionalLight.castShadow = false;

	//平行光源オブジェクトのシーンへの追加
	scene.add(directionalLight);

	//環境光オブジェクトの生成
	ambientLight = new THREE.AmbientLight(0x666666);
	//環境光オブジェクトのシーンへの追加
	scene.add(ambientLight);

}
////////////////////////////////////////////////////////////////////
// オブジェクト初期化関数の定義
////////////////////////////////////////////////////////////////////
let box;
function initObject() {
	//スカイドームの生成
	let skydome = createSkydome();
	//床オブジェクトをシーンへ追加
	scene.add( skydome );
	//床オブジェクトの生成
	let floor = createFloor();
	//床オブジェクトをシーンへ追加
	scene.add( floor );

	//img要素の生成
	let img = new Image();         
	img.src = UV_Grid_Sm;  //DataURL

	let texture = new THREE.Texture( img );
	texture.needsUpdate = true;	
	//カラースペースの指定
	texture.colorSpace = THREE.SRGBColorSpace;

	let L = 10;

	//形状オブジェクトの宣言と生成
	let geometry = new THREE.BoxGeometry(
		L, //width:x軸方向の幅(デフォルト:1.0)
		L, //height:y軸方向の幅(デフォルト:1.0)
		L, //depth:z軸方向の幅(デフォルト:1.0)
		10,  //widthSegments:x軸方向の分割数(デフォルト:1)
		10,  //heightSegments:y軸方向の分割数(デフォルト:1)
		10   //depthSegments:z軸方向の分割数(デフォルト:1)
	);

	//材質オブジェクトの宣言と生成
	let material = new THREE.MeshPhongMaterial({map: texture , color: 0xffffff, specular: 0xffffff, shininess: 250 })

	//直方体オブジェクトの生成
	box = new THREE.Mesh(geometry, material);
	//直方体オブジェクトのシーンへの追加
	scene.add(box);
	//直方体オブジェクトの位置座標を設定
	box.position.set(-L/2, -L/2, 0);

	for(let i = 0; i < box.geometry.attributes.position.array.length/3; i++){
		box.geometry.attributes.position.array[ 3 * i + 0 ] += L/2; 
		box.geometry.attributes.position.array[ 3 * i + 1 ] += L/2; 
		box.geometry.attributes.position.array[ 3 * i + 2 ] += L/2;
	}
	for(let i = 0; i < box.geometry.attributes.position.array.length; i++){
		initialPositionArray.push( box.geometry.attributes.position.array[i] );
	}

	let arrowY = new Arrow3D( THREE, 1, 2, 0.2, 0x00ff00 );
	arrowY.setArrowBottomToTop( {x:-L/2, y:-L/2, z:0}, {x:-L/2, y:2*L, z:0} )
	scene.add( arrowY.CG );

	let arrowX = new Arrow3D( THREE, 1, 2, 0.2, 0xff0000 );
	arrowX.setArrowBottomToTop( {x:-L/2, y:-L/2, z:0}, {x:2*L, y:-L/2, z:0} )
	scene.add( arrowX.CG );

	let arrowZ = new Arrow3D( THREE, 1, 2, 0.2, 0x0000ff );
	arrowZ.setArrowBottomToTop( {x:-L/2, y:-L/2, z:0}, {x:-L/2, y:-L/2, z:2*L} )
	scene.add( arrowZ.CG );

}
class Arrow3D{
	constructor( THREE, headWidth, headLength, bodyWidth , color ) {
		this.THREE = THREE;
		this.headWidth = headWidth;
		this.headLength = headLength;
		this.bodyWidth = bodyWidth;
		this.color = color;
		this.startPoint = 2 //1:中心、2:矢印の元
		
		//円柱オブジェクトの生成
		this.arrowHead = new this.THREE.Mesh(
			new this.THREE.CylinderGeometry(0, headWidth, headLength, 50, 50), 
			new this.THREE.MeshPhongMaterial({ color: color, specular: 0xffffff, shininess: 250 })
			//new this.THREE.MeshBasicMaterial({ color: color })
		);
		this.arrowHead.position.set( 0, - headLength/2, 0 );
	
		//円柱オブジェクトの生成
		this.arrowBody = new this.THREE.Mesh(
			new this.THREE.CylinderGeometry(bodyWidth, bodyWidth, 1, 50, 50), 
			new this.THREE.MeshPhongMaterial({ color: color, specular: 0xffffff, shininess: 250 })
			//new this.THREE.MeshBasicMaterial({ color: color })
		);
		this.arrowBody.position.set( 0, -headLength/2, 0 );
		this.arrowBody.scale.set( 1, headLength, 1 );
	
		this.CG = new this.THREE.Object3D( );
		this.CG.arrowHead = this.arrowHead;
		this.CG.arrowBody = this.arrowBody;
	
		this.CG.add( this.arrowHead );
		this.CG.add( this.arrowBody );

		//初期姿勢
		this.setArrowBottomToTop( {x:0, y:0, z:0}, {x:0, y:10, z:0} )
	}
	setArrowBottomToTop( bottom, top ){

		//矢印の起点ベクトル
		let L = new this.THREE.Vector3( ).subVectors( top, bottom );
		//中心座標ベクトル
		let R = new this.THREE.Vector3( ).addVectors( top, bottom ).multiplyScalar( 1/2 );
		this.arrowBody.scale.set( 1, L.length() - this.headLength , 1 );
		//3次元オブジェクトの基準位置を考慮して配置
		if( this.startPoint == 1 ){
			this.arrowBody.position.set( 0,- this.headLength/2, 0 );
			this.arrowHead.position.set( 0, L.length()/2 - this.headLength/2, 0 );
			this.CG.position.copy( R );

		} else if( this.startPoint == 2 ){
			this.arrowBody.position.set( 0, L.length()/2 - this.headLength/2, 0 );
			this.arrowHead.position.set( 0, L.length() - this.headLength/2, 0 );
			this.CG.position.copy( bottom );
		}
		//基準となるベクトル
		let V1 = new this.THREE.Vector3(0, 1, 0);
		//規格化した位置ベクトル
		let V2 = L.clone().normalize();
		//回転軸ベクトル
		let V3 = new this.THREE.Vector3().crossVectors( V1, V2);
		//回転角のcos値
		let cosTheta = V1.x * V2.x + V1.y * V2.y + V1.z * V2.z;
		//回転ありの場合
		if( Math.abs(V3.length()) > 0.001 ){
			//回転角
			let theta = Math.acos( cosTheta );
			//回転に対応するクオータニオンの生成
			let q = new this.THREE.Quaternion().setFromAxisAngle(
				V3.normalize(), theta
			)
			//姿勢クオータニオンに設定
			this.CG.quaternion.copy( q );
		}
	}
	setVisible( visible ){
		this.arrowHead.visible = visible;
		this.arrowBody.visible = visible;
	}

}
////////////////////////////////////////////////////////////////////
// 無限ループ関数の定義
////////////////////////////////////////////////////////////////////
//グローバル変数の宣言
let step = 0; //ステップ数
function loop() {
	//トラックボールによるカメラオブジェクトのプロパティの更新
	trackball.update();


	let E =[
		[
			parseFloat( document.querySelector("#E11").value ),
			parseFloat( document.querySelector("#E12").value ),
			parseFloat( document.querySelector("#E13").value )
		],
		[
			parseFloat( document.querySelector("#E21").value ),
			parseFloat( document.querySelector("#E22").value ),
			parseFloat( document.querySelector("#E23").value )
		],
		[
			parseFloat( document.querySelector("#E31").value ),
			parseFloat( document.querySelector("#E32").value ),
			parseFloat( document.querySelector("#E33").value )
		]
	]
	let F =[
		[
			parseFloat( document.querySelector("#F11").value ),
			parseFloat( document.querySelector("#F12").value ),
			parseFloat( document.querySelector("#F13").value )
		],
		[
			parseFloat( document.querySelector("#F21").value ),
			parseFloat( document.querySelector("#F22").value ),
			parseFloat( document.querySelector("#F23").value )
		],
		[
			parseFloat( document.querySelector("#F31").value ),
			parseFloat( document.querySelector("#F32").value ),
			parseFloat( document.querySelector("#F33").value )
		]
	]

	for( let i = 0; i < 3; i++){
		for( let j = 0; j < 3; j++){
			 D[i][j] = E[i][j] + F[i][j];
		}
	}
	document.querySelector("#D11").value = D[0][0];
	document.querySelector("#D12").value = D[0][1];
	document.querySelector("#D13").value = D[0][2];
	document.querySelector("#D21").value = D[1][0];
	document.querySelector("#D22").value = D[1][1];
	document.querySelector("#D23").value = D[1][2];
	document.querySelector("#D31").value = D[2][0];
	document.querySelector("#D32").value = D[2][1];
	document.querySelector("#D33").value = D[2][2];

	for(let i = 0; i < box.geometry.attributes.position.array.length/3; i++){
		let x = initialPositionArray[ 3 * i + 0 ]; 
		let y = initialPositionArray[ 3 * i + 1 ]; 
		let z = initialPositionArray[ 3 * i + 2 ];
		let dx = [x, y, z];
		let dr = Deformation( D, dx );

		box.geometry.attributes.position.array[ 3 * i + 0 ] = dx[ 0 ] + dr[ 0 ] * (step%120) / 120;
		box.geometry.attributes.position.array[ 3 * i + 1 ] = dx[ 1 ] + dr[ 1 ] * (step%120) / 120;
		box.geometry.attributes.position.array[ 3 * i + 2 ] = dx[ 2 ] + dr[ 2 ] * (step%120) / 120;
	}
	box.geometry.attributes.position.needsUpdate = true;

	step ++;
	//レンダリング
	renderer.render(scene, camera);


	//「loop()」関数の呼び出し
	requestAnimationFrame(loop);
}
//床オブジェクト生成関数
function createFloor(){
	let textureLoader = new THREE.TextureLoader();
	let texture = textureLoader.load( generateFloorTextureDataURL( [0xFFFFFF, 0x555555] ) )
	//テクスチャラッピングの指定
	texture.wrapS = THREE.RepeatWrapping; //x軸方向
	texture.wrapT = THREE.RepeatWrapping; //y軸方向
	//リピートの指定
	texture.repeat.set(10, 10);
	//カラースペースの指定
	texture.colorSpace = THREE.SRGBColorSpace;
	texture.mapWrapT = "RepeatWrapping";
	texture.mapWrapS = "RepeatWrapping";
	//異方性フィルダリング指数の指定
	texture.anisotropy = renderer.capabilities.getMaxAnisotropy();
	//形状オブジェクトの宣言と生成
	let geometry = new THREE.PlaneGeometry(50, 50); //平面オブジェクト
	//材質オブジェクトの宣言と生成
	let material = new THREE.MeshBasicMaterial({
			color: 0xffffff,
			map: texture,
			side: THREE.DoubleSide
	});
	//平面オブジェクトの生成
	return new THREE.Mesh(geometry, material);; 
}
//スカイドーム生成関数
function createSkydome(){
	let vertexShader = "//バーテックスシェーダー\n" +
		"//頂点シェーダーからフラグメントシェーダーへの転送する変数\n" +
		"varying vec3 vWorldPosition;\n" +
		"void main( ) {\n" +
		"	//ワールド座標系における頂点座標\n" +
		"	vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n" +
		"	vWorldPosition = worldPosition.xyz;\n" +
		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n" +
		"}\n";
	let fragmentShader = "//フラグメントシェーダ―\n" +
		"//カスタムuniform変数の取得\n" +
		"uniform vec3 topColor;     //ドーム頂点色\n" +
		"uniform vec3 bottomColor;  //ドーム底辺色\n" +
		"uniform	float exp;         //減衰指数\n" +
		"uniform	float offset;      //高さ基準点\n" +
		"//バーテックスシェーダーから転送された変数\n" +
		"varying vec3 vWorldPosition;\n" +
		"void main( ) {\n" +
		"	//高さの取得\n" +
		"	float h = normalize( vWorldPosition + vec3(0, 0, offset) ).z;\n" +
		"	if( h < 0.0) h = 0.0;\n" +
		"	gl_FragColor = vec4( mix( bottomColor, topColor, pow(h, exp) ), 1.0 );\n" +
		"}\n";
	//形状オブジェクトの宣言と生成
	let geometry = new THREE.SphereGeometry( 500, 100, 100);
	let uniforms = {
		topColor:  { type: "c", value: new THREE.Color(0.0, 0.3, 1.0) },
		bottomColor:  { type: "c", value: new THREE.Color(1.0, 1.0, 1.0)},
		exp:{ type: "f", value : 0.8},
		offset:{ type: "f", value : 400}
	};
	//材質オブジェクトの宣言と生成
	let material = new THREE.ShaderMaterial( { 
		vertexShader: vertexShader,
		fragmentShader: fragmentShader, 
		uniforms : uniforms,
		side: THREE.BackSide,
	} );
	return new THREE.Mesh( geometry, material);
}

//////////////////////////////////////////////
// テクスチャマッピング用 dataURL生成関数
//////////////////////////////////////////////
function generateFloorTextureDataURL( tileColors ){
	//canvas要素の生成
	let canvas = document.createElement('canvas');
	//canvas要素のサイズ
	canvas.width = 256;  //横幅
	canvas.height = 256; //縦幅
	//コンテキストの取得
	let context = canvas.getContext('2d');

	let n = 2;
	let colors = [];
	colors[0] = "#" + tileColors[0].toString(16);
	colors[1] = "#" + tileColors[1].toString(16);
	
	colors[0].replace("0x" , "");
	colors[1].replace("0x" , "");

	for ( let i = 0; i < n; i++ ) {
		for ( let j = 0; j < n; j++ ) {
			context.beginPath();
			context.rect( i*canvas.width/n, j*canvas.height/n, canvas.width/n, canvas.height/n );
			context.closePath();
			let m = Math.abs( i + j ) % colors.length;
			//塗りの設定
			context.fillStyle = colors[m]; //塗りつぶし色の指定
			context.fill();                //塗りつぶしの実行
		}
	}
	let dataUrl = canvas.toDataURL("image/png");
	return dataUrl;
}

</script>
</head>
<body>

<section id="field">
<div style="font-size: 30pt; padding: 10px 10px 0px 10px; float: left;">
\( D = E + F =  \)
</div>
<div style="font-size: 40pt; width: 40px; height:80px; float: left;background-color: antiquewhite; padding: 0px 0px 0px 10px;">
\( \left(\right. \)
</div>
<table class="matrix" style="float: left;">
	<tr>
		<td><input id="E11"></td>
		<td><input id="E12"></td>
		<td><input id="E13"></td>
	</tr>
	<tr>
		<td><input id="E21" disabled></td>
		<td><input id="E22"></td>
		<td><input id="E23"></td>
	</tr>
	<tr>
		<td><input id="E31" disabled></td>
		<td><input id="E32" disabled></td>
		<td><input id="E33"></td>
	</tr>
</table>
<div style="font-size: 40pt; width: 40px; height:80px; float: left;background-color: antiquewhite; padding: 0px 0px 0px 10px;">
\(  \left.\right) \)
</div>
<div style="font-size: 40pt; width: 50px; height:80px; float: left; padding: 0px 0px 0px 10px;">
\( + \)
</div>
<div style="font-size: 40pt; width: 40px; height:80px; float: left;background-color: azure; padding: 0px 0px 0px 10px;">
\( \left(\right. \)
</div>
<table class="matrix" style="float: left;">
	<tr>
		<td><input id="F11" disabled></td>
		<td><input id="F12"></td>
		<td><input id="F13"></td>
	</tr>
	<tr>
		<td><input id="F21" disabled></td>
		<td><input id="F22" disabled></td>
		<td><input id="F23"></td>
	</tr>
	<tr>
		<td><input id="F31" disabled></td>
		<td><input id="F32" disabled></td>
		<td><input id="F33" disabled></td>
	</tr>
</table>
<div style="font-size: 40pt; width: 40px; height:80px; float: left;background-color: azure; padding: 0px 0px 0px 10px;">
\(  \left.\right) \)
</div>
<div style="font-size: 40pt; width: 50px; height:80px; float: left; padding: 0px 0px 0px 10px;">
\( = \)
</div>
<div style="font-size: 40pt; width: 40px; height:80px; float: left;background-color: rgb(233, 255, 213); padding: 0px 0px 0px 10px;">
\( \left(\right. \)
</div>
<table class="matrix" style="float: left;">
	<tr>
		<td><input id="D11" disabled></td>
		<td><input id="D12" disabled></td>
		<td><input id="D13" disabled></td>
	</tr>
	<tr>
		<td><input id="D21" disabled></td>
		<td><input id="D22" disabled></td>
		<td><input id="D23" disabled></td>
	</tr>
	<tr>
		<td><input id="D31" disabled></td>
		<td><input id="D32" disabled></td>
		<td><input id="D33" disabled></td>
	</tr>
</table>
<div style="font-size: 40pt; width: 40px; height:80px; float: left;background-color: rgb(233, 255, 213); padding: 0px 0px 0px 10px;">
\(  \left.\right) \)
</div>
<br style="clear:both;">
</section>

<div id="canvas-frame"></div><!-- canvas要素を配置するdiv要素 -->

</body>
</html>

この記事が気に入ったらサポートをしてみませんか?