Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees · Pull Request #1 · jsmarkus/ExamplesByMesh · GitHub
Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' CHG: retrieveInBounds now supports non-point (bounds) QuadTrees · Pull Request #1 · jsmarkus/ExamplesByMesh · GitHub
Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' CHG: retrieveInBounds now supports non-point (bounds) QuadTrees · Pull Request #1 · jsmarkus/ExamplesByMesh · GitHub
Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' CHG: retrieveInBounds now supports non-point (bounds) QuadTrees · Pull Request #1 · jsmarkus/ExamplesByMesh · GitHub
Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' CHG: retrieveInBounds now supports non-point (bounds) QuadTrees · Pull Request #1 · jsmarkus/ExamplesByMesh · GitHub
Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' CHG: retrieveInBounds now supports non-point (bounds) QuadTrees · Pull Request #1 · jsmarkus/ExamplesByMesh · GitHub
Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); CHG: retrieveInBounds now supports non-point (bounds) QuadTrees · Pull Request #1 · jsmarkus/ExamplesByMesh · GitHub
Skip to content

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees - #1

Merged
jsmarkus merged 1 commit into
masterfrom
unknown repository
Mar 9, 2012
Merged

CHG: retrieveInBounds now supports non-point (bounds) QuadTrees#1
jsmarkus merged 1 commit into
masterfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 9, 2012

Copy link
Copy Markdown

No description provided.

jsmarkus pushed a commit that referenced this pull request Mar 9, 2012
CHG: retrieveInBounds now supports non-point (bounds) QuadTrees
@jsmarkus
jsmarkus merged commit 1b42ccd into jsmarkus:masterMar 9, 2012
@jsmarkus

Copy link
Copy Markdown
Owner

I have merged, but i have no time now to test. Did you make any tests or demos on your version of retrieveInBounds() method?

@ghost

ghost commented Mar 9, 2012

Copy link
Copy Markdown
Author

I crudely tested by switching out line 100 of retrieve_bounds.js with a call to retrieveInBounds, however without a visual clue of the bounds being tested for on click, it wasn't the nicest demo. I'll have a look at how I might demo your method with my additions, assuming you don't beat me to it in the next day or two!

@ghost

Copy link
Copy Markdown
Author

I've written a demo page which shows both points and bounds working with retrieveInBounds. Thanks for replying so quick!

@jsmarkus

Copy link
Copy Markdown
Owner

Thanks, I'll look it through when i have some free time.

Depending on how you are going to use this quad-tree index, i have to warn you about some problems. First - if you are going to index small clusters of objects on a huge surface (e.g. GPS-coordinates of objects in a single town against entire Earth) get ready to the fact that the tree will significantly grow in depth. It makes queries almost as expensive as direct scan...

Second - this index has no method to be correctly updated, i.e. you cannot rebuild it when one object's coordinates are changed. It makes it unuseful in realtime collision-detection. In collisions demo the tree was updated by clearing it all and adding all the objects. It is not acceptable in real-life game development...


For fast GPS clustering (in my company's project) i have made another index - "zone tree", but i am not sure that i can release it open-source. If you are interested i can tell you an idea how it should work.

@ghost

Copy link
Copy Markdown
Author

For my purposes (a platform game), it's perfect for what I'm planning to do. It's definitely far faster than linear searches. I can only imagine the challenges you've had to face, but until I design a game that big (!!), I think I'm good with QuadTree for now. =)

@jsmarkus

Copy link
Copy Markdown
Owner

OK, i see.
Any plans to implement updateNode or deleteNode methods?

@ghost

Copy link
Copy Markdown
Author

I'm toying with the delete presently, but without QuadTree remembering the node an item was added to, nor the parent for a node, it would be slow. These issues have to be delt with before we can affect a proper delete which merges nodes back together as needed. All do-able, just time needed to change everything and test. Sigh, I'm soooo missing unit tests!

@jsmarkus

Copy link
Copy Markdown
Owner

why missing? you may use http://visionmedia.github.com/mocha/ for example...

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jsmarkus