2 var canvas = $('#canvasCLEM');
3 var ctx = canvas[0].getContext("2d");
5 $('#CLEMimg').on('change', function CLEMmap() { //画像を選択時に呼び出される
7 if (window.File) { //FileAPIを未対応ブラウザではアラート
9 var files = $('#CLEMimg')[0].files[0];
10 var reader = new FileReader();
11 var img = new Image();
13 reader.onload = function(evt) {
14 img.onload = function() {
15 // 参考 https://qiita.com/PG0721/items/599ba2921b8339700fe3
16 var imgAspect = img.width / img.height;
17 ctx.clearRect(0, 0, 512, 512);
18 if (imgAspect >= 1) { //画像が横長
20 width = ctx.canvas.width;
21 height = ctx.canvas.height / imgAspect;
22 to = (ctx.canvas.height - height) / 2;
25 width = ctx.canvas.width * imgAspect;
26 height = ctx.canvas.height;
27 left = (ctx.canvas.width - width) / 2;
29 ctx.drawImage(img, 0, 0, img.width, img.height, left, to, width, height); //画像をアスペクト比を維持して中心に表示
31 img.src = evt.target.result;
33 reader.readAsDataURL(files);
35 window.alert("本ブラウザではFile APIが使えません");
39 $('#setClemButton').on('click', function setClem() {
40 var tbody = document.getElementById("listCoord");
41 var rowlen = tbody.rows.length; //行数
42 // LM X Y EM X Y Mov Del
43 //cells 0 1 2 3 4 5 6 7
47 var LmVec = new Array();
48 var EmVec = new Array();
50 for (var i = 0; i < (rowlen - 1); i++) {
51 LmVec[i] = new Object();
53 LmVec[i].x = tbody.rows[0].cells[1].innerText - tbody.rows[i + 1].cells[1].innerText;
54 LmVec[i].y = tbody.rows[0].cells[2].innerText - tbody.rows[i + 1].cells[2].innerText;
55 // alert(LmVec[i].x+" , "+LmVec[i].y);
56 EmVec[i] = new Object();
57 EmVec[i].x = tbody.rows[0].cells[4].innerText - tbody.rows[i + 1].cells[4].innerText;
58 EmVec[i].y = tbody.rows[0].cells[5].innerText - tbody.rows[i + 1].cells[5].innerText;
59 // alert(EmVec[i].x+" , "+EmVec[i].y);
60 var dist = Math.sqrt(LmVec[i].x * LmVec[i].x + LmVec[i].y * LmVec[i].y) * Math.sqrt(EmVec[i].x * EmVec[i].x + EmVec[i].y * EmVec[i].y);
62 alert("座標をセットし直して下さい");
64 var cos = (LmVec[i].x * EmVec[i].x + LmVec[i].y * EmVec[i].y) / dist;
65 var sin = (LmVec[i].x * EmVec[i].y - LmVec[i].y * EmVec[i].x) / dist;
67 //alert("cos:"+cos+" sin:"+sin);
68 var rad1 = Math.acos(cos);
69 var rad2 = Math.asin(sin);
71 //alert("rad1:"+rad1+" rad2:"+rad2);
72 if (cos >= 0 && sin >= 0) { //0<rad<pi/2
74 } else if (cos >= 0 && sin < 0) { //-2/pi<rad<0
76 } else if (cos < 0 && sin >= 0) { //pi/2<rad<pi
78 } else { // -pi<rad<-pi/2
83 rad = rad / (rowlen - 1);
84 alert(rad * 180 / Math.PI + " 度");
86 ctx.clearRect(0, 0, 512, 512);
87 ctx.translate(216, 216);
89 ctx.translate(-216, -216);
90 $('#CLEMimg').change();
91 /*for(i=0;i<rowlen;i++){
93 temp.x=tbody.rows[i].cells[1].innerText*Math.cos(rad)-tbody.rows[i].cells[2].innerText*Math.sin(rad);
94 temp.y=tbody.rows[i].cells[1].innerText*Math.sin(rad)+tbody.rows[i].cells[2].innerText*Math.cos(rad);
95 temp.x=Math.round(temp.x);
96 temp.y=Math.round(temp.y);
97 tbody.rows[i].cells[1].innerHTML=temp.x;
98 tbody.rows[i].cells[2].innerHTML=temp.y;
99 alert(temp.x+" , "+temp.y);
105 }); //END $(function(){
108 function calcClemCoord(event) { //CLEM画像のポインター位置の座標を返す
110 //参考 https://lab.syncer.jp/Web/JavaScript/Snippet/12/
111 var clickX = event.pageX;
112 var clickY = event.pageY;
115 var clientRect = document.getElementById("canvasCLEM").getBoundingClientRect();
116 var positionX = clientRect.left + window.pageXOffset;
117 var positionY = clientRect.top + window.pageYOffset;
121 var cod = new Object();
122 cod.x = clickX - positionX - 256;
123 cod.y = clickY - positionY - 256;
127 document.getElementById("canvasSimplePhoto").addEventListener('mousemove', function( event ) {//EM画像にマウスオーバー時
128 var coordinate=document.getElementById("EMcoordinate");
129 var cod = calcEmCoord(event);
130 coordinate.childNodes[0].data= "X:"+cod.x+" , Y:"+cod.y;
133 document.getElementById("canvasCLEM").addEventListener('mousemove', function(event) { //CLEM画像にマウスオーバー時
134 var coordinate = document.getElementById("CLEMcoordinate");
135 var cod = calcClemCoord(event);
136 coordinate.childNodes[0].data = "X:" + cod.x + " , Y:" + cod.y;
139 function setLmCoordinate(innerTd) {
141 var tr = innerTd.parentNode.parentNode; //tr
142 tr.cells[0].innerHTML = '<input type="button" value="Set" onclick="cancelSetLmCoordinate(this)" style="background-color:red;" />'
143 tr.cells[0].state = "on";
145 document.getElementById("canvasCLEM").addEventListener('click', function(event) {
146 if (tr.cells[0].state == "on") {
147 var cod = calcClemCoord(event);
148 tr.cells[1].innerHTML = cod.x;
149 tr.cells[2].innerHTML = cod.y;
150 tr.cells[0].innerHTML = '<input type="button" value="Set" onclick="setLmCoordinate(this)" />';
151 tr.cells[0].state = "off";
158 function cancelSetLmCoordinate(innerTd) {
159 var tr = innerTd.parentNode.parentNode; //tr
160 tr.cells[0].innerHTML = '<input type="button" value="Set" onclick="setLmCoordinate(this)" />';
161 tr.cells[0].state = "off";
164 document.getElementById("addList").addEventListener('click', function addList(event) {
166 // tbody要素に指定したIDを取得し、変数「tbody」に代入
167 var tbody = document.getElementById("listCoord");
168 var row = tbody.insertRow(-1); //tr
169 var cellLM0 = row.insertCell(-1); //td0
170 cellLM0.state = "off";
171 var cellLMX = row.insertCell(-1); //td1
172 var cellLMY = row.insertCell(-1); //td2
173 var cellEM0 = row.insertCell(-1); //td3
174 var cellEMX = row.insertCell(-1); //td4
175 var cellEMY = row.insertCell(-1); //td5
176 var cellMoveButton = row.insertCell(-1); //td6
177 var cellDelButton = row.insertCell(-1); //td7
178 var SetLmButton = '<input type="button" value="Set" onclick="setLmCoordinate(this)" />';
179 var DelButton = '<input type="button" value="Delete" onclick="deleteList(this)" />';
180 var SetButton = '<input type="button" value="Set" onclick="setEmCoordinate(this)" />';
181 var MoveButton = '<input type="button" value="Move" onclick="moveEmCoordinate(this)" />';
182 cellLM0.innerHTML = SetLmButton;
183 cellDelButton.innerHTML = DelButton;
184 cellEM0.innerHTML = SetButton;
185 cellMoveButton.innerHTML = MoveButton;
186 // LM X Y EM X Y Mov Del
187 //cells 0 1 2 3 4 5 6 7
190 function deleteList(innerTd) {
191 var tr = innerTd.parentNode.parentNode; //tr
192 tr.parentNode.deleteRow(tr.sectionRowIndex);
195 function setEmCoordinate(innerTd) {
196 var movexr = $("#movex").val();
197 var moveyr = $("#movey").val();
198 var tr = innerTd.parentNode.parentNode; //tr
199 cellEMX = tr.cells[4];
200 cellEMY = tr.cells[5];
201 cellEMX.innerHTML = parseInt(movexr);
202 cellEMY.innerHTML = parseInt(moveyr);
205 function moveEmCoordinate(innerTd) {
206 var tbody = document.getElementById("listCoord");
207 var rowlen = tbody.rows.length //行数
210 // LM X Y EM X Y Mov Del
211 //cells 0 1 2 3 4 5 6 7
215 x: innerTd.parentNode.parentNode.cells[1].innerText,
216 y: innerTd.parentNode.parentNode.cells[2].innerText
222 var LmVec = new Array();
223 var EmVec = new Array();
226 alert("init x:" + goal.x + " ,y:" + goal.y);
227 for (var i = 0; i < (rowlen - 1); i++) {
228 LmVec[i] = new Object();
230 LmVec[i].x = tbody.rows[0].cells[1].innerText - tbody.rows[i + 1].cells[1].innerText;
231 LmVec[i].y = tbody.rows[0].cells[2].innerText - tbody.rows[i + 1].cells[2].innerText;
232 // alert(LmVec[i].x+" , "+LmVec[i].y);
233 EmVec[i] = new Object();
234 EmVec[i].x = tbody.rows[0].cells[4].innerText - tbody.rows[i + 1].cells[4].innerText;
235 EmVec[i].y = tbody.rows[0].cells[5].innerText - tbody.rows[i + 1].cells[5].innerText;
238 //target.x=LmVec.x*s+LmVec.y*t p=ax+by
239 //target.y=EmVec.x*s+EmVec.y*t q=cx+dy
241 for (var i = 0; i < (rowlen - 2); i++) { //解法:クラメルの公式
242 var Det = LmVec[0].x * LmVec[i + 1].y - LmVec[0].y + LmVec[i + 1].x; //ad-bc
247 var s = (target.x * LmVec[i + 1].y - LmVec[0].y * target.x) / Det;
248 var t = (LmVec[0].x * target.y - target.y + LmVec[i + 1].x) / Det;
249 alert("s:" + s + " ,t:" + t);
250 goal.x += s * EmVec[0].x + t * EmVec[i + 1].x;
251 goal.y += s * EmVec[0].y + t * EmVec[i + 1].y;
255 goal.x = goal.x / (rowlen - 2);
256 goal.y = goal.y / (rowlen - 2);
257 goal.x = Math.round(goal.x);
258 goal.y = Math.round(goal.y);
259 alert("x:" + goal.x + " ,y:" + goal.y);
261 var movexr = $("#movex").val();
262 var moveyr = $("#movey").val();
263 var movezr = $("#movez").val();
264 console.log("movex="+movexr);
265 console.log("movey="+moveyr);
268 $("#movex").val(String(movexr));
269 $("#movey").val(String(moveyr));
273 url:"http://" +UrlElement['sendIpAddress']+
274 ":"+UrlElement['sendPortNumber']+"/"+UrlElement['sendManufacturer']+
275 "/set/stagea?x="+encodeURIComponent(movexr)+
276 "&y="+encodeURIComponent(moveyr)+
277 "&z="+encodeURIComponent(movezr)+
278 "&a="+encodeURIComponent(movezr),
279 success: function(data){
280 console.log(data);//string型
286 alert("LM座標を3つ、EM座標を2つ以上指定して下さい");
288 } // END moveEmCoordinate(innerTd);
291 //var txt=document.createTextNode("X:"+cod.x+" , Y:"+cod.y);
292 //first.appendChild(txt);
293 //coordinate.removeChild();
294 // var txt=document.createTextNode();
295 // coordinate.appendChild(txt);