{"id":302,"date":"2018-02-26T18:56:28","date_gmt":"2018-02-26T18:56:28","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=302"},"modified":"2018-03-03T17:07:20","modified_gmt":"2018-03-03T17:07:20","slug":"quadtree","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/","title":{"rendered":"Quadtree"},"content":{"rendered":"<p>Tekrar merhaba arkada\u015flar C++ ile ilgili olan yaz\u0131lar\u0131m\u0131za biraz ara verip bug\u00fcn gerek oyunlarda, gerek co\u011frafi bilgi sistemlerinde, gerekse arazi g\u00f6rselle\u015ftirmesi, resim i\u015fleme ve bunun gibi bir \u00e7ok alanda kullan\u0131lan bir veri yap\u0131s\u0131ndan k\u0131saca bahsetmek istiyorum: &#8220;<a href=\"https:\/\/www.wikiwand.com\/en\/Quadtree\">Quadtree<\/a>&#8220;. Bu veri yap\u0131s\u0131n\u0131n detaylar\u0131na \u00e7ok girmeden \u00f6nce &#8220;Spatial Data Structrues&#8221; ve &#8220;Spatial Partitioning&#8221; denilen yani Uzaysal Veri Yap\u0131lar\u0131 ve Uzaysal B\u00f6l\u00fcmleme konusunu bir bakal\u0131m.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Giri\u015f<\/span><\/strong><\/h2>\n<p>Bu tarz veri yap\u0131lar\u0131n\u0131n en \u00f6nemli amac\u0131 gerek g\u00f6rselle\u015ftirme gerek fizik i\u015flemleri gerekse arama gibi i\u015flerde yap\u0131lan kar\u015f\u0131la\u015ft\u0131rma miktar\u0131n\u0131 d\u00fc\u015f\u00fcrmektedir (Bu s\u00f6z\u00fc unutmay\u0131n nas\u0131l sorusu bir sonraki ba\u015fl\u0131kta). Genel olarak hiyerar\u015fik bir do\u011faya sahiptirler. Verinin yap\u0131s\u0131na da\u011f\u0131l\u0131m\u0131na ve kullan\u0131m alan\u0131na g\u00f6re kullan\u0131lacak veri yap\u0131s\u0131 belirlenir. \u00d6rne\u011fin 2B noktasal veriler i\u00e7in &#8220;Grid&#8221; veya &#8220;<a href=\"https:\/\/www.wikiwand.com\/en\/Quadtree\">Quadtree<\/a>&#8221; daha \u00f6ncelikli tercih edilmesi gerekirken 3 \u0130\u00e7 ortamlar i\u00e7in &#8220;<a href=\"https:\/\/www.wikiwand.com\/en\/BSP_tree\">BSP Tree<\/a>&#8221; veri yap\u0131s\u0131 \u00f6rne\u011fin Octree&#8217;ye g\u00f6re daha \u00f6ncelikle tercih edilmelidir.<\/p>\n<p>A\u015fa\u011f\u0131da \u00f6rnek bir Octree g\u00f6rebilirsiniz:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/20\/Octree2.svg\/1200px-Octree2.svg.png\" alt=\"Image result for spatial partitioning octrees\" width=\"401\" height=\"230\" \/><\/p>\n<p>A\u015fa\u011f\u0131da \u00f6rnek bir BSP Tree g\u00f6rebilirsiniz:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/player.slideplayer.com\/21\/6318865\/data\/images\/img36.jpg\" width=\"179\" height=\"180\" \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/player.slideplayer.com\/21\/6318865\/data\/images\/img37.jpg\" width=\"309\" height=\"151\" \/><\/p>\n<h2><strong><span style=\"color: #0000ff;\">Quadtree<\/span><\/strong><\/h2>\n<p>\u015eimdi gelelim yaz\u0131m\u0131z\u0131n solistine yani Quadtree&#8217;ye. Quadtree&#8217;ler temel olarak 2B uzay\u0131n e\u015fit bir \u015fekilde 4 e b\u00f6l\u00fcnmesine dayan\u0131r. Yani her bir a\u011fa\u00e7 d\u00fc\u011f\u00fcm\u00fc (node) 4 \u00e7ocuk d\u00fc\u011f\u00fcm i\u00e7erir ve genel olarak ilgilenilen veriler en alt seviyedeki (&#8220;leaf&#8221;) d\u00fc\u011f\u00fcmlerinde tutulur. B\u00f6l\u00fcmleme genel olarak her bir d\u00fc\u011f\u00fcm i\u00e7in tutulacak olan nesne adeti a\u015f\u0131ld\u0131\u011f\u0131nda ger\u00e7ekle\u015fir ve bu durumda a\u011fa\u00e7 d\u00fc\u011f\u00fcm\u00fc bir kez daha b\u00f6l\u00fcn\u00fcr ve nesnelere bu d\u00fc\u011f\u00fcmlere da\u011f\u0131t\u0131l\u0131r. Genel olarak eklenen nesneler karesel olarak ilgili d\u00fc\u011f\u00fcmlerin s\u0131n\u0131rlar\u0131 ile kar\u015f\u0131la\u015ft\u0131r\u0131larak da\u011f\u0131t\u0131l\u0131rlar. A\u015fa\u011f\u0131daki fig\u00fcr veri yap\u0131s\u0131n\u0131 kafan\u0131zda canland\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Her seviye bir \u00f6nceki ile ayn\u0131 s\u0131n\u0131rlara sahip olsa da, elemanlar\u0131n da\u011f\u0131t\u0131labilece\u011fi d\u00fc\u011f\u00fcm say\u0131s\u0131 alt seviyelere indik\u00e7e artmaktad\u0131r. Genel olarak bu derinlik sabit bir say\u0131 olarak belirlenir.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.i-programmer.info\/images\/stories\/Core\/Theory\/QuadTrees\/Tree3D.png\" width=\"248\" height=\"292\" \/><\/p>\n<p>Yukar\u0131daki fig\u00fcrden de anla\u015f\u0131laca\u011f\u0131 \u00fczere asl\u0131nda Quadtree&#8217;ler 4 \u00e7ocuklu bir a\u011fa\u00e7 olarak ta d\u00fc\u015f\u00fcn\u00fclebilirler. A\u015fa\u011f\u0131da bu minvaldeki fig\u00fcr\u00fc g\u00f6rebilirsiniz.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.i-programmer.info\/images\/stories\/Core\/Theory\/QuadTrees\/Tree2D.png\" alt=\"Tree2D\" \/><\/p>\n<p>Wikipedia dan \u00f6\u011frendi\u011fimiz kadar\u0131 ile bu veri yap\u0131s\u0131 ilk defa 197 y\u0131l\u0131nda Raphael Finkel ve J. L. Bentley taraf\u0131ndan Q-Tree olarak adland\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p><a href=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Bulanlar.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-306\" src=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Bulanlar-300x229.png\" alt=\"\" width=\"300\" height=\"229\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Bulanlar-300x229.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Bulanlar-150x114.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Bulanlar-200x153.png 200w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Bulanlar.png 384w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Asl\u0131nda bu anlamda yukar\u0131da bahsetti\u011fimiz gibi &#8220;Binary Tree&#8221;&#8216;ye olduk\u00e7a benzemektedir, sadece iki \u00e7ocuk yerine d\u00f6rt \u00e7ocu\u011fa sahiptir. Bir \u00e7ok farkl\u0131 varyasonu vard\u0131r (yaz\u0131m\u0131n sonunda bir ka\u00e7\u0131na de\u011finece\u011fim), quadtree&#8217;ler i\u00e7erdikleri veri tiplerine g\u00f6re (nokta, \u00e7izgi veya poligon) s\u0131n\u0131fland\u0131r\u0131labilmektedirler. 3B uzay\u0131 d\u00fczg\u00fcn bir \u015fekilde b\u00f6lmek i\u00e7in ise Octree veri yap\u0131s\u0131 kullan\u0131lmaktad\u0131r. Bu veri yap\u0131s\u0131 da uzay\u0131 e\u015fit 8 par\u00e7aya b\u00f6lmekte ve a\u011fr\u0131l\u0131kl\u0131 olarak 3B nesneler i\u00e7in kullan\u0131lmaktad\u0131r. Bir de daha genelle\u015ftirilmi\u015f olan kd-tree&#8217;ler vard\u0131r ki. Buna da ayr\u0131 bir yaz\u0131 ay\u0131rmay\u0131 planl\u0131yorum.<\/p>\n<p>\u015eimdi gelelim yaz\u0131m\u0131z\u0131n ba\u015f\u0131nda bahsetti\u011fim &#8220;yap\u0131lan kar\u015f\u0131la\u015ft\u0131rma miktar\u0131n\u0131 d\u00fc\u015f\u00fcrmektedir&#8221; ifadesinin Quadtree&#8217;ler i\u00e7in nas\u0131l i\u015fledi\u011fine. Bunu basit bir \u00f6rnek \u00fczerinden a\u00e7\u0131klamaya \u00e7al\u0131\u015faca\u011f\u0131m:<\/p>\n<p><a href=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-305 size-full\" src=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek.png\" alt=\"\" width=\"797\" height=\"396\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek.png 797w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek-300x149.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek-768x382.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek-500x248.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek-150x75.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek-400x199.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/02\/Ornek-200x99.png 200w\" sizes=\"auto, (max-width: 797px) 100vw, 797px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u015eimdi yukar\u0131da verildi\u011fi gibi 6 adet nesnemizin oldu\u011fu 2 boyutlu bir d\u00fcnya d\u00fc\u015f\u00fcnelim. Amac\u0131m\u0131z ekran\u0131m\u0131za giren nesneleri g\u00f6r\u00fcnt\u00fclemek. Mevcut ekran\u0131m\u0131zda k\u0131rm\u0131z\u0131 noktal\u0131 dikd\u00f6rtgen ile g\u00f6sterilsin.<\/p>\n<p>\u015eimdi Quadtree kullanmad\u0131\u011f\u0131m\u0131z durumda hangi noktalar\u0131n g\u00f6sterilmesi gerekti\u011fini anlamak i\u00e7in b\u00fct\u00fcn noktalar ile bu ekran\u0131n kapsad\u0131\u011f\u0131n\u0131 alan\u0131 kar\u015f\u0131la\u015ft\u0131rmam\u0131z gerekiyor. Bu da 6 kar\u015f\u0131la\u015ft\u0131rma demek. Quadtree kulland\u0131\u011f\u0131m\u0131z durumda ise mevcut ekran\u0131m\u0131z quadtree&#8217;nin sol \u00fcst d\u00fc\u011f\u00fcm\u00fc ile kesi\u015fti\u011fi i\u00e7in sadece bu d\u00fc\u011f\u00fcme bakmam\u0131z yeterli ve bu durumda da sadece 1 kar\u015f\u0131la\u015ft\u0131rma yetiyor. Ortalama \u015fartlara bakt\u0131\u011f\u0131m\u0131zda quadtree ve genel olarak bu tarz uzay b\u00f6l\u00fcmleme veri yap\u0131lar\u0131 bu noktada b\u00fcy\u00fck avantaj sa\u011flamakta.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Quadtree Operasyonlar\u0131<\/span><\/strong><\/h2>\n<p>Ekleme (&#8220;Insertion&#8221;)<\/p>\n<ul>\n<li>Eklenecek olan nesneyi i\u00e7erecek (yani karesel alan\u0131, quadtree d\u00fc\u011f\u00fcm\u00fc s\u0131n\u0131rlar\u0131 i\u00e7erisinde kalacak) dip (&#8220;Leaf&#8221;) d\u00fc\u011f\u00fcm\u00fc bulunana kadar &#8220;recursive&#8221; olarak ilerlenir,<\/li>\n<li>Daha sonra ilgili d\u00fc\u011f\u00fcme nesne eklenir,<\/li>\n<li>E\u011fer nesnenin eklendi\u011fi d\u00fc\u011f\u00fcmdeki nesne adeti izin verilen s\u0131n\u0131rlar i\u00e7erisinde ise i\u015flem tamamlan\u0131r,<\/li>\n<li>E\u011fer nesnenin eklendi\u011fi d\u00fc\u011f\u00fcmdeki nesne adeti izin verilen s\u0131n\u0131r\u0131 a\u015far ise ilgili d\u00fc\u011f\u00fcm tekrar d\u00f6rde b\u00f6l\u00fcn\u00fcr ve nesneler bu d\u00fc\u011f\u00fcmlere da\u011f\u0131t\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Silme (&#8220;Delete&#8221;)<\/p>\n<ul>\n<li>Silinecek olan nesneyi i\u00e7erecek dip (&#8220;Leaf&#8221;) d\u00fc\u011f\u00fcm\u00fc bulunana kadar &#8220;recursive&#8221; olarak ilerlenir,<\/li>\n<li>Daha sonra ilgili d\u00fc\u011f\u00fcmden nesne silinir.<\/li>\n<\/ul>\n<p>Sorgulama (&#8220;Query&#8221;)<\/p>\n<ul>\n<li>K\u00f6k d\u00fc\u011f\u00fcmden ba\u015flanarak ilgili nesne ile d\u00fc\u011f\u00fcm\u00fcn s\u0131n\u0131rlar\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r ve kesi\u015fen d\u00fc\u011f\u00fcme kadar &#8220;recursive&#8221; olarak ilerlenir.<\/li>\n<li>E\u011fer kesi\u015fen bir d\u00fc\u011f\u00fcm bulunur ise o d\u00fc\u011f\u00fcmdeki b\u00fct\u00fcn nesneler kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r.<\/li>\n<li>Benzer \u015fekilde verilen d\u00f6rtgensel bir alan ile kesi\u015fen elemanlar da bu \u015fekilde bulunabilir.<\/li>\n<\/ul>\n<h2><strong><span style=\"color: #0000ff;\">\u00d6rnek Quadtree<\/span><\/strong><\/h2>\n<p>\u015eimdi gelelim temel bir Quadtree s\u0131n\u0131f\u0131na. Her veri yap\u0131s\u0131nda oldu\u011fu gibi bu veri yap\u0131s\u0131 da \u00f6zel<br \/>\nihtiya\u00e7lar do\u011frultusundan \u00f6zelle\u015ftirilebilir ve de \u00f6zelle\u015ftirilmelidir. Fakat ilk iterasyonda sizlere temel bir \u00e7ok uygulama i\u00e7in ihtiyac\u0131n\u0131z kar\u015f\u0131layacak ve genel quadtree mant\u0131\u011f\u0131n\u0131 anlatacak bir \u00f6rnek verece\u011fim. Bu \u00f6rne\u011fi baz alarak kendi ihtiya\u00e7lar\u0131n\u0131z do\u011frultusunda bu veri yap\u0131s\u0131n\u0131 g\u00fcncelleyebilirsiniz.<\/p>\n<ul>\n<li>\u00d6rnek uygulamada g\u00f6rselle\u015ftirme i\u00e7in SFML kulland\u0131m. SFML ile ilgili k\u00fct\u00fcphanelerini\u00a0<a href=\"https:\/\/github.com\/yazilimperver\/ProjectTemplates\/tree\/master\/Ext\">https:\/\/github.com\/yazilimperver\/ProjectTemplates\/tree\/master\/Ext<\/a>\u00a0adresinden al\u0131p .sln dizinine yine Ext olarak kopyalayabilirsiniz,<\/li>\n<li>Visual Studio projesi i\u00e7in ise\u00a0<a href=\"https:\/\/github.com\/yazilimperver\/DataStructures\">https:\/\/github.com\/yazilimperver\/DataStructures<\/a> &#8220;repository&#8221; sini alarak uygulamay\u0131 olu\u015fturabilirsiniz.<\/li>\n<li>A\u015fa\u011f\u0131da Quadtree s\u0131n\u0131f\u0131na ili\u015fkin .h\/.cpp dosyalar\u0131n\u0131 bulabilirsiniz. Kod i\u00e7erisindeki a\u00e7\u0131klamalar sizlere yard\u0131mc\u0131 olacakt\u0131r.<\/li>\n<\/ul>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">\/\/! Temel olarak kullanacagimiz quadtree sinifimiz\r\n\/\/! Mevcut quadtree icerisindeki nesneler de sf::FloatRect'tir\r\nclass BasicQuadtree\r\n{\r\npublic:\r\n    BasicQuadtree(int32_t level, const sf::FloatRect&amp; boundary);\r\n        \r\n    \/\/! Recursive olarak butun cocuklari temizler\r\n    void Clear();\r\n\r\n    \/\/! Bu metot ile mevcut quadtree node'u dorde bolunur ve her biri icin yeni sinirlar belirlenir\r\n    void Split();\r\n\r\n    \/\/! Verilen rectangle' icerisinde barindirabilecek olan cocuk dugumun indeksi. \r\n    \/\/! Eger herhangi bir cocuk dugume girmez ise -1 donulur ve ebeveyn dugum icerisine yerlestirilir\r\n    int32_t GetIndex(const sf::FloatRect&amp; rect);\r\n\r\n    \/\/! Eger eklendikten sonra bu dugum izin verilenden fazla nesne iceriyor ise bolumleme yapilir ve butun cocuklar dagitilir\r\n    void Insert(const sf::FloatRect&amp; rect);\r\n\r\n    \/\/! Verilen pRect ile kesisen butun nesneleri don\r\n    void Retrieve(std::vector&lt;sf::FloatRect&gt;&amp; returnedObjects, const sf::FloatRect&amp; pRect);\r\n\r\n    \/\/! Verilen indeksi temsil eden cocuk dugum donulur\r\n    BasicQuadtree* GetChildNode(int32_t index);\r\n\r\n    \/\/! Mevcut dugumun sinirlari donulur\r\n    sf::FloatRect GetBoundary() const;\r\n\r\n    \/\/! Mevcut dugumun derinligi donulur\r\n    uint32_t GetCurrentLevel() const;\r\n\r\n    \/\/! Bu dugumdeki nesneler donulur\r\n    const std::vector&lt;sf::FloatRect&gt;&amp; GetObjects();\r\nprotected:\r\n    \/\/! Bu dugumun bulundugu seviye. 0 en ust seviye anlamina gelir\r\n    uint32_t mCurrentLevel = 0;\r\n\r\n    \/\/! Bu dugumde tutulan nesneler\r\n    std::vector&lt;sf::FloatRect&gt; mObjects;\r\n\r\n    \/\/! Bu dugumun sinirlari\r\n    sf::FloatRect mBoundary;\r\n\r\n    \/\/! Cocuk dugumler\r\n    \/\/! 0 =&gt; Sag ust, 1 =&gt; Sol ust, 2 =&gt; Sol alt, 3 =&gt; Sag alt\r\n    std::unique_ptr&lt;BasicQuadtree&gt; mChildNodes[4];\r\n};<\/pre>\n<p>\u0130lgili quadtree s\u0131n\u0131f\u0131n\u0131n .cpp dosyas\u0131na da a\u015fa\u011f\u0131dan ula\u015fabilirsiniz.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">#include &lt;BasicQuadtree.h&gt;\r\n\r\nBasicQuadtree::BasicQuadtree(int32_t level, const sf::FloatRect&amp; boundary)\r\n{\r\n    mCurrentLevel = level;\r\n    mBoundary = boundary;\r\n}\r\n\r\nvoid BasicQuadtree::Clear()\r\n{\r\n    mObjects.clear();\r\n\r\n    for (auto&amp; node : mChildNodes)\r\n    {\r\n        node = nullptr;\r\n    }\r\n}\r\n\r\nvoid BasicQuadtree::Split()\r\n{\r\n    float subWidth = mBoundary.width \/ 2.0F;\r\n    float subHeight = mBoundary.height \/ 2.0F;\r\n\r\n    float x = mBoundary.left;\r\n    float y = mBoundary.top;\r\n\r\n    \/\/ Cocuk dugumler icin yer alalim\r\n    mChildNodes[0] = std::make_unique&lt;BasicQuadtree&gt;(mCurrentLevel + 1, sf::FloatRect(x + subWidth, y, subWidth, subHeight));\r\n    mChildNodes[1] = std::make_unique&lt;BasicQuadtree&gt;(mCurrentLevel + 1, sf::FloatRect(x, y, subWidth, subHeight));\r\n    mChildNodes[2] = std::make_unique&lt;BasicQuadtree&gt;(mCurrentLevel + 1, sf::FloatRect(x, y + subHeight, subWidth, subHeight));\r\n    mChildNodes[3] = std::make_unique&lt;BasicQuadtree&gt;(mCurrentLevel + 1, sf::FloatRect(x + subWidth, y + subHeight, subWidth, subHeight));\r\n}\r\n\r\nint32_t BasicQuadtree::GetIndex(const sf::FloatRect&amp; rect)\r\n{\r\n    int32_t index = -1;\r\n    float verticalMidpoint = mBoundary.left+ (mBoundary.width \/ 2);\r\n    float horizontalMidpoint = mBoundary.top + (mBoundary.height \/ 2);\r\n\r\n    \/\/ Verilen nesne ust bolumler icerisinde kaliyor mu\r\n    bool topQuadrant = (rect.top &lt; horizontalMidpoint) &amp;&amp; ((rect.top + rect.height) &lt; horizontalMidpoint);\r\n\r\n    \/\/ Verilen nesne alt bolumler icerisinde kaliyor mu\r\n    bool bottomQuadrant = (rect.top &gt; horizontalMidpoint);\r\n\r\n    \/\/ Verilen nesne sol bolumler icerisinde kaliyor mu\r\n    if ((rect.left&lt; verticalMidpoint)\r\n        &amp;&amp;\r\n        (rect.left+ rect.width &lt; verticalMidpoint))\r\n    {\r\n        if (topQuadrant)\r\n        {\r\n            index = 1;\r\n        }\r\n        else if (bottomQuadrant)\r\n        {\r\n            index = 2;\r\n        }\r\n    }\r\n    \/\/ Verilen nesne sag bolumler icerisinde kaliyor mu\r\n    else if (rect.left&gt; verticalMidpoint)\r\n    {\r\n        if (topQuadrant)\r\n        {\r\n            index = 0;\r\n        }\r\n        else if (bottomQuadrant)\r\n        {\r\n            index = 3;\r\n        }\r\n    }\r\n\r\n    return index;\r\n}\r\n\r\nvoid BasicQuadtree::Insert(const sf::FloatRect&amp; rect)\r\n{\r\n    if (mChildNodes[0] != nullptr)\r\n    {\r\n        int32_t index = GetIndex(rect);\r\n\r\n        \/\/ Bu dugum cocuk dugumlere sahip ve bu nesne onlardan ilgili olana eklenecek\r\n        if (index != -1)\r\n        {\r\n            mChildNodes[index]-&gt;Insert(rect);\r\n\r\n            return;\r\n        }\r\n    }\r\n\r\n    \/\/ Eger bu nesnenin eklenebilecegi bir cocuk dugum yok ise bu dugume (ebeveyn) dugume ekleyelim\r\n    mObjects.push_back(rect);\r\n\r\n    \/\/ En alt seviyeye gelmedik fakat bu dugum icin nesne adeti doldu\r\n    if ((mObjects.size() &gt; gMaxObjectCount)\r\n        &amp;&amp;\r\n        (mCurrentLevel &lt; gMaxLevelCount))\r\n    {\r\n        \/\/ Eger daha once bu dugum bolunmediyse dorde bolelim\r\n        if (mChildNodes[0] == nullptr)\r\n        {\r\n            Split();\r\n        }\r\n\r\n        size_t i = 0;\r\n        while (i &lt; mObjects.size())\r\n        {\r\n            int32_t index = GetIndex(mObjects[i]);\r\n\r\n            \/\/ Bu nesneyi cocuk dugume ekleyebiliriz\r\n            if (index != -1)\r\n            {\r\n                \/\/ Once nesneyi yeni dugume ekleyelim\r\n                mChildNodes[index]-&gt;Insert(mObjects[i]);\r\n\r\n                \/\/ Daha sonra eski dugumden silelim\r\n                mObjects.erase(mObjects.begin() + i);\r\n            }\r\n            \/\/ Bu nesneyi cocuk dugume ekleyemiyoruz\r\n            else\r\n            {\r\n                i++;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid BasicQuadtree::Retrieve(std::vector&lt;sf::FloatRect&gt;&amp; returnedObjects, const sf::FloatRect&amp; pRect)\r\n{\r\n    int32_t index = GetIndex(pRect);\r\n\r\n    if (index != -1 &amp;&amp; mChildNodes[0] != nullptr)\r\n    {\r\n        mChildNodes[index]-&gt;Retrieve(returnedObjects, pRect);\r\n    }\r\n\r\n    returnedObjects.insert(returnedObjects.cend(), mObjects.cbegin(), mObjects.cend());\r\n}\r\n\r\nBasicQuadtree* BasicQuadtree::GetChildNode(int32_t index)\r\n{\r\n    BasicQuadtree* node = nullptr;\r\n\r\n    if (index &lt; 4)\r\n    {\r\n        node = mChildNodes[index].get();\r\n    }\r\n\r\n    return node;\r\n}\r\n\r\nsf::FloatRect BasicQuadtree::GetBoundary() const\r\n{\r\n    return mBoundary;\r\n}\r\n\r\nuint32_t BasicQuadtree::GetCurrentLevel() const\r\n{\r\n    return mCurrentLevel;\r\n}\r\n\r\nconst std::vector&lt;sf::FloatRect&gt;&amp; BasicQuadtree::GetObjects()\r\n{\r\n    return mObjects;\r\n}\r\n<\/pre>\n<p>Bu s\u0131n\u0131f ve \u00f6rnek uygulama i\u00e7in\u00a0<a href=\"https:\/\/github.com\/yazilimperver\/DataStructures\">https:\/\/github.com\/yazilimperver\/DataStructures<\/a> &#8216;den ilgili kodlar\u0131 \u00e7ekebilirsiniz. \u00d6rnek uygulama fare sol t\u0131k\u0131 ile nesne eklemekte ve mevcut quadtree farkl\u0131 renkler ile g\u00f6rselle\u015ftirilmekte. Daha \u00f6nce de ifade etti\u011fim gibi bu \u00e7ok basit ve performans vs g\u00f6z \u00f6n\u00fcne <strong>al\u0131nmadan<\/strong> yaz\u0131lm\u0131\u015f bir \u00f6rnek. Sadece mant\u0131\u011f\u0131 anlatmak ad\u0131na bu \u015fekilde yaz\u0131ld\u0131. Performans odakl\u0131 bir s\u00fcr\u00fcm\u00fcn\u00fc de yak\u0131n zamanda ilgili &#8220;repository&#8221; ekleyece\u011fim canlar.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Sonu\u00e7<\/span><\/strong><\/h2>\n<p>Sonu\u00e7 olarak Quadtree&#8217;ler kolay bir veri yap\u0131s\u0131 olmalar\u0131 sebebi ile 2B verilerin y\u00f6netilmesinde tercih edilebilirler. Alt d\u00fc\u011f\u00fcm s\u0131n\u0131rlar\u0131 \u00e7al\u0131\u015fma zaman\u0131nda hesaplanabilir. D\u00fc\u011f\u00fcmleri dinamik olarak \u00e7al\u0131\u015fma zaman\u0131nda bellekte olu\u015fturmak yerine bir havuz yap\u0131s\u0131 kullan\u0131lmas\u0131 da performans\u0131 artt\u0131racakt\u0131r. Noktasal veriler i\u00e7in kullan\u0131lacak Quadtree&#8217;ler ile alansal veya \u00e7izgisel nesneler i\u00e7in farkl\u0131 ve \u00f6zelle\u015fmi\u015f quadtree&#8217;ler kullan\u0131labilir.<\/p>\n<p>Her veri yap\u0131s\u0131nda oldu\u011fu gibi ihtiya\u00e7lar\u0131n\u0131z belirleyip ona g\u00f6re Quadtree kullan\u0131m\u0131na karar vermelisiniz. Quadtree de\u011filse peki ne sorusunun di\u011fer muhatab\u0131 genelde &#8220;uniform grid&#8221; olur. Grid yap\u0131s\u0131 i\u00e7in de ayr\u0131ca bir yaz yazmay\u0131 planl\u0131yorum.<\/p>\n<p>Genel olarak dinamik nesnelerin a\u011f\u0131rl\u0131kl\u0131 oldu\u011fu durumlarda uniform grid veya \u00f6zelle\u015fmi\u015f quadtreeler tercih edilebilir. Ayr\u0131ca statik nesnelerin indekslenmesinde ise Quadtree&#8217;ler her ne kadar sorgulamada &#8220;uniform grid&#8221;&#8216;e nazaran \u00e7ok az bir \u015fekilde yava\u015f olsa da boyut anlam\u0131nda b\u00fcy\u00fck avantaj sa\u011flarlar. Bunun ile birlikte indeksleyece\u011finiz nesnelerin boyutlar\u0131 de\u011fi\u015fkense bu da &#8220;uniform grid&#8221; i\u00e7in s\u0131k\u0131nt\u0131 yaratabilir (hareket durumunda bir \u00e7ok h\u00fccrede g\u00fcncelleme gerekecektir).<\/p>\n<p>A\u015fa\u011f\u0131da Quadtree&#8217;lere ili\u015fkin bir \u00e7ok ba\u011flant\u0131 bulabilirsiniz. Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<p><a href=\"http:\/\/www.umiacs.umd.edu\/~ramani\/cmsc878R\/p187-samet.pdf\">http:\/\/www.umiacs.umd.edu\/~ramani\/cmsc878R\/p187-samet.pdf<\/a> =&gt; Yine bu veri yap\u0131s\u0131 ile ilgili eski ama sa\u011flam bir kaynak<\/p>\n<p><a href=\"http:\/\/jimkang.com\/quadtreevis\/\">http:\/\/jimkang.com\/quadtreevis\/<\/a> =&gt; \u0130nteraktif bir quadtree uygulamas\u0131<\/p>\n<p><a href=\"https:\/\/web.archive.org\/web\/20120204170335\/http:\/\/homepages.ge.ucl.ac.uk\/~mhaklay\/java.htm#PR\">https:\/\/web.archive.org\/web\/20120204170335\/http:\/\/homepages.ge.ucl.ac.uk\/~mhaklay\/java.htm#PR<\/a> =&gt; Quadtree, varyasyonlar\u0131 ve bir\u00e7ok di\u011fer veri yap\u0131s\u0131 i\u00e7in ba\u015fvurabilirsiniz.<\/p>\n<p><a href=\"https:\/\/github.com\/timohausmann\/quadtree-js\">https:\/\/github.com\/timohausmann\/quadtree-js<\/a> =&gt; Javascript versiyonu<\/p>\n<p><a href=\"https:\/\/www.gamasutra.com\/view\/feature\/3434\/continuous_lod_terrain_meshing_.php?page=4\">https:\/\/www.gamasutra.com\/view\/feature\/3434\/continuous_lod_terrain_meshing_.php?page=4<\/a> =&gt; Arazi g\u00f6rselle\u015ftirmesinde kullan\u0131m\u0131na bir \u00f6rnek<\/p>","protected":false},"excerpt":{"rendered":"<p>Tekrar merhaba arkada\u015flar C++ ile ilgili olan yaz\u0131lar\u0131m\u0131za biraz ara verip bug\u00fcn gerek oyunlarda, gerek co\u011frafi bilgi sistemlerinde, gerekse arazi g\u00f6rselle\u015ftirmesi, resim i\u015fleme ve bunun gibi bir \u00e7ok alanda kullan\u0131lan bir veri yap\u0131s\u0131ndan k\u0131saca bahsetmek istiyorum: &#8220;Quadtree&#8220;. Bu veri yap\u0131s\u0131n\u0131n detaylar\u0131na \u00e7ok girmeden \u00f6nce &#8220;Spatial Data Structrues&#8221; ve &#8220;Spatial Partitioning&#8221; denilen yani Uzaysal Veri Yap\u0131lar\u0131&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,25],"tags":[99,13,97,100,101,96,98,102],"class_list":["post-302","post","type-post","status-publish","format-standard","hentry","category-c","category-oyun-gelistirme","tag-bsp","tag-c","tag-data-structures","tag-octree","tag-ornek-kod","tag-quadtree","tag-spatial-partitioning","tag-veri-yapisi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Quadtree - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Quadtree[:en]Quadtrees[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Tekrar merhaba arkada\u015flar C++ ile ilgili olan yaz\u0131lar\u0131m\u0131za biraz ara verip bug\u00fcn gerek oyunlarda, gerek co\u011frafi bilgi sistemlerinde, gerekse arazi g\u00f6rselle\u015ftirmesi, resim i\u015fleme ve bunun gibi bir \u00e7ok alanda kullan\u0131lan bir veri yap\u0131s\u0131ndan k\u0131saca bahsetmek istiyorum: &#8220;Quadtree&#8220;. Bu veri yap\u0131s\u0131n\u0131n detaylar\u0131na \u00e7ok girmeden \u00f6nce &#8220;Spatial Data Structrues&#8221; ve &#8220;Spatial Partitioning&#8221; denilen yani Uzaysal Veri Yap\u0131lar\u0131... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2018-02-26T18:56:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-03T17:07:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/20\/Octree2.svg\/1200px-Octree2.svg.png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\"},\"headline\":\"Quadtree\",\"datePublished\":\"2018-02-26T18:56:28+00:00\",\"dateModified\":\"2018-03-03T17:07:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\"},\"wordCount\":2818,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"BSP\",\"c++\",\"Data Structures\",\"Octree\",\"\u00d6rnek Kod\",\"Quadtree\",\"Spatial Partitioning\",\"Veri Yap\u0131s\u0131\"],\"articleSection\":[\"C++\",\"Oyun Geli\u015ftirme\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\",\"name\":\"[:tr]Quadtree[:en]Quadtrees[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2018-02-26T18:56:28+00:00\",\"dateModified\":\"2018-03-03T17:07:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quadtree\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"description\":\"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Quadtree[:en]Quadtrees[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Quadtree[:en]Quadtrees[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Tekrar merhaba arkada\u015flar C++ ile ilgili olan yaz\u0131lar\u0131m\u0131za biraz ara verip bug\u00fcn gerek oyunlarda, gerek co\u011frafi bilgi sistemlerinde, gerekse arazi g\u00f6rselle\u015ftirmesi, resim i\u015fleme ve bunun gibi bir \u00e7ok alanda kullan\u0131lan bir veri yap\u0131s\u0131ndan k\u0131saca bahsetmek istiyorum: &#8220;Quadtree&#8220;. Bu veri yap\u0131s\u0131n\u0131n detaylar\u0131na \u00e7ok girmeden \u00f6nce &#8220;Spatial Data Structrues&#8221; ve &#8220;Spatial Partitioning&#8221; denilen yani Uzaysal Veri Yap\u0131lar\u0131... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2018-02-26T18:56:28+00:00","article_modified_time":"2018-03-03T17:07:20+00:00","og_image":[{"url":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/20\/Octree2.svg\/1200px-Octree2.svg.png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4"},"headline":"Quadtree","datePublished":"2018-02-26T18:56:28+00:00","dateModified":"2018-03-03T17:07:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/"},"wordCount":2818,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["BSP","c++","Data Structures","Octree","\u00d6rnek Kod","Quadtree","Spatial Partitioning","Veri Yap\u0131s\u0131"],"articleSection":["C++","Oyun Geli\u015ftirme"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/","name":"[:tr]Quadtree[:en]Quadtrees[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2018-02-26T18:56:28+00:00","dateModified":"2018-03-03T17:07:20+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/02\/26\/quadtree\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Quadtree"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}},{"@type":"Person","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","caption":"yaz\u0131l\u0131mperver"},"description":"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)"}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=302"}],"version-history":[{"count":8,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/302\/revisions"}],"predecessor-version":[{"id":320,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/302\/revisions\/320"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}