1 var CANVAS_SIZE = 512;//canvasのピクセルサイズ
4 function Display(_canvas,_context,_file,_image,_sorce){
6 this.context = _context;
10 this.magnification = 1;
16 var canvas1Display = new Display();//canvas1
17 var canvas2Display = new Display();//canvas2
20 function Coordinate(_number, _x, _y, _z){
21 this.number = _number;
24 this.z = _z;//将来的に3次元での解析を見越してZ座標をメンバーとして加えている
30 canvas1Display.canvas = document.getElementById("canvas1");
31 canvas1Display.context = canvas1Display.canvas.getContext("2d");
32 canvas1Display.canvas.width = CANVAS_SIZE;
33 canvas1Display.canvas.height = CANVAS_SIZE;
36 canvas2Display.canvas = document.getElementById("canvas2");
37 canvas2Display.context = canvas2Display.canvas.getContext("2d");
38 canvas2Display.canvas.width = CANVAS_SIZE;
39 canvas2Display.canvas.height = CANVAS_SIZE;
45 function calculate_xy(event,canvasId){
47 var mouseX = 0; //coordinate x of mouse point
48 var mouseY = 0; //coordinate y of mouse point
49 var positionX = 0; //coordinate x of canvas
50 var positionY = 0; //coordinate y of canvas
51 var x = 0; //coordinate x of mouse point in canvas
52 var y = 0; //coordinate y of mouse point in canvas
54 if(canvasId == "canvas1"){
55 var order1 = parseInt(canvas1_unit.order.value);//mm or μm or nm or A(angstrom)//計算用
56 var order2 = parseInt(table1_unit.order.value); //mm or um or nm or A
57 var pixel_length = canvas1_unit.pixel_length.value; //画像のピクセルの大きさ(サーバー側から受け取り可能)
58 }else if(canvasId == "canvas2"){
59 var order1 = parseInt(canvas2_unit.order.value);//mm or μm or nm or A(angstrom)//計算用
60 var order2 = parseInt(table2_unit.order.value); //mm or um or nm or A
61 var pixel_length = canvas2_unit.pixel_length.value; //画像のピクセルの大きさ(サーバー側から受け取り可能)
67 var canvas = document.getElementById(canvasId);/*cnavas1 or canvas2 */
69 clientRect = document.getElementById(canvasId).getBoundingClientRect();
70 positionX = clientRect.left + window.pageXOffset;
71 positionY = clientRect.top + window.pageYOffset;
73 //画像中心を原点としてピクセル座標計算/*(平行移動対応)*/
74 if(parseInt(canvas.width)%2){//奇数
75 x = mouseX - positionX - (canvas.width / 2)/* - display4.movx*/;
76 y = -(mouseY - positionY - (canvas.height)/2)/* - display4.movy*/;
77 }else{//偶数(偶数の場合は原点は右上を採用)
78 x = mouseX - positionX - (canvas.width / 2)/* - display4.movx*/;
79 y = -(mouseY - positionY - ((canvas.height)/2 - 1))/* - display4.movy*/;
82 //小数点切り捨て(ピクセル座標を0-CANVASSIZEを整数値で表す、上のメソッド返ってくるピクセル座標が少数点あり)
87 //x *= IMAGE_SIZE / CANVAS_SIZE;
88 //y *= IMAGE_SIZE / CANVAS_SIZE;
90 //px -> mm,mim,nm ...ピクセルの寸法と元画像の大きさから算出
91 x *= pixel_length * Math.pow(10,-order1-(-order2))/* / display4.magnification*/;
92 y *= pixel_length * Math.pow(10,-order1-(-order2))/* / display4.magnification*/;
94 var coordinate = new Coordinate();
95 coordinate.x = parseFloat(x.toFixed(2));
96 coordinate.y = parseFloat(y.toFixed(2));
102 //現在のマウスカーソル座標の表示 マウスが動くと発火イベント--canvas1
103 document.getElementById("canvas1").addEventListener("mousemove", function(event){
104 var current_coordinate = document.getElementById("current_coordinate_on_canvas1");
105 var coordinate = new Coordinate();
106 coordinate = calculate_xy(event,"canvas1");
107 current_coordinate.innerHTML = "(" + coordinate.x + "," + coordinate.y + "," + coordinate.z + ")";
110 //現在のマウスカーソル座標の表示 マウスが動くと発火イベント--canvas2
111 document.getElementById("canvas2").addEventListener("mousemove", function(event){
112 var current_coordinate = document.getElementById("current_coordinate_on_canvas2");
113 var coordinate = new Coordinate();
114 coordinate = calculate_xy(event,"canvas2");
115 current_coordinate.innerHTML = "(" + coordinate.x + "," + coordinate.y + "," + coordinate.z + ")";
118 //クリックしたマウスカーソル座標を取得 クリックすると発火イベント--canvas1
119 document.getElementById("canvas1").addEventListener("click", function(event){
120 if(0){//Displayに合成画像が表示されているかどうか 未搭載
121 window.alert("Please load image file.");
122 //move_params_init();
125 var m_or_t = table1_mort.m_or_t.value;
126 var coordinate = new Coordinate();
127 coordinate = calculate_xy(event,"canvas1");
128 add_list(coordinate,"canvas1",m_or_t);
133 document.onkeydown=function(event){
134 console.log(event.keyCode);
135 if(event.keyCode == 65){
136 var m_or_t = table1_mort.m_or_t.value;
137 var coordinate = new Coordinate();
138 coordinate = calculate_xy(event,"canvas1");
139 add_list(coordinate,"canvas1",m_or_t);
144 //クリックしたマウスカーソル座標を取得 クリックすると発火イベント--canvas2
145 document.getElementById("canvas2").addEventListener("click", function(event){
146 if(0){//Displayに合成画像が表示されているかどうか
147 window.alert("Please load image file.");
148 //move_params_init();
151 var m_or_t = table2_mort.m_or_t.value;
152 var coordinate = new Coordinate();
153 coordinate = calculate_xy(event,"canvas2");
154 add_list(coordinate,"canvas2",m_or_t);
158 /***************************************/
159 /*座標をやりっとりする場合この配列を扱えば良い*/
161 var canvas1_marker_data = [];
162 var canvas1_target_data = [];
163 var canvas2_marker_data = [];
164 var canvas2_marker_ast_data = [];
165 var canvas2_target_ast_data = [];
166 /***************************************/
169 //クリックした座標データを表に反映、データ保持配列に格納
170 function add_list(coordinate,canvasid,m_or_t){
171 if(canvasid=="canvas1"){
172 if(m_or_t == "marker"){
173 var tbody = document.getElementById("canvas1_marker_tbody");
174 }else if(m_or_t == "target"){
175 var tbody = document.getElementById("canvas1_target_tbody");
177 }else if(canvasid="canvas2"){
178 if(m_or_t == "marker"){
179 var tbody = document.getElementById("canvas2_marker_tbody");
180 }else if(m_or_t == "marker_ast"){
181 var tbody = document.getElementById("canvas2_marker_ast_tbody");
182 }else if(m_or_t == "target_ast"){
183 var tbody = document.getElementById("canvas2_target_ast_tbody");
187 var new_tr = tbody.insertRow(-1);
188 var row_Index = new_tr.rowIndex; //row's index (start = 1) equal to table numbering
190 var coordinate_td = new_tr.insertCell(-1);
192 coordinate.number = row_Index;
195 if(canvasid == "canvas1"){
196 coordinate_td.innerHTML = "No."+coordinate.number+ "<input type='button' value='x' onClick='deleteTable(this.parentNode.parentNode.rowIndex,"+'"'+"canvas1"+'"'+")'><br>("+coordinate.x+","+coordinate.y+","+coordinate.z+")";
197 }else if(canvasid == "canvas2"){
198 coordinate_td.innerHTML = "No."+coordinate.number+ "<input type='button' value='x' onClick='deleteTable(this.parentNode.parentNode.rowIndex,"+'"'+"canvas2"+'"'+")'><br>("+coordinate.x+","+coordinate.y+","+coordinate.z+")";
201 //新しい座標データが来た時、任意_dataに格納
202 if(canvasid=="canvas1"){
203 if(m_or_t == "marker"){
204 if(canvas1_marker_data.length == row_Index - 1){
205 canvas1_marker_data[row_Index - 1] = new Coordinate(coordinate.number,coordinate.x,coordinate.y,coordinate.z);
207 }else if(m_or_t == "target"){
208 if(canvas1_target_data.length == row_Index - 1){
209 canvas1_target_data[row_Index - 1] = new Coordinate(coordinate.number,coordinate.x,coordinate.y,coordinate.z);
212 }else if(canvasid="canvas2"){
213 if(m_or_t == "marker"){
214 if(canvas2_marker_data.length == row_Index - 1){
215 canvas2_marker_data[row_Index - 1] = new Coordinate(coordinate.number,coordinate.x,coordinate.y,coordinate.z);
217 }else if(m_or_t == "marker_ast"){
218 if(canvas2_marker_ast_data.length == row_Index - 1){
219 canvas2_marker_ast_data[row_Index - 1] = new Coordinate(coordinate.number,coordinate.x,coordinate.y,coordinate.z);
221 }else if(m_or_t == "target_ast"){
222 if(canvas2_target_ast_data.length == row_Index - 1){
223 canvas2_target_ast_data[row_Index - 1] = new Coordinate(coordinate.number,coordinate.x,coordinate.y,coordinate.z);
228 console.log(canvas1_marker_data);
229 console.log(canvas1_target_data);
230 console.log(canvas2_marker_data);
231 console.log(canvas2_marker_ast_data);
232 console.log(canvas2_target_ast_data);
236 function clearTable_canvas1(){
237 if(table1_mort.m_or_t.value == "marker"){
238 var tbody = document.getElementById("canvas1_marker_tbody");
239 canvas1_marker_data = [];
240 }else if(table1_mort.m_or_t.value == "target"){
241 var tbody = document.getElementById("canvas1_target_tbody");
242 canvas1_target_data = [];
245 var rows_length = tbody.rows.length;
246 for(var i=1; i <= rows_length; i++){
251 function deleteTable_canvas1(){
252 if(table1_mort.m_or_t.value == "marker"){
253 var tbody = document.getElementById("canvas1_marker_tbody");
254 canvas1_marker_data.pop();
255 }else if(table1_mort.m_or_t.value == "target"){
256 var tbody = document.getElementById("canvas1_target_tbody");
257 canvas1_target_data.pop();
264 function deleteTable_canvas2(){
265 if(table2_mort.m_or_t.value == "marker"){
266 var tbody = document.getElementById("canvas2_marker_tbody");
267 canvas2_marker_data.pop();
268 }else if(table2_mort.m_or_t.value == "marker_ast"){
269 var tbody = document.getElementById("canvas2_marker_ast_tbody");
270 canvas2_marker_ast_data.pop();
271 }else if(table2_mort.m_or_t.value == "target_ast"){
272 var tbody = document.getElementById("canvas2_target_ast_tbody");
273 canvas2_target_ast_data.pop();
278 function deleteTable(rowIndex,canvasid){
279 if(canvasid=="canvas1"){
280 if(table1_mort.m_or_t.value == "marker"){
281 var m_or_t = "marker";
282 var tbody = document.getElementById("canvas1_marker_tbody");
283 canvas1_marker_data.splice(rowIndex-1,1);//delete 1 data[row_number-1] from coordinate_data
284 }else if(table1_mort.m_or_t.value == "target"){
285 var m_or_t = "target";
286 var tbody = document.getElementById("canvas1_target_tbody");
287 canvas1_target_data.splice(rowIndex-1,1);
289 }else if(canvasid=="canvas2"){
290 if(table2_mort.m_or_t.value == "marker"){
291 var m_or_t = "marker";
292 var tbody = document.getElementById("canvas2_marker_tbody");
293 canvas2_marker_data.splice(rowIndex-1,1);
294 }else if(table2_mort.m_or_t.value == "marker_ast"){
295 var m_or_t = "marker_ast";
296 var tbody = document.getElementById("canvas2_marker_ast_tbody");
297 canvas2_marker_ast_data.splice(rowIndex-1,1);
298 }else if(table2_mort.m_or_t.value == "target_ast"){
299 var m_or_t = "target_ast";
300 var tbody = document.getElementById("canvas2_target_ast_tbody");
301 canvas2_target_ast_data.splice(rowIndex-1,1);
305 var rows_length = tbody.rows.length;
306 for(var i=rowIndex; i <= rows_length; i++){
307 tbody.deleteRow(rowIndex-1);//deleteRow(0) -> delete table's 1st row.
310 //coordinate_database.splice(row_number-1,1);//delete 1 data[row_number-1] from coordinate_database
312 //ボタンを押した階層より後の同レベル階層を削除(Table)
313 //配列データ(coordinate database)は座標データを残しaddlistに送ってnumberを書き換えtableに反映
314 if(canvasid=="canvas1"){
315 if(table1_mort.m_or_t.value == "marker"){
316 for(var j = rowIndex - 1; j < canvas1_marker_data.length; j++){
317 add_list(canvas1_marker_data[j],canvasid,m_or_t)
319 }else if(table1_mort.m_or_t.value == "target"){
320 for(var j = rowIndex - 1; j < canvas1_target_data.length; j++){
321 add_list(canvas1_target_data[j],canvasid,m_or_t)
324 }else if(canvasid=="canvas2"){
325 if(table2_mort.m_or_t.value == "marker"){
326 for(var j = rowIndex - 1; j < canvas2_marker_data.length; j++){
327 add_list(canvas2_marker_data[j],canvasid,m_or_t)
329 }else if(table2_mort.m_or_t.value == "marker_ast"){
330 for(var j = rowIndex - 1; j < canvas2_marker_ast_data.length; j++){
331 add_list(canvas2_marker_ast_data[j],canvasid,m_or_t)
333 }else if(table2_mort.m_or_t.value == "target_ast"){
334 for(var j = rowIndex - 1; j < canvas2_target_ast_data.length; j++){
335 add_list(canvas2_target_ast_data[j],canvasid,m_or_t)
341 /*****************************************************************/
342 /*****************************************************************/
343 /*************************** canvas表示 ***************************/
344 /*****************************************************************/
345 /*****************************************************************/
349 function loadFile(files,canvasid){
352 if(canvasid == "canvas1"){
353 console.log("canvas1");
354 canvas1Display.file = file;
355 canvas1Display.context.clearRect(0,0,canvas1Display.canvas.width,canvas1Display.canvas.height);
356 //magnification_init(display1);
357 //rotation_init(display1);
358 //move_params_init(display1);
359 displayImage(canvas1Display);
360 }else if(canvasid == "canvas2"){
361 console.log("canvas2");
362 canvas2Display.file = file;
363 canvas2Display.context.clearRect(0,0,canvas2Display.canvas.width,canvas2Display.canvas.height);
364 //magnification_init(display1);
365 //rotation_init(display1);
366 //move_params_init(display1);
367 displayImage(canvas2Display);
371 function displayImage(display){
377 var image = new Image();
378 var reader = new FileReader();
381 reader.onload = function(event){
382 image.onload = function(){
385 display.context.mozImageSmoothingEnabled = false;
386 display.context.webkitImageSmoothingEnabled = false;
387 display.context.msImageSmoothingEnabled = false;
388 display.context.imageSmoothingEnabled = false
390 imageAspect = image.width / image.height;
391 if (imageAspect >= 1) { //画像が横長
393 width = display.canvas.width;
394 height = display.canvas.height / imageAspect;
395 to = (display.canvas.height - height) / 2;
398 width = display.canvas.width * imageAspect;
399 height = display.canvas.height;
400 left = (display.canvas.width - width) / 2;
403 //ファイルアップロード2回目以降のcanvasの初期化
404 display.context.clearRect(0,0,display.canvas.width,display.canvas.height);
407 /****************変換適用***********************************************/
408 //display.context.translate(parseInt(display.canvas.width / 2),parseInt(display.canvas.height / 2));//コンテキストに対する効果の始点を中心に移動
409 //display.context.scale(display.magnification,display.magnification);//倍率をコンテキストに反映
410 //display.context.rotate(display.angle / 180 * Math.PI);//回転をコンテキストに反映
411 //display.context.translate(-parseInt(display.canvas.width / 2),-parseInt(display.canvas.height / 2));
412 /**************************************************************************/
414 //画像をアスペクト比を維持して中心に表示(描画時は効果を元の位置に戻す)
415 //display.context.drawImage(image, 0, 0, image.width, image.height, left+display.movx, to-display.movy, width, height);
416 display.context.drawImage(image, 0, 0, image.width, image.height, left, to, width, height);
418 /*****************変換調整***********************************************/
419 //display.context.translate(parseInt(display.canvas.width / 2),parseInt(display.canvas.height / 2)); //コンテキストに対する効果の始点を中心に移動
420 //display.context.scale(1 / display.magnification,1 / display.magnification);//画像の倍率の初期化
421 //display.context.rotate(-1 * display.angle / 180 * Math.PI);//角度の初期化
422 //display.context.translate(-parseInt(display.canvas.width / 2),-parseInt(display.canvas.height / 2));
423 /****************************************************************************/
425 image.src = event.target.result;
428 //if(display.file && display.file.type.match('image.*')){
429 if(display.file.type.match('image.*')){
430 reader.readAsDataURL(display.file);
431 console.log("readasdataURL");
434 // console.log("false");