123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <!DOCTYPE html>
- <html>
- <!--
- Copyright 2008 The Closure Library Authors. All Rights Reserved.
- Use of this source code is governed by the Apache License, Version 2.0.
- See the COPYING file for details.
- -->
- <head>
- <title>QuadTree Demo</title>
- <script src="../base.js"></script>
- <script>
- goog.require('goog.structs');
- goog.require('goog.events');
- goog.require('goog.structs.QuadTree');
- </script>
- <style>
- .region {
- position: absolute;
- -moz-outline: 1px solid #CCC;
- outline: 1px solid #CCC;
- z-index: 500;
- }
- .point {
- position: absolute;
- background-color: red;
- width: 4px;
- height: 4px;
- z-index: 1000;
- }
- #el {
- width: 500px;
- height: 500px;
- background-color: #FCFCFC;
- }
- #values {
- font-size: small;
- }
- #info {
- position: absolute;
- top: 5px;
- left: 505px;
- width: 200px;
- font: normal 11px verdana;
- }
- </style>
- </head>
- <body>
- <div id="el"></div>
- <div id="info">
- <p>Click on the area to the left to add a point to the quadtree, clicking on
- a point will remove it from the tree.</p>
- <pre id="values"></pre>
- </div>
- <script>
- function visualize(node) {
- var div = document.createElement('div');
- div.className = 'region';
- div.style.top = node.y + 'px';
- div.style.left = node.x + 'px';
- div.style.width = node.w+ 'px';
- div.style.height = node.h + 'px';
- if (node.nodeType == goog.structs.QuadTree.NodeType.POINTER) {
- visualize(node.nw, div);
- visualize(node.ne, div);
- visualize(node.sw, div);
- visualize(node.se, div);
- } else if (node.nodeType == goog.structs.QuadTree.NodeType.LEAF) {
- var point = document.createElement('div');
- point.className = 'point';
- point.style.top = (node.point.y - 2) + 'px';
- point.style.left = (node.point.x - 2) + 'px'
- point.text = node.point.value;
- point.point = node.point;
- document.getElementById('el').appendChild(point);
- }
- document.getElementById('el').appendChild(div);
-
- var values = ['Values:'];
- qt.forEach(function(value, coord) {
- values.push(coord + ' ' + value);
- });
- document.getElementById('values').innerHTML = values.join('\n');
- }
- var maxW = 500, maxH = 500;
- var qt = new goog.structs.QuadTree(0, 0, maxW, maxH);
- visualize(qt.getRootNode());
- goog.events.listen(document.body, 'click', function(e) {
- if (e.target.className == 'point') {
- qt.remove(e.target.point.x, e.target.point.y);
- } else {
- var x = e.clientX;
- var y = e.clientY;
- if (x < maxW && y < maxH) qt.set(x, y, new Date().toLocaleString());
- }
- var el = document.getElementById('el');
- el.innerHTML = '';
- visualize(qt.getRootNode());
- });
- </script>
- </body>
- </html>
|