Révision 7f9aab46
ID | 7f9aab46527fc167ca5e3e4de05fa21fdad8f6c6 |
Parent | 1f5db711 |
Enfant | 6b16425b |
Version réaliée pour la sage de Victor Pongnian
Fichiers
- ajouté
- modifié
- copié
- renommé
- supprimé
Révisions
class/site_point.class.php | ||
---|---|---|
9 | 9 |
public function __construct($dir) { |
10 | 10 |
$this->base_dir = $dir; |
11 | 11 |
$dir_fd = opendir($this->base_dir); |
12 |
|
|
12 | 13 |
while (false !== ($file = readdir($dir_fd))) { |
14 |
|
|
13 | 15 |
if (preg_match('/(.*)_[0-9]+_[0-9]+_[0-9]+\.jpg$/', $file, $reg)) { |
14 | 16 |
$this->prefix = $reg[1]; |
17 |
|
|
15 | 18 |
break; |
16 | 19 |
} |
17 | 20 |
} |
... | ... | |
20 | 23 |
$pfname = $this->base_dir.'/'.$this->prefix.'.params'; |
21 | 24 |
if (is_file($pfname)) { |
22 | 25 |
$this->params = @parse_ini_file($pfname); |
23 |
} |
|
26 |
}
|
|
24 | 27 |
} |
25 | 28 |
|
26 | 29 |
public function get_params() { |
... | ... | |
65 | 68 |
$lon2 = $lon * M_PI/180; |
66 | 69 |
|
67 | 70 |
$dLat = $lat2-$lat1; |
68 |
$dLon = $lon2-$lon1; |
|
71 |
$dLon = $lon2-$lon1;
|
|
69 | 72 |
|
70 |
$a = sin($dLat/2) * sin($dLat/2) + sin($dLon/2) * sin($dLon/2) * cos($lat1) * cos($lat2); |
|
73 |
$a = sin($dLat/2) * sin($dLat/2) + sin($dLon/2) * sin($dLon/2) * cos($lat1) * cos($lat2); //
|
|
71 | 74 |
$angle = 2 * atan2(sqrt($a), sqrt(1-$a)); |
72 | 75 |
$d = $angle * $rt; // distance du point en Kms |
73 | 76 |
|
74 | 77 |
$y = sin($dLon)*cos($lat2); |
75 | 78 |
$x = cos($lat1)*sin($lat2) - sin($lat1)*cos($lat2)*cos($dLon); |
76 | 79 |
$cap = atan2($y, $x); // cap pour atteindre le point en radians |
77 |
|
|
80 |
|
|
78 | 81 |
$e = atan2(($alt2 - $alt1)/1000 - $d*$d/(2*$rt), $d); // angle de l'élévation en radians |
79 | 82 |
// printf("%s, %s, %s, %s\n",$lat1, $this->params['latitude'], $lat, $dLat); |
80 |
|
|
81 |
return array($d, $cap*180/M_PI, $e*180/M_PI); // les résultats sont en degrés |
|
83 |
|
|
84 |
return array($d, $cap*180/M_PI, $e*180/M_PI, $rapport); // les résultats sont en degrés
|
|
82 | 85 |
} |
83 | 86 |
|
84 | 87 |
} |
class/sites_dir.class.php | ||
---|---|---|
4 | 4 |
|
5 | 5 |
public function __construct($dir) { |
6 | 6 |
$this->base_dir = $dir; |
7 |
} |
|
7 |
}
|
|
8 | 8 |
|
9 | 9 |
public function get_sites() { |
10 |
$dir_fd = opendir($this->base_dir); |
|
10 |
try |
|
11 |
{ |
|
12 |
$dir_fd = opendir($this->base_dir); |
|
13 |
} |
|
14 |
catch(Exception $e) |
|
15 |
{ |
|
16 |
die('Erreur : '.$e->getMessage()); |
|
17 |
} |
|
18 |
|
|
19 |
|
|
11 | 20 |
$point_list = array(); |
12 | 21 |
while (false !== ($point_dir = readdir($dir_fd))) { |
13 | 22 |
$pt = new site_point($this->base_dir.'/'.$point_dir); |
... | ... | |
15 | 24 |
} |
16 | 25 |
return $point_list; |
17 | 26 |
} |
27 |
|
|
28 |
public function get_dir() { |
|
29 |
return $this->base_dir; |
|
30 |
} |
|
18 | 31 |
|
19 | 32 |
} |
css/all.css | ||
---|---|---|
41 | 41 |
border:solid #F00 1px; |
42 | 42 |
border-radius:0.5em; |
43 | 43 |
padding:0 1em; |
44 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
|
44 | 45 |
} |
45 | 46 |
|
47 |
legend:hover { |
|
48 |
color:#FF0; |
|
49 |
cursor:default; |
|
50 |
} |
|
51 |
|
|
46 | 52 |
fieldset#control { |
47 | 53 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
48 | 54 |
color:#FFF; |
... | ... | |
59 | 65 |
input { |
60 | 66 |
vertical-align:middle; |
61 | 67 |
} |
68 |
|
|
69 |
|
|
62 | 70 |
input[type="number"] { |
63 | 71 |
border-radius:1em; |
64 | 72 |
display:block; |
65 | 73 |
float:right; |
66 | 74 |
} |
67 | 75 |
|
68 |
#res>:not(ul), #control, #params, #info { |
|
76 |
#locadraw input[type="number"] { |
|
77 |
width:10ex; |
|
78 |
} |
|
79 |
|
|
80 |
#res>:not(ul), #control, #params, #info ,#addParams ,#adding, #loca{ |
|
69 | 81 |
user-select:none; |
70 | 82 |
-khtml-user-select:none; |
71 | 83 |
-o-user-select:none; |
... | ... | |
74 | 86 |
} |
75 | 87 |
|
76 | 88 |
div#params { |
77 |
padding:0.2em 0.5em;
|
|
89 |
padding:0.2em 1.3em;
|
|
78 | 90 |
border-radius:0.5em; |
79 | 91 |
background-color:rgba(128,128,128,0.5); |
80 | 92 |
border:solid #00F 1px; |
... | ... | |
85 | 97 |
} |
86 | 98 |
|
87 | 99 |
div#params em { |
100 |
|
|
88 | 101 |
display:block; |
89 | 102 |
float:right; |
90 | 103 |
background-color:#88F; |
... | ... | |
97 | 110 |
display:inline; |
98 | 111 |
} |
99 | 112 |
|
113 |
span#loca{ |
|
114 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
|
115 |
color:#FFF; |
|
116 |
float:left; |
|
117 |
position:absolute; |
|
118 |
bottom:1em; |
|
119 |
left:1em; |
|
120 |
cursor:pointer; |
|
121 |
padding:0.2em 0.5em; |
|
122 |
padding:0 1em; |
|
123 |
} |
|
124 |
|
|
125 |
|
|
126 |
div#addParams { |
|
127 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
|
128 |
color:#FFF; |
|
129 |
float:left; |
|
130 |
position:absolute; |
|
131 |
top:1em; |
|
132 |
right:2em; |
|
133 |
|
|
134 |
border:solid #F00 1px; |
|
135 |
border-radius:0.5em; |
|
136 |
padding:0.2em 0.5em; |
|
137 |
background-color:#F88; |
|
138 |
padding:0 1em; |
|
139 |
|
|
140 |
} |
|
141 |
|
|
142 |
div#addParams label { |
|
143 |
|
|
144 |
border-radius:0.5em; |
|
145 |
padding:0 1em; |
|
146 |
} |
|
147 |
|
|
148 |
div#addParams label:hover { |
|
149 |
color: #FF0; |
|
150 |
|
|
151 |
} |
|
152 |
|
|
153 |
fieldset#locadraw { |
|
154 |
|
|
155 |
color:#FFF; |
|
156 |
float:left; |
|
157 |
position:absolute; |
|
158 |
bottom:1em; |
|
159 |
left:1em; |
|
160 |
background-color:rgba(128,128,128,0.5); |
|
161 |
border:solid #F00 1px; |
|
162 |
border-radius:0.5em; |
|
163 |
padding:0 1em; |
|
164 |
visibility:hidden; |
|
165 |
} |
|
166 |
|
|
167 |
fieldset#adding { |
|
168 |
|
|
169 |
color:#FFF; |
|
170 |
float:left; |
|
171 |
position:absolute; |
|
172 |
top:1em; |
|
173 |
right:2em; |
|
174 |
background-color:rgba(128,128,128,0.5); |
|
175 |
border:solid #F00 1px; |
|
176 |
border-radius:0.5em; |
|
177 |
padding:0 1em; |
|
178 |
visibility: hidden; |
|
179 |
} |
|
180 |
|
|
181 |
|
|
182 |
|
|
183 |
form#form_param label { |
|
184 |
|
|
185 |
margin-right: 15px; |
|
186 |
width: 0.5em; |
|
187 |
padding:0.3em 0.5em; |
|
188 |
min-height: 1px; |
|
189 |
text-align: left; |
|
190 |
text-shadow:2px 2px 2px #000, -2px -2px 2px #000; |
|
191 |
} |
|
192 |
|
|
193 |
|
|
194 |
input:focus { |
|
195 |
border-color: rgba(82, 168, 236, 0.75); |
|
196 |
-moz-box-shadow: 0 0 8px rgba(82, 168, 236, 0.5); |
|
197 |
-webkit-box-shadow: 0 0 8px rgba(82, 168, 236, 0.5); |
|
198 |
box-shadow: 0 0 8px rgba(82, 168, 236, 0.5); |
|
199 |
} |
|
200 |
|
|
201 |
.correct { |
|
202 |
border-color: rgba(68, 191, 68, 0.75); |
|
203 |
} |
|
204 |
|
|
205 |
.correct:focus { |
|
206 |
border-color: rgba(68, 191, 68, 0.75); |
|
207 |
-moz-box-shadow: 0 0 8px rgba(68, 191, 68, 0.5); |
|
208 |
-webkit-box-shadow: 0 0 8px rgba(68, 191, 68, 0.5); |
|
209 |
box-shadow: 0 0 8px rgba(68, 191, 68, 0.5); |
|
210 |
} |
|
211 |
|
|
212 |
.incorrect { |
|
213 |
border-color: rgba(191, 68, 68, 0.75); |
|
214 |
} |
|
215 |
|
|
216 |
.incorrect:focus { |
|
217 |
border-color: rgba(191, 68, 68, 0.75); |
|
218 |
-moz-box-shadow: 0 0 8px rgba(191, 68, 68, 0.5); |
|
219 |
-webkit-box-shadow: 0 0 8px rgba(191, 68, 68, 0.5); |
|
220 |
box-shadow: 0 0 8px rgba(191, 68, 68, 0.5); |
|
221 |
} |
|
222 |
|
|
223 |
/*p#chsignInfo { |
|
224 |
color:#F00; |
|
225 |
font-size: 12px; |
|
226 |
margin:1.02em 1em; |
|
227 |
background-color: #CCC; |
|
228 |
border-radius: 4px; |
|
229 |
padding:2px; |
|
230 |
}*/ |
|
231 |
|
|
232 |
.answer { |
|
233 |
margin:0.2em 0; |
|
234 |
display:block; |
|
235 |
} |
|
236 |
|
|
237 |
.answer input { |
|
238 |
border-radius:0.5rem; |
|
239 |
padding:0.2em 0.7em; |
|
240 |
} |
|
241 |
|
|
242 |
.form_button { |
|
243 |
background-color:rgba(128,128,128,0.9); |
|
244 |
/*background: url(button.png) no-repeat top;*/ |
|
245 |
display:inline-block; |
|
246 |
} |
|
247 |
|
|
100 | 248 |
.validators { |
101 | 249 |
text-align:center; |
102 | 250 |
background-color:#CCC; |
index.php | ||
---|---|---|
3 | 3 |
<head> |
4 | 4 |
<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> |
5 | 5 |
<title>Liste des panoramas</title> |
6 |
<link rel="stylesheet" media="screen" href="css/all.css" />
|
|
6 |
<link rel="stylesheet" media="screen" href="css/index_style.css" />
|
|
7 | 7 |
<script src="js/pano.js"></script> |
8 | 8 |
</head> |
9 | 9 |
<body> |
10 |
<h1>Liste des panoramas</h1> |
|
11 |
<?php |
|
12 |
require 'class/site_point.class.php'; |
|
13 |
require 'class/sites_dir.class.php'; |
|
14 |
echo '<ul>'; |
|
15 |
if(isset($_GET['dir']) && is_dir($_GET['dir'])) { |
|
16 |
$base_dir = $_GET['dir']; |
|
17 |
} else { |
|
18 |
$base_dir = 'tiles'; |
|
19 |
} |
|
20 |
|
|
21 |
$dir = new sites_dir($base_dir); |
|
22 |
|
|
23 |
foreach($dir->get_sites() as $pt) { |
|
24 |
$params = $pt->get_params(); |
|
25 |
if (isset($params['titre'])) { |
|
26 |
$cmt = $params['titre']; |
|
27 |
} else { |
|
28 |
$cmt = sprintf('fichier <samp>%s/%s</samp>', $pt->get_name(), $pt->get_prefix()); |
|
29 |
} |
|
30 |
printf ('<li><a href="panorama.php?dir=%s&panorama=%s">%s</a></li>'."\n", $base_dir, $pt->get_name(), $cmt); |
|
31 |
} |
|
32 |
echo '</ul>'; |
|
33 |
?> |
|
10 |
<img id="top" src="images/top.png" alt=""> |
|
11 |
<div id="index_container"> |
|
12 |
<h1><img src="images/tetaneutral.png" /></h1> |
|
13 |
<h2>Liste des panoramas</h2> |
|
14 |
<?php |
|
15 |
|
|
16 |
require 'class/site_point.class.php'; |
|
17 |
require 'class/sites_dir.class.php'; |
|
18 |
|
|
19 |
echo '<div id="containerList">'; |
|
20 |
echo '<ul>'; |
|
21 |
|
|
22 |
if(isset($_GET['dir']) && is_dir($_GET['dir'])) { |
|
23 |
$base_dir = $_GET['dir']; |
|
24 |
} else { |
|
25 |
$base_dir='tiles'; |
|
26 |
} |
|
27 |
|
|
28 |
$dir = new sites_dir($base_dir); |
|
29 |
|
|
30 |
|
|
31 |
foreach($dir->get_sites() as $pt) { |
|
32 |
|
|
33 |
$params = $pt->get_params(); |
|
34 |
if (isset($params['titre'])) { |
|
35 |
$cmt = $params['titre']; |
|
36 |
|
|
37 |
} else { |
|
38 |
$cmt = sprintf('fichier <samp>%s/%s</samp>', $pt->get_name(), $pt->get_prefix()); |
|
39 |
} |
|
40 |
|
|
41 |
printf ('<li><a href="panorama.php?dir=%s&panorama=%s">%s</a></li>'."\n", $base_dir, $pt->get_name(), $cmt); |
|
42 |
} |
|
43 |
?> |
|
44 |
</div> |
|
45 |
</div> |
|
46 |
<div id="interaction"> |
|
47 |
|
|
48 |
<li><a href="./envoyer.php" title="Envoyer une image sur le site">Ajouter un panorama</a></li> |
|
49 |
<li><a href="./creerPano.php" title="Générer un panorama à partir d\'une image déjà envoyée">Générer un panorama</a></li> |
|
50 |
|
|
51 |
</div> |
|
52 |
</ul> |
|
53 |
<img id="bottom" src="images/bottom.png" alt=""> |
|
34 | 54 |
<p><a href="http://validator.w3.org/check?uri=referer">page xHTML validé !</a></p> |
35 | 55 |
</body> |
36 | 56 |
</html> |
js/pano.js | ||
---|---|---|
1 |
if (img_prefix == undefined) var img_prefix = './tiles/ttn_mediatheque/mediatheque_70';
|
|
1 |
if (img_prefix == undefined) var img_prefix = 'http://pano.tetaneutral.net/data/tsf2/vpongnian/tiles/ttn_mediatheque/mediatheque_70';
|
|
2 | 2 |
if (to_cap == undefined) var to_cap = 0; |
3 | 3 |
if (to_ele == undefined) var to_ele = 0; |
4 | 4 |
if (to_zoom == undefined) var to_zoom = 0; |
... | ... | |
8 | 8 |
if (ref_points == undefined) var ref_points = new Array(); |
9 | 9 |
if (image_loop == undefined) var image_loop = true; |
10 | 10 |
|
11 |
|
|
11 | 12 |
var debug_mode = false; |
12 | 13 |
var canvas; |
13 | 14 |
var cntext; |
... | ... | |
31 | 32 |
var point_colors = {'pano_point' : '255,128,128', |
32 | 33 |
'ref_point' : '128,128,255', |
33 | 34 |
'loc_point' : '128,255,128', |
35 |
'temporary' : '255,255,128', |
|
34 | 36 |
'unlocated' : '255,255,255'}; |
35 | 37 |
var test = {x:0, y:0, i:100}; |
36 | 38 |
|
39 |
|
|
37 | 40 |
function nmodulo(val, div) { // pour obtenir un modulo dans l'espace des nombres naturels N. |
38 | 41 |
return Math.floor((val%div+div)%div); // il y a peut être plus simple, mais en attendant .... |
39 | 42 |
} |
... | ... | |
165 | 168 |
if (twidth) { |
166 | 169 |
cntext.restore(); |
167 | 170 |
} |
171 |
|
|
172 |
} |
|
173 |
|
|
174 |
function insert_drawn_point(lat,lon,alt) { |
|
175 |
|
|
176 |
var rt = 6371; // Rayon de la terre |
|
177 |
var alt1 = document.getElementById('pos_alt').childNodes[0].nodeValue; |
|
178 |
var lat1 = document.getElementById('pos_lat').childNodes[0].nodeValue*Math.PI/180; |
|
179 |
var lon1 = document.getElementById('pos_lon').childNodes[0].nodeValue*Math.PI/180; |
|
180 |
var alt2 = alt; |
|
181 |
var lat2 = lat*Math.PI/180; |
|
182 |
var lon2 = lon*Math.PI/180; |
|
183 |
|
|
184 |
var dLat = lat2-lat1; |
|
185 |
var dLon = lon2-lon1; |
|
186 |
|
|
187 |
var a = Math.sin(dLat/2)*Math.sin(dLat/2) + Math.sin(dLon/2)*Math.sin(dLon/2)*Math.cos(lat1)*Math.cos(lat2); // |
|
188 |
var angle = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); |
|
189 |
var d = angle*rt; // distance du point en Kms |
|
190 |
|
|
191 |
var y = Math.sin(dLon) * Math.cos(lat2); |
|
192 |
var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); |
|
193 |
var cap = Math.atan2(y,x); // cap pour atteindre le point en radians |
|
194 |
var e = Math.atan2((alt2 - alt1)/1000 - d*d/(2*rt),d); // angle de l'élévation en radians |
|
195 |
|
|
196 |
return {d:d, cap:cap*180/Math.PI, ele:e*180/Math.PI}; // les résultats sont en degrés |
|
197 |
} |
|
198 |
|
|
199 |
localate_point = function () { |
|
200 |
|
|
201 |
var lat = document.getElementById("loca_latitude").value; |
|
202 |
var lon = document.getElementById("loca_longitude").value; |
|
203 |
var alt = document.getElementById("loca_altitude").value; |
|
204 |
if (lat == '' || isNaN(lat) || lat <= -90 || lat > 90) { |
|
205 |
alert("La latitude "+lat+"n'est pas correcte"); |
|
206 |
return; |
|
207 |
} |
|
208 |
if (lat == '' || isNaN(lon) || lon <= -180 || lon > 180) { |
|
209 |
alert("La longitude "+lon+"n'est pas correcte"); |
|
210 |
return; |
|
211 |
} |
|
212 |
if (lat == '' || isNaN(alt) || alt < -400) { |
|
213 |
alert("l'altitude "+alt+"n'est pas correcte"); |
|
214 |
return; |
|
215 |
} |
|
216 |
var opt_ced = new Array(); |
|
217 |
opt_dce = insert_drawn_point(lat,lon,alt); |
|
218 |
// -----Première solution : afficher dynamiquement le point ! |
|
219 |
var d = opt_dce.d; |
|
220 |
var cap = opt_dce.cap; |
|
221 |
var ele = opt_dce.ele; |
|
222 |
|
|
223 |
display_temp(d, cap, ele); |
|
224 |
|
|
225 |
} |
|
226 |
|
|
227 |
function display_temp(d,cap,ele) { |
|
228 |
|
|
229 |
point_list[point_list.length] = new Array("point temporaire", d,cap,ele, "temporary"); |
|
230 |
reset_zooms(); |
|
231 |
putImage(last.x, last.y); |
|
232 |
} |
|
233 |
|
|
234 |
function arrayUnset(array, value){ |
|
235 |
array.splice(array.indexOf(value), 1); |
|
236 |
} |
|
237 |
|
|
238 |
erase_point = function() { |
|
239 |
|
|
240 |
for (var i=0; i<point_list.length; i++) { |
|
241 |
if(point_list[i][0] == "point temporaire"){ |
|
242 |
arrayUnset(point_list,point_list[i]); |
|
243 |
loop = erase_point(); |
|
244 |
} |
|
245 |
} |
|
246 |
reset_zooms(); |
|
247 |
putImage(last.x, last.y); |
|
168 | 248 |
} |
169 | 249 |
|
170 | 250 |
function get_file_name(x, y, z) { // recherche du fichier correspondant au zoom et à la position |
... | ... | |
181 | 261 |
} |
182 | 262 |
|
183 | 263 |
function keys(key) { |
264 |
|
|
184 | 265 |
hide_links(); |
185 | 266 |
evt = key || event; |
186 |
evt.preventDefault(); |
|
187 |
evt.stopPropagation(); |
|
267 |
//evt.preventDefault();
|
|
268 |
//evt.stopPropagation();
|
|
188 | 269 |
if (!key) { |
189 | 270 |
key = window.event; |
190 | 271 |
key.which = key.keyCode; |
... | ... | |
192 | 273 |
// alert(key); |
193 | 274 |
// if (!evt.shiftKey) return; |
194 | 275 |
switch (key.which) { |
195 |
case 66: // b |
|
276 |
/*case 66: // b
|
|
196 | 277 |
alert(key.pageX); |
197 | 278 |
test.x=tile.width*(ntiles.x-3); |
198 | 279 |
test.y=0; |
... | ... | |
202 | 283 |
test.x=0; |
203 | 284 |
test.y=tile.height*(ntiles.y-3); |
204 | 285 |
putImage(test.x, test.y); |
205 |
return; |
|
286 |
return;*/
|
|
206 | 287 |
case 36: // home |
207 | 288 |
putImage(0, zm.im.height/2); |
208 | 289 |
return; |
... | ... | |
440 | 521 |
if (ref_points[lbl] != undefined) { |
441 | 522 |
typ = 'ref_point'; |
442 | 523 |
if (!is_located) rxy = {x:ref_points[lbl].x*this.im.width, y:ref_points[lbl].y*this.im.height} |
443 |
} else if(lnk == '' && is_visible) { |
|
524 |
} else if(lnk == '' && is_visible && lbl != 'point temporaire') {
|
|
444 | 525 |
typ = 'loc_point'; |
526 |
}else if(is_visible && lbl =='point temporaire') { |
|
527 |
typ = 'temporary'; |
|
528 |
|
|
445 | 529 |
} else if(is_visible) { |
446 | 530 |
typ = 'pano_point'; |
447 | 531 |
lnk += '&to_zoom='+this.value; |
448 |
} |
|
532 |
}
|
|
449 | 533 |
this.pt_list[i]['type'] = typ; |
450 | 534 |
this.pt_list[i]['cap'] = cap; |
451 | 535 |
this.pt_list[i]['ele'] = ele; |
... | ... | |
700 | 784 |
speed.y = 0; |
701 | 785 |
} |
702 | 786 |
|
787 |
|
|
788 |
|
|
703 | 789 |
canvas_set_size = function() { |
704 | 790 |
canvas.style.border = border_width+"px solid red"; |
705 | 791 |
canvas.width = window.innerWidth-2*border_width; |
... | ... | |
713 | 799 |
putImage(last.x, last.y); |
714 | 800 |
} |
715 | 801 |
|
802 |
|
|
803 |
|
|
804 |
function paramIn(e) { |
|
805 |
|
|
806 |
e = e || window.event; |
|
807 |
var relatedTarget = e.relatedTarget || e.fromElement; |
|
808 |
|
|
809 |
while (relatedTarget != adding && relatedTarget.nodeName != 'BODY' && relatedTarget != document && relatedTarget != localisation) { |
|
810 |
relatedTarget = relatedTarget.parentNode; |
|
811 |
} |
|
812 |
|
|
813 |
if (relatedTarget != adding && relatedTarget != localisation) { |
|
814 |
document.removeEventListener('keydown', keys, false); |
|
815 |
} |
|
816 |
} |
|
817 |
|
|
818 |
function paramOut(e) { |
|
819 |
|
|
820 |
e = e || window.event; |
|
821 |
var relatedTarget = e.relatedTarget || e.toElement; |
|
822 |
|
|
823 |
while (relatedTarget != adding && relatedTarget.nodeName != 'BODY' && relatedTarget != document && relatedTarget != localisation) { |
|
824 |
relatedTarget = relatedTarget.parentNode; |
|
825 |
} |
|
826 |
|
|
827 |
if (relatedTarget != adding && relatedTarget != localisation) { |
|
828 |
document.addEventListener('keydown', keys, false); |
|
829 |
} |
|
830 |
|
|
831 |
} |
|
832 |
|
|
716 | 833 |
window.onload = function() { |
834 |
|
|
835 |
localisation = document.getElementById("locadraw"); |
|
836 |
adding = document.getElementById("adding"); |
|
717 | 837 |
canvas = document.getElementById("mon-canvas"); |
718 | 838 |
cntext = canvas.getContext("2d"); |
719 | 839 |
canvas_set_size(); |
... | ... | |
746 | 866 |
elvtn_control.onclick = change_angle; |
747 | 867 |
|
748 | 868 |
change_angle(); |
749 |
|
|
869 |
loca_temp = document.getElementById("loca_button"); |
|
870 |
loca_temp.onclick = localate_point; |
|
871 |
loca_erase = document.getElementById("loca_erase"); |
|
872 |
loca_erase.onclick = erase_point; |
|
750 | 873 |
canvas.addEventListener('mousedown', onImageClick, false); |
751 |
addEventListener('keydown', keys, false); |
|
874 |
document.addEventListener('keydown', keys, false);
|
|
752 | 875 |
canvas.addEventListener('mousewheel', wheel_zoom, false); |
753 | 876 |
window.onresize = canvas_resize; |
877 |
adding.addEventListener('mouseover',paramIn,false); |
|
878 |
adding.addEventListener('mouseout',paramOut,false); |
|
879 |
localisation.addEventListener('mouseover',paramIn,false); |
|
880 |
localisation.addEventListener('mouseout',paramOut,false); |
|
881 |
|
|
754 | 882 |
}; |
js/pano_array.js | ||
---|---|---|
1 |
if (img_prefix == undefined) var img_prefix = './tiles/ttn_mediatheque/mediatheque_70'; |
|
2 |
if (to_cap == undefined) var to_cap = 0; |
|
3 |
if (to_ele == undefined) var to_ele = 0; |
|
4 |
if (cap == undefined) var cap = 0; |
|
5 |
if (elevation == undefined) var elevation = 0; |
|
6 |
if (cap_min == undefined) var cap_min = cap; |
|
7 |
if (cap_max == undefined) var cap_max = cap_min+360; |
|
8 |
if (ref_points == undefined) var ref_points = new Array(); |
|
9 |
if (image_loop == undefined) var image_loop = true; |
|
10 |
|
|
11 |
var canvas; |
|
12 |
var cntext; |
|
13 |
var point_list = new Array(); |
|
14 |
var zoom; |
|
15 |
var to_zoom; |
|
16 |
var zooms = new Array(); |
|
17 |
var prev_zm; |
|
18 |
var zm; |
|
19 |
var tile = {width:256, height:256}; |
|
20 |
var ntiles = {x:228, y:9}; |
|
21 |
var border_width = 5; |
|
22 |
var imageObj = new Array(); |
|
23 |
|
|
24 |
var last = {x:0,y:0}; |
|
25 |
var shift = {x:0,y:0}; |
|
26 |
var mouse = {x:0,y:0}; |
|
27 |
var speed = {x:0,y:0}; |
|
28 |
var canvas_pos = {x:0,y:0}; |
|
29 |
var tmt; |
|
30 |
|
|
31 |
var test = {x:0, y:0, i:100}; |
|
32 |
|
|
33 |
function nmodulo(val, div) { // pour obtenir un modulo dans l'espace des nombres naturels N. |
|
34 |
return Math.floor((val%div+div)%div); // il y a peut être plus simple, mais en attendant .... |
|
35 |
} |
|
36 |
|
|
37 |
function fmodulo(val, div) { // pour obtenir un modulo dans l'espace des nombres réels positifs. |
|
38 |
return (val%div+div)%div; // il y a peut être plus simple, mais en attendant .... |
|
39 |
} |
|
40 |
|
|
41 |
function distort_canvas(p, x, y) { |
|
42 |
if (p == 0) distort = 0; |
|
43 |
else { |
|
44 |
cntext.save(); |
|
45 |
distort++; |
|
46 |
cntext.clearRect(0, 0, canvas.width, 2*canvas.height); |
|
47 |
var ratio = (canvas.width-2*distort)/canvas.width; |
|
48 |
var shift = canvas.height/2*(1-ratio); |
|
49 |
cntext.scale(1, ratio); |
|
50 |
if (p == 1) cntext.translate(0, 0); |
|
51 |
else if (p == -1) cntext.translate(0, 0); |
|
52 |
draw_image(x, y); |
|
53 |
cntext.restore(); |
|
54 |
document.getElementById('res').innerHTML = 'distort : ' + distort + ' shift ' + shift + ' ratio : ' + ratio + '<br/>'; |
|
55 |
} |
|
56 |
} |
|
57 |
|
|
58 |
function draw_image(ox, oy) { |
|
59 |
ox = nmodulo(ox-canvas.width/2, zm.im.width); // pour placer l'origine au centre du canvas |
|
60 |
oy = Math.floor(oy-canvas.height/2); // pas de rebouclage vertical |
|
61 |
|
|
62 |
cntext.clearRect(0, 0, canvas.width, canvas.height); |
|
63 |
cntext.fillStyle = "rgba(128,128,128,0.8)"; |
|
64 |
|
|
65 |
if (canvas.height > zm.im.height) { |
|
66 |
var fy = Math.floor((oy+canvas.height/2-zm.im.height/2)/(tile.height*zm.ntiles.y))*zm.ntiles.y; |
|
67 |
if (fy < 0) fy = 0; |
|
68 |
var ly = fy + zm.ntiles.y; |
|
69 |
} else { |
|
70 |
var fy = Math.floor(oy/tile.height); |
|
71 |
var ly = Math.floor((oy+canvas.height+tile.height-1)/tile.height+1); |
|
72 |
if (fy < 0) fy = 0; |
|
73 |
if (ly > zm.ntiles.y) ly = zm.ntiles.y; |
|
74 |
} |
|
75 |
|
|
76 |
for (var j=fy; j<ly; j++) { |
|
77 |
var delta_y = (Math.floor(j/zm.ntiles.y) - Math.floor(fy/zm.ntiles.y)) * (tile.height - zm.last_tile.height); |
|
78 |
var dy = j*tile.height - oy - delta_y; |
|
79 |
var ny = j%ntiles.y; |
|
80 |
var wy = zm.tile.width; |
|
81 |
if (ny == zm.ntiles.y - 1) wy = zm.last_tile.height; |
|
82 |
|
|
83 |
var cpx = 0; |
|
84 |
var i = 0; |
|
85 |
var Nx = zm.ntiles.x; |
|
86 |
while (cpx < ox+canvas.width) { |
|
87 |
var cur_width = zm.tile.width; |
|
88 |
if (i%Nx == zm.ntiles.x-1) cur_width = zm.last_tile.width; |
|
89 |
if (cpx >= ox-cur_width) { |
|
90 |
var nx = i%Nx; |
|
91 |
load_image(nx, ny, cpx-ox, dy, ox, oy); |
|
92 |
} |
|
93 |
cpx += cur_width; |
|
94 |
i++; |
|
95 |
} |
|
96 |
} |
|
97 |
drawDecorations(ox, oy); |
|
98 |
} |
|
99 |
|
|
100 |
function load_image(nx, ny, ox, oy, x, y) { |
|
101 |
var idx = nx+'-'+ny+'-'+zoom; |
|
102 |
if (imageObj[idx] && imageObj[idx].complete) { |
|
103 |
draw_tile(idx, ox, oy); // l'image est déja en mémoire, on force le dessin sans attendre. |
|
104 |
} else { |
|
105 |
var fname = get_file_name(nx, ny, zoom); |
|
106 |
imageObj[idx] = new Image(); |
|
107 |
imageObj[idx].src = fname; |
|
108 |
var ts = zm.get_tile_size(nx, ny); |
|
109 |
cntext.fillRect(ox, oy, ts.width, ts.height); |
|
110 |
var dx = shift.x; |
|
111 |
var dy = shift.y; |
|
112 |
imageObj[idx].addEventListener('load', function() {draw_tile_del(zoom, dx, dy, idx, ox, oy, x, y)}, false); |
|
113 |
} |
|
114 |
} |
|
115 |
|
|
116 |
function draw_tile_del(ezoom, dx, dy, idx, ox, oy, x, y) { |
|
117 |
if (ezoom == zoom && dx == shift.x && dy == shift.y) { |
|
118 |
draw_tile(idx, ox, oy); |
|
119 |
drawDecorations(x, y); |
|
120 |
} |
|
121 |
} |
|
122 |
|
|
123 |
function draw_tile(idx, ox, oy) { |
|
124 |
var img = imageObj[idx]; |
|
125 |
cntext.drawImage(img, ox, oy); |
|
126 |
} |
|
127 |
|
|
128 |
function drawDecorations(ox, oy) { |
|
129 |
var wgrd = zm.im.width/360; |
|
130 |
var od = ((ox+canvas.width/2)/wgrd)%360; |
|
131 |
var el = (zm.im.height/2 - (oy+canvas.height/2))/wgrd; |
|
132 |
// document.getElementById('angle_ctrl').value = od.toFixed(2); |
|
133 |
// document.getElementById('elvtn_ctrl').value = el.toFixed(2); |
|
134 |
cntext.fillStyle = "rgba(0,128,128,0.9)"; |
|
135 |
cntext.strokeStyle = "rgb(255,255,255)"; |
|
136 |
cntext.lineWidth = 1; |
|
137 |
cntext.fillRect(canvas.width/2-5, canvas.height/2-5, 10, 10); |
|
138 |
cntext.strokeRect(canvas.width/2-5, canvas.height/2-5, 10, 10); |
|
139 |
document.getElementById('res').innerHTML = ''; |
|
140 |
for(var i = 0; i < zm.pt_list.length; i++) { |
|
141 |
var cx = nmodulo(zm.pt_list[i]['xc'] - ox, zm.im.width); |
|
142 |
var cy = zm.pt_list[i]['yc'] - oy; |
|
143 |
if (zm.pt_list[i]['lnk'] != undefined) cntext.fillStyle = "rgba(255,128,128,0.5)"; |
|
144 |
else cntext.fillStyle = "rgba(128,255,128,0.5)"; |
|
145 |
cntext.beginPath(); |
|
146 |
cntext.arc(cx, cy, 20, 0, 2*Math.PI, true); |
|
147 |
cntext.fill(); |
|
148 |
document.getElementById('res').innerHTML += 'cx : ' + cx + ' cy ' + cy + ' lnk : ' + zm.pt_list[i]['lnk'] + '<br/>'; |
|
149 |
} |
|
150 |
|
|
151 |
//cntext.font = "20pt Arial"; |
|
152 |
//cntext.fillRect(0, 0, 200, 20); |
|
153 |
//cntext.fillStyle = "rgb(255,0,0)"; |
|
154 |
//cntext.fillText(od.toFixed(2), 5, 20); |
|
155 |
//for (i=0; i<canvas.width/wgrd; i++) { |
|
156 |
//cntext.strokeRect(i*wgrd, 0, wgrd, 20); |
|
157 |
//} |
|
158 |
} |
|
159 |
|
|
160 |
function get_file_name(x, y, z) { // recherche du fichier correspondant au zoom et à la position |
|
161 |
var prm = [z, x, y]; |
|
162 |
var fname = img_prefix; |
|
163 |
for (var i = 0; i < prm.length; i++) { |
|
164 |
fname += '_'; |
|
165 |
if (prm[i] < 10) fname += '00'; |
|
166 |
else if (prm[i] < 100) fname += '0'; |
|
167 |
fname += prm[i]; |
|
168 |
} |
|
169 |
fname += '.jpg'; |
|
170 |
return fname; |
|
171 |
} |
|
172 |
|
|
173 |
function keys(key) { |
|
174 |
event.preventDefault(); |
|
175 |
event.stopPropagation(); |
|
176 |
if (!key) { |
|
177 |
key = event; |
|
178 |
key.which = key.keyCode; |
|
179 |
} |
|
180 |
evt = key || event; |
|
181 |
// alert(key); |
|
182 |
// if (!evt.shiftKey) return; |
|
183 |
switch (key.which) { |
|
184 |
case 36: // home |
|
185 |
test.x=0; |
|
186 |
test.y=0; |
|
187 |
putImage(test.x, test.y); |
|
188 |
return; |
|
189 |
case 66: // b |
|
190 |
alert(key.pageX); |
|
191 |
test.x=tile.width*(ntiles.x-3); |
|
192 |
test.y=0; |
|
193 |
putImage(test.x, test.y); |
|
194 |
return; |
|
195 |
case 67: // c |
|
196 |
test.x=0; |
|
197 |
test.y=tile.height*(ntiles.y-3); |
|
198 |
putImage(test.x, test.y); |
|
199 |
return; |
|
200 |
case 35: // end |
|
201 |
test.x=tile.width*(ntiles.x-3); |
|
202 |
test.y=tile.height*(ntiles.y-3); |
|
203 |
putImage(test.x, test.y); |
|
204 |
return; |
|
205 |
case 39: // left |
|
206 |
test.x+=test.i; |
|
207 |
putImage(test.x, test.y); |
|
208 |
return; |
|
209 |
case 40: // up |
|
210 |
test.y+=test.i; |
|
211 |
putImage(test.x, test.y); |
|
212 |
return; |
|
213 |
case 37: // right |
|
214 |
test.x-=test.i; |
|
215 |
putImage(test.x, test.y); |
|
216 |
return; |
|
217 |
case 38: // down |
|
218 |
test.y-=test.i; |
|
219 |
putImage(test.x, test.y); |
|
220 |
return; |
|
221 |
case 33: // pageup |
|
222 |
test.y=0; |
|
223 |
putImage(test.x, test.y); |
|
224 |
return; |
|
225 |
case 34: // pagedown |
|
226 |
test.y=tile.height*(ntiles.y-3); |
|
227 |
putImage(test.x, test.y); |
|
228 |
return; |
|
229 |
default: |
|
230 |
//alert(key.which) |
|
231 |
return; |
|
232 |
} |
|
233 |
} |
|
234 |
|
|
235 |
function onImageClick(e) { |
|
236 |
shift.x = last.x; |
|
237 |
shift.y = last.y; |
|
238 |
speed.x = 0; |
|
239 |
speed.y = 0; |
|
240 |
mouse.x = e.pageX; |
|
241 |
mouse.y = e.pageY; |
|
242 |
clearTimeout(tmt); //arrêt de l'éffet eventuel d'amorti en cours. |
|
243 |
canvas.addEventListener('mousemove', stickImage, false); |
|
244 |
canvas.addEventListener('mouseup', launchImage, false); |
|
245 |
//canvas.addEventListener('mouseout', launchImage, false); |
|
246 |
canvas.style.cursor='move'; |
|
247 |
//document.onmousemove = stickImage; |
|
248 |
document.onmouseup = launchImage; |
|
249 |
hide_links(); |
|
250 |
} |
|
251 |
|
|
252 |
|
|
253 |
function stickImage(e) { |
|
254 |
var xs = mouse.x - e.pageX + shift.x; |
|
255 |
var ys = mouse.y - e.pageY + shift.y; |
|
256 |
speed.x = xs - last.x; //mémorisation des vitesses horizontales |
|
257 |
speed.y = ys - last.y; //et verticales lors de ce déplacement |
|
258 |
putImage(xs, ys); |
|
259 |
} |
|
260 |
|
|
261 |
function launchImage(e) { |
|
262 |
distort_canvas(0); |
|
263 |
canvas.removeEventListener('mousemove', stickImage, false); |
|
264 |
show_links(); |
|
265 |
//document.onmousemove = null; |
|
266 |
shift.x = e.pageX - mouse.x + shift.x; |
|
267 |
shift.y = e.pageY - mouse.y + shift.y; |
|
268 |
tmt = setTimeout(inertialImage, 100); |
|
269 |
} |
|
270 |
|
|
271 |
function putImage(x, y) { // est destiné à permettre l'effet d'amortissement par la mémorisation de la position courante. |
|
272 |
if (!zm.is_updated) return; |
|
273 |
if (x >= zm.im.width) { // rebouclage horizontal |
|
274 |
shift.x -= zm.im.width; |
|
275 |
x -= zm.im.width; |
|
276 |
} else if (x < 0) { |
|
277 |
shift.x += zm.im.width; |
|
278 |
x += zm.im.width; |
|
279 |
} |
|
280 |
if (y >= zm.im.height) { // pas de rebouclage vertical mais blocage |
|
281 |
//distort_canvas(1, x, y); |
|
282 |
shift.y = zm.im.height-1; |
|
283 |
y = zm.im.height-1; |
|
284 |
} else if (y < 0) { |
|
285 |
//distort_canvas(-1, x, y); |
|
286 |
shift.y = 0; |
|
287 |
y = 0; |
|
288 |
} |
|
289 |
|
|
290 |
draw_image(x, y); |
|
291 |
last.x = x; |
|
292 |
last.y = y; |
|
293 |
} |
|
294 |
|
|
295 |
function inertialImage() { |
|
296 |
speed.x *= 0.9; |
|
297 |
speed.y *= 0.9; |
|
298 |
if (Math.abs(speed.x) > 2 || Math.abs(speed.y) > 2) { |
|
299 |
putImage(last.x+speed.x, last.y+speed.y); |
|
300 |
tmt = setTimeout(inertialImage, 100); |
|
301 |
} |
|
302 |
} |
|
303 |
|
|
304 |
function tri_ref_points(v1, v2) { |
|
305 |
return v1['x'] - v2['x']; |
|
306 |
} |
|
307 |
|
|
308 |
|
|
309 |
|
|
310 |
function tzoom(zv) { |
|
311 |
this.ref_pixels = new Array; |
|
312 |
this.value = zv; |
|
313 |
this.ntiles = {x:0,y:0}; |
|
314 |
this.tile = {width:0,height:0}; |
|
315 |
this.last_tile = {width:0,height:0}; |
|
316 |
this.max_tile = {width:0,height:0}; |
|
317 |
this.im = {width:0,height:0}; |
|
318 |
this.pt_list = new Array(); |
|
319 |
this.is_updated = false; |
|
320 |
|
|
321 |
this.refresh = function() { |
|
322 |
this.im.visible_width = this.tile.width*(this.ntiles.x-1)+this.last_tile.width; |
|
323 |
this.is_updated = true; |
|
324 |
|
|
325 |
this.im.width = this.im.visible_width; |
|
326 |
this.im.height = this.tile.height*(this.ntiles.y-1)+this.last_tile.height; |
|
327 |
if (this.last_tile.width > this.tile.width) this.max_tile.width = this.im.last_tile.width; |
|
328 |
else this.max_tile.width = this.tile.width; |
|
329 |
if (this.last_tile.height > this.tile.height) this.max_tile.height = this.im.last_tile.height; |
|
330 |
else this.max_tile.height = this.tile.height; |
|
331 |
|
|
332 |
this.ref_pixels[0] = new Array(); // Attention il faut compter un intervalle de plus ! |
|
333 |
ord_pts = new Array(); |
|
334 |
i=0; |
|
335 |
for(var label in ref_points) { |
|
336 |
ord_pts[i] = ref_points[label] |
|
337 |
} |
|
338 |
ord_pts = ord_pts.sort(tri_ref_points); |
|
339 |
|
|
340 |
for (var i=0; i < ord_pts.length; i++) { |
|
341 |
this.ref_pixels[i+1] = new Array(); |
|
342 |
if (i != ord_pts.length-1) { |
|
343 |
this.ref_pixels[i+1]['ratio_x'] = (ord_pts[i+1]['x'] - ord_pts[i]['x'])/fmodulo(ord_pts[i+1]['cap'] - ord_pts[i]['cap'], 360)*this.im.width; |
|
344 |
this.ref_pixels[i+1]['ratio_y'] = (ord_pts[i+1]['y'] - ord_pts[i]['y'])/fmodulo(ord_pts[i+1]['ele'] - ord_pts[i]['ele'], 360); |
|
345 |
} |
|
346 |
this.ref_pixels[i+1]['x'] = Math.floor(ord_pts[i]['x']*this.im.width); |
|
347 |
this.ref_pixels[i+1]['cap'] = ord_pts[i]['cap']; |
|
348 |
this.ref_pixels[i+1]['y'] = Math.floor(ord_pts[i]['y']*this.im.height); |
|
349 |
this.ref_pixels[i+1]['ele'] = ord_pts[i]['ele']; |
|
350 |
} |
|
351 |
if (image_loop == true) { |
|
352 |
var dpix = this.im.width; |
|
353 |
var dangle = 360; |
|
354 |
if (ord_pts.length > 1) { |
|
355 |
dpix = zm.im.width - this.ref_pixels[this.ref_pixels.length-1]['x'] + this.ref_pixels[1]['x']; |
|
356 |
dangle = fmodulo(this.ref_pixels[1]['cap'] - this.ref_pixels[this.ref_pixels.length-1]['cap'], 360); |
|
357 |
} |
|
358 |
this.ref_pixels[0]['ratio_x'] = dpix/dangle; |
|
359 |
this.ref_pixels[ord_pts.length]['ratio_x'] = this.ref_pixels[0]['ratio_x']; |
|
360 |
this.ref_pixels[ord_pts.length]['ratio_y'] = this.ref_pixels[0]['ratio_y']; |
|
361 |
dpix = this.im.width - this.ref_pixels[ord_pts.length]['x']; |
|
362 |
this.ref_pixels[0]['cap'] = this.ref_pixels[ord_pts.length]['cap'] + dpix / this.ref_pixels[0]['ratio_x']; |
|
363 |
} else { |
|
364 |
this.ref_pixels[0]['ratio_x'] = this.ref_pixels[1]['ratio_x']; |
|
365 |
this.ref_pixels[ord_pts.length]['ratio_x'] = this.ref_pixels[ord_pts.length-1]['ratio_x']; |
|
366 |
this.ref_pixels[0]['ratio_y'] = this.ref_pixels[1]['ratio_y']; |
|
367 |
this.ref_pixels[ord_pts.length]['ratio_y'] = this.ref_pixels[ord_pts.length-1]['ratio_y']; |
|
368 |
this.ref_pixels[0]['cap'] = this.ref_pixels[1]['cap'] - this.ref_pixels[1]['x'] / this.ref_pixels[1]['ratio_x']; |
|
369 |
} |
|
370 |
this.ref_pixels[0]['x'] = 0; |
|
371 |
this.ref_pixels[0]['y'] = 0; |
|
372 |
this.ref_pixels[0]['ele'] = 0; |
|
373 |
|
|
374 |
|
|
375 |
for (var i=0; i<point_list.length; i++) { |
|
376 |
this.pt_list[i] = new Array(); |
|
377 |
this.pt_list[i]['angle'] = point_list[i][2]; |
|
378 |
this.pt_list[i]['label'] = point_list[i][0]; |
|
379 |
this.pt_list[i]['xc'] = Math.floor(this.get_pxx(point_list[i][2], 360)); |
|
380 |
// var tmp = fmodulo(point_list[i][2], 360); |
|
381 |
// this.pt_list[i]['xc'] = Math.floor(tmp * this.im.width/360); |
|
382 |
this.pt_list[i]['yc'] = Math.floor(this.im.height/2 - (point_list[i][3] + elevation) * this.im.width/360); |
|
383 |
if (point_list[i][4] != '') this.pt_list[i]['lnk'] = point_list[i][4]+'&to_zoom='+zv; |
|
384 |
} |
|
385 |
} |
|
386 |
|
|
387 |
this.get_tile_size = function(nx, ny) { |
|
388 |
var res = {width:0, height:0}; |
|
389 |
if (nx == this.ntiles.x-1) res.width = this.last_tile.width; |
|
390 |
else res.width = this.tile.width; |
|
391 |
if (ny == this.ntiles.y-1) res.height = this.last_tile.height; |
|
392 |
else res.height = this.tile.height; |
|
393 |
return res; |
|
394 |
} |
|
395 |
|
|
396 |
this.get_cap = function(px) { // recherche du cap à partir d'un pixel. |
|
397 |
for (var i=0; i < this.ref_pixels.length; i++) { |
|
398 |
if (i == this.ref_pixels.length - 1 || px < this.ref_pixels[i+1]['x']) { |
|
399 |
return fmodulo(this.ref_pixels[i]['cap']+(px-this.ref_pixels[i]['x'])/this.ref_pixels[i]['ratio_x'], 360); |
|
400 |
} |
|
401 |
} |
|
402 |
} |
|
403 |
|
|
404 |
this.get_pxx = function(cap) { // recherche du pixel à partir d'un cap. |
|
405 |
var dcap = fmodulo(cap-this.ref_pixels[0]['cap'], 360); |
|
406 |
for (var i=0; i < this.ref_pixels.length; i++) { |
|
407 |
if (i == this.ref_pixels.length - 1 || dcap < fmodulo(this.ref_pixels[i+1]['cap']-this.ref_pixels[0]['cap'], 360)) { |
|
408 |
return this.ref_pixels[i]['x'] + this.ref_pixels[i]['ratio_x']*fmodulo(cap - this.ref_pixels[i]['cap'], 360); |
|
409 |
} |
|
410 |
} |
|
411 |
} |
|
412 |
} |
|
413 |
|
|
414 |
function wheel_zoom (event) { |
|
415 |
var zshift = {x:0, y:0}; |
|
416 |
if (event.pageX != undefined && event.pageX != undefined) { |
|
417 |
zshift.x = event.pageX-canvas.width/2-canvas_pos.x; |
|
418 |
zshift.y = event.pageY-canvas.height/2-canvas_pos.y; |
|
419 |
} |
|
420 |
event.preventDefault(); |
|
421 |
if (event.wheelDelta < 0 && zoom_control.value < zoom_control.max) { |
|
422 |
zoom_control.value++; |
|
423 |
change_zoom(zshift.x, zshift.y); |
|
424 |
} else if (event.wheelDelta > 0 && zoom_control.value > zoom_control.min) { |
|
425 |
zoom_control.value--; |
|
426 |
change_zoom(zshift.x, zshift.y); |
|
427 |
} |
|
428 |
} |
|
429 |
|
|
430 |
function change_zoom(shx, shy) { |
|
431 |
var zoom_control = document.getElementById("zoom_ctrl"); |
|
432 |
var v = zoom_control.value; |
|
433 |
|
|
434 |
prev_zm = zm; |
|
435 |
|
|
436 |
if (zooms[v]) { |
|
437 |
if (!zooms[v].is_updated) zooms[v].refresh(); |
|
438 |
} else { |
|
439 |
zooms[v] = new tzoom(v); |
|
440 |
} |
|
441 |
|
|
442 |
if (zooms[v].is_updated) { |
|
443 |
if (shx == undefined || shy == undefined) { |
|
444 |
shx=0; |
|
445 |
shy=0; |
|
446 |
} |
|
447 |
zm = zooms[v]; |
|
448 |
var px = (last.x+shx)*zm.im.width/prev_zm.im.width - shx; |
|
449 |
var py = (last.y+shy)*zm.im.height/prev_zm.im.height - shy; |
|
450 |
if (py < zm.im.height && py >= 0) { |
|
451 |
zoom = zm.value; |
|
452 |
tile = zm.tile; |
|
453 |
ntiles = zm.ntiles; |
|
454 |
putImage(px, py); |
|
455 |
} else { |
|
456 |
zm = prev_zm; |
|
457 |
zoom_control.value = zm.value; |
|
458 |
} |
|
459 |
} |
|
460 |
} |
|
461 |
|
|
462 |
function change_angle() { |
|
463 |
var elvtn_control = document.getElementById('elvtn_ctrl'); |
|
464 |
var angle_control = document.getElementById('angle_ctrl'); |
|
465 |
var pos_x = zm.im.width*angle_control.value/360; |
|
466 |
var pos_y = Math.floor(zm.im.height/2 - zm.im.width*elvtn_control.value/360); |
|
467 |
putImage(pos_x, pos_y); |
|
468 |
} |
|
469 |
|
|
470 |
function check_links(e) { |
|
471 |
var mouse_x = e.pageX-canvas_pos.x; |
|
472 |
var mouse_y = e.pageY-canvas_pos.y; |
|
473 |
var pos_x = nmodulo(last.x + mouse_x - canvas.width/2, zm.im.width); |
|
474 |
var pos_y = last.y + mouse_y - canvas.height/2; |
|
475 |
for(var i = 0; i < zm.pt_list.length; i++) { |
|
476 |
if (Math.sqrt((zm.pt_list[i]['xc'] - pos_x) * (zm.pt_list[i]['xc'] - pos_x) + (zm.pt_list[i]['yc'] - pos_y) * (zm.pt_list[i]['yc'] - pos_y)) < 20) { |
|
477 |
if (zm.pt_list[i]['lnk'] != undefined) window.location = zm.pt_list[i]['lnk']; |
|
478 |
break; |
|
479 |
} |
|
480 |
} |
|
481 |
} |
|
482 |
|
|
483 |
function display_links(e) { |
|
484 |
var info = document.getElementById('info'); |
|
485 |
var mouse_x = e.pageX-canvas_pos.x; |
|
486 |
var mouse_y = e.pageY-canvas_pos.y; |
|
487 |
var pos_x = nmodulo(last.x + mouse_x - canvas.width/2, zm.im.width); |
|
488 |
var pos_y = last.y + mouse_y - canvas.height/2; |
|
489 |
//var cap = ((pos_x/zm.im.width)*360).toFixed(2); |
|
490 |
var cap = zm.get_cap(pos_x).toFixed(2); |
|
491 |
var elev = (((zm.im.height/2 - pos_y)/zm.im.width)*360 - elevation).toFixed(2); |
|
492 |
info.innerHTML = 'élévation :'+elev+'<br/>cap :'+cap; |
|
493 |
info.style.top = e.pageY+'px'; |
|
494 |
info.style.left = e.pageX+'px'; |
|
495 |
info.style.backgroundColor = '#FFC'; |
|
496 |
canvas.style.cursor='crosshair'; |
|
497 |
for(var i = 0; i < zm.pt_list.length; i++) { |
|
498 |
if (Math.sqrt((zm.pt_list[i]['xc'] - pos_x) * (zm.pt_list[i]['xc'] - pos_x) + (zm.pt_list[i]['yc'] - pos_y) * (zm.pt_list[i]['yc'] - pos_y)) < 20) { |
|
499 |
info.innerHTML = zm.pt_list[i]['label']; |
|
500 |
info.style.backgroundColor = '#FC8'; |
|
501 |
canvas.style.cursor='auto'; |
|
502 |
break; |
|
503 |
} |
|
504 |
} |
|
505 |
} |
|
506 |
|
|
507 |
function hide_links() { |
|
508 |
canvas.removeEventListener( "mousemove", display_links, false); |
|
509 |
var info = document.getElementById('info'); |
|
510 |
info.style.display = 'none'; |
|
511 |
} |
|
512 |
|
|
513 |
function show_links() { |
|
514 |
canvas.addEventListener( "mousemove", display_links, false); |
|
515 |
var info = document.getElementById('info'); |
|
516 |
info.style.display = 'block'; |
|
517 |
} |
|
518 |
|
|
519 |
function show_insert_point(e) { |
|
520 |
event.preventDefault(); |
|
521 |
event.stopPropagation(); |
|
522 |
var insrt = document.getElementById('insert'); |
|
523 |
document.getElementById('do-insert').onclick = function() {insert_point(insert, e.pageX-canvas_pos.x, e.pageY-canvas_pos.y)}; |
|
524 |
document.getElementById('do-cancel').onclick = function() {insert.style.display = 'none'}; |
|
525 |
insrt.style.left = e.pageX+'px'; |
|
526 |
insrt.style.top = e.pageY+'px'; |
|
527 |
insrt.style.display = 'block'; |
|
528 |
} |
|
529 |
|
|
530 |
function insert_point(el, x, y) { |
|
531 |
el.style.display = 'none'; |
|
532 |
for(var i = 0; i < zm.pt_list.length; i++) { |
|
533 |
var label = zm.pt_list[i]['label']; |
|
534 |
if(label == document.getElementById('sel_point').value) { |
|
535 |
var posx = nmodulo(last.x + x - canvas.width/2, zm.im.width)/zm.im.width; |
|
536 |
var posy = 0; |
|
537 |
var pval = {x:posx, cap:zm.pt_list[i]['angle'], y:posy, label:label}; |
|
538 |
ref_points[label] = pval; |
|
539 |
document.getElementById('res').innerHTML += zm.pt_list[i]['label'] + '. ' + posx + '=' + zm.pt_list[i]['angle'] + '<br/>'; |
|
540 |
putImage(last.x, last.y); |
|
541 |
|
|
542 |
// if (ref_points.length > 1) { |
|
543 |
// var pval0 = inserted_points[inserted_points.length-2]; |
|
544 |
// var origin = fmodulo(pval0.angle - ((pval.angle - pval0.angle)/(pval.ratio - pval0.ratio))*pval0.ratio, 360); |
|
545 |
// var end = fmodulo(pval.angle + ((pval.angle - pval0.angle)/(pval.ratio - pval0.ratio))*(1-pval.ratio), 360); |
|
546 |
// document.getElementById('res').innerHTML += 'cap_min = ' + origin + '<br/>'; |
|
547 |
// document.getElementById('res').innerHTML += 'cap_max = ' + end + '<br/>'; |
|
548 |
// } |
|
549 |
break; |
|
550 |
} |
|
551 |
} |
|
552 |
} |
|
553 |
|
|
554 |
function clean_canvas_events(e) { |
|
555 |
canvas.removeEventListener('mousemove', stickImage, false); |
|
556 |
document.getElementById('info').style.display = 'none'; |
|
557 |
speed.x = 0; |
|
558 |
speed.y = 0; |
|
559 |
} |
|
560 |
|
|
561 |
window.onload = function() { |
|
562 |
canvas = document.getElementById("mon-canvas"); |
|
563 |
canvas.style.border = border_width+"px solid red"; |
|
564 |
cntext = canvas.getContext("2d"); |
|
565 |
canvas.width = window.innerWidth-200; |
|
566 |
canvas.height = window.innerHeight-20; |
|
567 |
canvas.addEventListener("click", check_links, false); |
|
568 |
canvas_pos.x = canvas.offsetLeft+border_width; |
|
569 |
canvas_pos.y = canvas.offsetTop+border_width; |
|
570 |
canvas.addEventListener("contextmenu", show_insert_point, false); |
|
571 |
canvas.addEventListener("mouseout", clean_canvas_events, false); |
|
572 |
|
|
573 |
show_links(); |
|
574 |
|
|
575 |
var max_zoom = zooms.length - 1; |
|
576 |
zoom_control = document.getElementById("zoom_ctrl"); |
|
577 |
zoom_control.onchange = change_zoom; |
|
578 |
zoom_control.max = max_zoom; |
|
579 |
if (to_zoom == undefined || to_zoom > max_zoom) to_zoom = Math.floor(max_zoom/2); |
|
580 |
zm = zooms[to_zoom]; |
|
581 |
zoom_control.value = to_zoom; |
|
582 |
zm.refresh(); |
|
583 |
|
|
584 |
zoom = zm.value; |
|
585 |
tile = zm.tile; |
|
586 |
ntiles = zm.ntiles; |
|
587 |
|
|
588 |
angle_control = document.getElementById("angle_ctrl"); |
|
589 |
angle_control.value = to_cap; |
|
590 |
angle_control.onchange = change_angle; |
|
591 |
angle_control.onclick = change_angle; |
|
592 |
angle_control.onkeyup = change_angle; |
|
593 |
elvtn_control = document.getElementById("elvtn_ctrl"); |
|
594 |
elvtn_control.value = to_ele+elevation; |
|
595 |
elvtn_control.onchange = change_angle; |
|
596 |
elvtn_control.onclick = change_angle; |
|
597 |
elvtn_control.onkeyup = change_angle; |
|
598 |
|
|
599 |
change_angle(); |
|
600 |
|
|
601 |
canvas.addEventListener('mousedown', onImageClick, false); |
|
602 |
addEventListener('keyup', keys, false); |
|
603 |
canvas.addEventListener('mousewheel', wheel_zoom, false); |
|
604 |
}; |
js/pano_old.js | ||
---|---|---|
1 |
if (img_prefix == undefined) var img_prefix = './tiles/ttn_mediatheque/mediatheque_70'; |
|
2 |
if (to_cap == undefined) var to_cap = 0; |
|
3 |
if (to_ele == undefined) var to_ele = 0; |
|
4 |
if (cap == undefined) var cap = 0; |
|
5 |
if (elevation == undefined) var elevation = 0; |
|
6 |
if (cap_min == undefined) var cap_min = cap; |
|
7 |
if (cap_max == undefined) var cap_max = cap_min+360; |
|
8 |
|
|
9 |
var inserted_points = new Array(); |
|
10 |
var canvas; |
|
11 |
var cntext; |
|
12 |
var point_list = new Array(); |
|
13 |
var zoom; |
|
14 |
var to_zoom; |
|
15 |
var zooms = new Array(); |
|
16 |
var prev_zm; |
|
17 |
var zm; |
|
18 |
var tile = {width:256, height:256}; |
|
19 |
var ntiles = {x:228, y:9}; |
|
20 |
var border_width = 5; |
|
21 |
var imageObj = new Array(); |
|
22 |
|
|
23 |
var last = {x:0,y:0}; |
|
24 |
var shift = {x:0,y:0}; |
|
25 |
var mouse = {x:0,y:0}; |
|
26 |
var speed = {x:0,y:0}; |
|
27 |
var canvas_pos = {x:0,y:0}; |
|
28 |
var tmt; |
|
29 |
|
|
30 |
var test = {x:0, y:0, i:100}; |
|
31 |
|
|
32 |
function nmodulo(val, div) { // pour obtenir un modulo dans l'espace des nombres naturels N. |
|
33 |
return Math.floor((val%div+div)%div); // il y a peut être plus simple, mais en attendant .... |
|
34 |
} |
|
35 |
|
|
36 |
function fmodulo(val, div) { // pour obtenir un modulo dans l'espace des nombres réels positifs. |
|
37 |
return (val%div+div)%div; // il y a peut être plus simple, mais en attendant .... |
|
38 |
} |
|
39 |
|
|
40 |
function distort_canvas(p, x, y) { |
|
41 |
if (p == 0) distort = 0; |
|
42 |
else { |
|
43 |
cntext.save(); |
|
44 |
distort++; |
|
45 |
cntext.clearRect(0, 0, canvas.width, 2*canvas.height); |
|
46 |
var ratio = (canvas.width-2*distort)/canvas.width; |
|
47 |
var shift = canvas.height/2*(1-ratio); |
|
48 |
cntext.scale(1, ratio); |
|
49 |
if (p == 1) cntext.translate(0, 0); |
|
50 |
else if (p == -1) cntext.translate(0, 0); |
|
51 |
draw_image(x, y); |
|
52 |
cntext.restore(); |
|
53 |
document.getElementById('res').innerHTML = 'distort : ' + distort + ' shift ' + shift + ' ratio : ' + ratio + '<br/>'; |
|
54 |
} |
|
55 |
} |
|
56 |
|
|
57 |
function draw_image(ox, oy) { |
|
58 |
ox = nmodulo(ox-canvas.width/2, zm.im.width); // pour placer l'origine au centre du canvas |
|
59 |
var ocx = nmodulo(ox - zm.phase_pix, zm.im.width); |
|
60 |
//document.getElementById('res').innerHTML = zm.phase_pix + ' -- ' + zm.im.width + ' shift(x,y) ' + shift.x; |
|
61 |
oy = Math.floor(oy-canvas.height/2); // pas de rebouclage vertical |
|
62 |
|
|
63 |
cntext.clearRect(0, 0, canvas.width, canvas.height); |
|
64 |
cntext.fillStyle = "rgba(128,128,128,0.8)"; |
|
65 |
|
|
66 |
if (canvas.height > zm.im.height) { |
|
67 |
var fy = Math.floor((oy+canvas.height/2-zm.im.height/2)/(tile.height*zm.ntiles.y))*zm.ntiles.y; |
|
68 |
if (fy < 0) fy = 0; |
|
69 |
var ly = fy + zm.ntiles.y; |
|
70 |
} else { |
|
71 |
var fy = Math.floor(oy/tile.height); |
|
72 |
var ly = Math.floor((oy+canvas.height+tile.height-1)/tile.height+1); |
|
73 |
if (fy < 0) fy = 0; |
|
74 |
if (ly > zm.ntiles.y) ly = zm.ntiles.y; |
|
75 |
} |
|
76 |
|
|
77 |
for (var j=fy; j<ly; j++) { |
|
78 |
var delta_y = (Math.floor(j/zm.ntiles.y) - Math.floor(fy/zm.ntiles.y)) * (tile.height - zm.last_tile.height); |
|
79 |
var dy = j*tile.height - oy - delta_y; |
|
80 |
var ny = j%ntiles.y; |
|
81 |
var wy = zm.tile.width; |
|
82 |
if (ny == zm.ntiles.y - 1) wy = zm.last_tile.height; |
|
83 |
|
|
84 |
var cpx = 0; |
|
85 |
var i = 0; |
|
86 |
var Nx = zm.ntiles.x; |
|
87 |
if (zm.im.unused_width != 0) Nx++; |
|
88 |
while (cpx < ocx+canvas.width) { |
|
89 |
var cur_width = zm.tile.width; |
|
90 |
if (i%Nx == zm.ntiles.x-1) cur_width = zm.last_tile.width; |
|
91 |
else if (i%Nx == Nx-1) cur_width = zm.im.unused_width; |
|
92 |
if (cpx >= ocx-cur_width) { |
|
93 |
if (i%Nx == Nx-1 && zm.im.unused_width != 0) { |
|
94 |
cntext.fillRect(cpx-ocx, dy, zm.im.unused_width, wy); |
|
95 |
} else { |
|
96 |
var nx = i%Nx; |
|
97 |
load_image(nx, ny, cpx-ocx, dy, ox, oy); |
|
98 |
} |
|
99 |
} |
|
100 |
cpx += cur_width; |
|
101 |
i++; |
|
102 |
} |
|
103 |
} |
|
104 |
drawDecorations(ox, oy); |
|
105 |
} |
|
106 |
|
|
107 |
function load_image(nx, ny, ox, oy, x, y) { |
|
108 |
var idx = nx+'-'+ny+'-'+zoom; |
|
109 |
if (imageObj[idx] && imageObj[idx].complete) { |
|
110 |
draw_tile(idx, ox, oy); // l'image est déja en mémoire, on force le dessin sans attendre. |
|
111 |
} else { |
|
112 |
var fname = get_file_name(nx, ny, zoom); |
|
113 |
imageObj[idx] = new Image(); |
|
114 |
imageObj[idx].src = fname; |
|
115 |
var ts = zm.get_tile_size(nx, ny); |
|
116 |
cntext.fillRect(ox, oy, ts.width, ts.height); |
|
117 |
var dx = shift.x; |
|
118 |
var dy = shift.y; |
|
119 |
imageObj[idx].addEventListener('load', function() {draw_tile_del(zoom, dx, dy, idx, ox, oy, x, y)}, false); |
|
120 |
} |
|
121 |
} |
|
122 |
|
|
123 |
function draw_tile_del(ezoom, dx, dy, idx, ox, oy, x, y) { |
|
124 |
if (ezoom == zoom && dx == shift.x && dy == shift.y) { |
|
125 |
draw_tile(idx, ox, oy); |
|
126 |
drawDecorations(x, y); |
|
127 |
} |
|
128 |
} |
|
129 |
|
|
130 |
function draw_tile(idx, ox, oy) { |
|
131 |
var img = imageObj[idx]; |
|
132 |
cntext.drawImage(img, ox, oy); |
|
133 |
} |
|
134 |
|
|
135 |
function drawDecorations(ox, oy) { |
|
136 |
var wgrd = zm.im.width/360; |
|
137 |
var od = ((ox+canvas.width/2)/wgrd)%360; |
|
138 |
var el = (zm.im.height/2 - (oy+canvas.height/2))/wgrd; |
|
139 |
// document.getElementById('angle_ctrl').value = od.toFixed(2); |
|
140 |
// document.getElementById('elvtn_ctrl').value = el.toFixed(2); |
|
141 |
cntext.fillStyle = "rgba(0,128,128,0.9)"; |
|
142 |
cntext.strokeStyle = "rgb(255,255,255)"; |
|
143 |
cntext.lineWidth = 1; |
|
144 |
cntext.fillRect(canvas.width/2-5, canvas.height/2-5, 10, 10); |
|
145 |
cntext.strokeRect(canvas.width/2-5, canvas.height/2-5, 10, 10); |
|
146 |
for(var i = 0; i < zm.pt_list.length; i++) { |
|
147 |
var cx = zm.pt_list[i]['xc'] - ox; |
|
148 |
var cy = zm.pt_list[i]['yc'] - oy; |
|
149 |
if (zm.pt_list[i]['lnk'] != undefined) cntext.fillStyle = "rgba(255,128,128,0.5)"; |
|
150 |
else cntext.fillStyle = "rgba(128,255,128,0.5)"; |
|
151 |
cntext.beginPath(); |
|
152 |
cntext.arc(cx, cy, 20, 0, 2*Math.PI, true); |
|
153 |
cntext.fill(); |
|
154 |
} |
|
155 |
|
|
156 |
//cntext.font = "20pt Arial"; |
|
157 |
//cntext.fillRect(0, 0, 200, 20); |
|
158 |
//cntext.fillStyle = "rgb(255,0,0)"; |
|
159 |
//cntext.fillText(od.toFixed(2), 5, 20); |
|
160 |
//for (i=0; i<canvas.width/wgrd; i++) { |
|
161 |
//cntext.strokeRect(i*wgrd, 0, wgrd, 20); |
|
162 |
//} |
|
163 |
} |
|
164 |
|
|
165 |
function get_file_name(x, y, z) { // recherche du fichier correspondant au zoom et à la position |
|
166 |
var prm = [z, x, y]; |
|
167 |
var fname = img_prefix; |
|
168 |
for (var i = 0; i < prm.length; i++) { |
|
169 |
fname += '_'; |
|
170 |
if (prm[i] < 10) fname += '00'; |
|
171 |
else if (prm[i] < 100) fname += '0'; |
|
172 |
fname += prm[i]; |
|
173 |
} |
|
174 |
fname += '.jpg'; |
|
175 |
return fname; |
|
176 |
} |
|
177 |
|
|
178 |
function keys(key) { |
|
179 |
event.preventDefault(); |
|
180 |
event.stopPropagation(); |
|
181 |
if (!key) { |
|
182 |
key = event; |
|
183 |
key.which = key.keyCode; |
|
184 |
} |
|
185 |
evt = key || event; |
|
186 |
// alert(key); |
|
187 |
// if (!evt.shiftKey) return; |
|
188 |
switch (key.which) { |
|
189 |
case 36: // home |
|
190 |
test.x=0; |
|
191 |
test.y=0; |
|
192 |
putImage(test.x, test.y); |
|
193 |
return; |
|
194 |
case 66: // b |
|
195 |
alert(key.pageX); |
|
196 |
test.x=tile.width*(ntiles.x-3); |
|
197 |
test.y=0; |
|
198 |
putImage(test.x, test.y); |
|
199 |
return; |
|
200 |
case 67: // c |
|
201 |
test.x=0; |
|
202 |
test.y=tile.height*(ntiles.y-3); |
|
203 |
putImage(test.x, test.y); |
|
204 |
return; |
|
205 |
case 35: // end |
|
206 |
test.x=tile.width*(ntiles.x-3); |
|
207 |
test.y=tile.height*(ntiles.y-3); |
|
208 |
putImage(test.x, test.y); |
|
209 |
return; |
|
210 |
case 39: // left |
|
211 |
test.x+=test.i; |
|
212 |
putImage(test.x, test.y); |
|
213 |
return; |
|
214 |
case 40: // up |
|
215 |
test.y+=test.i; |
|
216 |
putImage(test.x, test.y); |
|
217 |
return; |
|
218 |
case 37: // right |
|
219 |
test.x-=test.i; |
|
220 |
putImage(test.x, test.y); |
|
221 |
return; |
|
222 |
case 38: // down |
|
223 |
test.y-=test.i; |
|
224 |
putImage(test.x, test.y); |
|
225 |
return; |
|
226 |
case 33: // pageup |
|
227 |
test.y=0; |
|
228 |
putImage(test.x, test.y); |
|
229 |
return; |
|
230 |
case 34: // pagedown |
|
231 |
test.y=tile.height*(ntiles.y-3); |
|
232 |
putImage(test.x, test.y); |
|
233 |
return; |
|
234 |
default: |
|
235 |
//alert(key.which) |
|
236 |
return; |
|
237 |
} |
|
238 |
} |
|
239 |
|
|
240 |
function onImageClick(e) { |
|
241 |
shift.x = last.x; |
|
242 |
shift.y = last.y; |
|
243 |
speed.x = 0; |
|
244 |
speed.y = 0; |
|
245 |
mouse.x = e.pageX; |
|
246 |
mouse.y = e.pageY; |
|
247 |
clearTimeout(tmt); //arrêt de l'éffet eventuel d'amorti en cours. |
|
248 |
canvas.addEventListener('mousemove', stickImage, false); |
|
249 |
canvas.addEventListener('mouseup', launchImage, false); |
|
250 |
//canvas.addEventListener('mouseout', launchImage, false); |
|
251 |
canvas.style.cursor='move'; |
|
252 |
//document.onmousemove = stickImage; |
|
253 |
document.onmouseup = launchImage; |
|
254 |
hide_links(); |
|
255 |
} |
|
256 |
|