Daugiau

Raskite taškų skaičių tam tikru taškų rinkinio spinduliu

Raskite taškų skaičių tam tikru taškų rinkinio spinduliu


Turiu du stalus. Vienas iš jų yra parduotuvių sąrašas (su lat/long). Kitas yra klientų adresų sąrašas (su lat/long). Noriu pateikti užklausą, kuri pateiks kiekvienos lentelės parduotuvės klientų skaičių tam tikru spinduliu. Tai suteikia man bendrą klientų skaičių, esantį 10 000 metrų atstumu nuo BET KOKIOS parduotuvės, tačiau nesu tikras, kaip jį sugrąžinti, kad kiekviena parduotuvė grąžintų vieną eilutę su skaičiumi.

Atminkite, kad šias užklausas darau naudodamas „cartoDB“, kurthe_geomiš esmės yra ilgas/lat.

PASIRINKITE COUNT (*) kaip customer_count iš customer_table WHERE EXISTS (SELECT 1 FROM store_table WHERE ST_Distance_Sphere (store_table.the_geom, customer_table.the_geom) <10000)

Taip gaunama viena eilutė:

4009

Pasiūlymų, kaip tai padaryti prieš mano problemą? Esu pasirengęs tai padaryti kitais būdais, kurie galėtų būti efektyvesni (greičiau).

Pavyzdžiui, stulpelis su parduotuvių pavadinimais, kurie būtų viename stulpelyje, yrastore_identifier.store_table


Šiuo atveju yra paprasta užklausa.

PASIRINKITE a.id AS parduotuvę, skaičiuokite (b.*) AS customer_count FROM parduotuvėse a, klientus b WHERE ST_DWithin (a.geom :: geography, b.geom :: geography, 5000) GROUP BY a.id

Savo pavyzdinius duomenis išsaugojau projekcijoje WGS 84 (4326). Jei norite naudoti metrinę sistemą, turite konvertuoti geometriją į geografinį formatą.

Mano užklausos rezultatas:

parduotuvės kliento_skaita 1 2 2 4 3 2

REDAGUOTI Norėdami gauti visų ir tam tikros srities klientų procentą, galite naudoti aSUužklausa (nepatikrinta!):

SU all_customers AS (SELECT count (*) AS all_customers FROM customers) SELECT a.id AS store, count (b.*) AS customer_count, count (b.*)/C.all_customers*100 AS proc. Iš parduotuvių a, klientai b , all_customers c WHERE ST_DWithin (a.geom :: geografija, b.geom :: geografija, 5000) GROUP BY a.id

Radę namus spinduliu

Interviu metu manęs paklausė: „Nekilnojamojo turto programa, kurioje išvardyti visi namai, kurie šiuo metu yra rinkoje (ty parduodami) tam tikru atstumu (tarkime, pavyzdžiui, vartotojas nori rasti visus namus, esančius 20 mylių atstumu), kaip suprojektuotumėte savo programą (duomenų struktūrą ir alogritmą), kad sukurtumėte tokio tipo paslaugas?

Kokiu nors ideju? Kaip tai įgyvendintumėte? Aš jam pasakiau, kad nežinau, nes niekada anksčiau nedariau jokių su geografija susijusių dalykų.


3 atsakymai 3

Yra efektyvus algoritmas, kurio veikimo laikas daugeliu atvejų yra beveik linijinis.

Tarkime, kad atstumo slenkstis yra $ d $, t. Y. Norite, kad du elementai atstumu $ le d $ būtų toje pačioje grupėje.

Tada galite padalinti erdvę į kubelius, kurių šoninis ilgis yra $ 2d $, ir kiekvieną elementą laikyti kube, kuriame jis yra. Kubai gali būti saugomi maišos lentelėje, kad būtų galima veiksmingai ieškoti. Pavyzdžiui, jei taškas yra koordinatėse $ (x, y, z) $, jis yra susietas su kubu, kurio apatinis kairysis kampas yra koordinatėse $ ( lfloor x/2d rfloor, lfloor y/2d rfloor, lfloor z/2d rfloor rfloor) $ galite sumaišyti tas koordinates ir išsaugoti tašką atitinkamame maišos segmente.

Dabar, jei du taškai yra $ le d $ atstumu vienas nuo kito, jie turi būti gretimuose kubuose. Taigi, visus taškus, kuriuos reikia sudėti į tą pačią grupę, galite rasti žiūrėdami į gretimų kubelių poras. Visų pirma algoritmas tampa toks:

  • Už kiekvieną kubą $ C $:
    • Kiekvienam $ C '$ kubui, esančiam šalia $ C $:
    • Už kiekvieną $ P $ tašką $ C $ ir kiekvieną tašką $ P '$ $ C' $:
      • Jei atstumas tarp $ P, P '$ yra daugiausia $ d $, sujunkite juos į tą pačią grupę.

      Galite sekti grupes naudodami „Union-Find“ duomenų struktūrą. Taikant šį metodą, veikimo laikas bus $ O (n alfa (n)) $, darant prielaidą, kad kiekviename kube yra daugiausiai pastovus taškų skaičius (kuris paprastai būna daugumos taškų išdėstymo atveju). Čia mes panaudojome tai, kad kiekvienas kubas yra greta tik 26 kitų kubelių, todėl kiekvieną tašką $ P $ reikia palyginti tik su pastoviu kitų taškų skaičiumi.


      Geriausia POI paieškos praktika

      Ieškodami LV, galite paprašyti LV rezultatų pagal pavadinimą. Pavyzdžiui, galite ieškoti įmonės pagal pavadinimą.

      Primygtinai rekomenduojame naudoti parametrą countrySet, kad nurodytumėte šalis/regionus, kuriuose jūsų programa turi būti aprėpta. Numatytasis elgesys yra ieškoti visame pasaulyje. Ši plati paieška gali duoti nereikalingų rezultatų, o paieška gali užtrukti ilgai.

      Prekės ženklo paieška

      Siekiant pagerinti rezultatų ir atsakymo informacijos aktualumą, POI paieškos atsakymas apima prekės ženklo informaciją. Šią informaciją galite naudoti toliau analizuodami atsakymą.

      Užklausoje galite pateikti kableliais atskirtą prekių ženklų sąrašą. Naudokite sąrašą, kad apribotumėte rezultatus tik tam tikriems prekės ženklams, nustatydami parametrą brandSet. Jūsų sąraše elementų tvarka nesvarbi. Kai pateikiate kelis prekių ženklų sąrašus, grąžinami rezultatai turi priklausyti bent vienam iš jūsų sąrašų.

      Norėdami ištirti prekės ženklo paiešką, pateikime LV kategorijos paieškos užklausą. Šiame pavyzdyje ieškome degalinių netoli „Microsoft“ miestelio Redmonde, Vašingtone. Atsakyme rodoma prekės ženklo informacija apie kiekvieną grąžintą LV.

      Užklausos pavyzdys

      Atsakymas

      Oro uosto paieška

      Naudodami paieškos POI API galite ieškoti oro uostų naudodami oficialų jų kodą. Pavyzdžiui, galite naudoti SEA Norėdami rasti Sietlo-Takomos tarptautinį oro uostą:

      Paieška netoliese

      Jei norite gauti POI rezultatus konkrečioje vietoje, galite pabandyti naudoti „Search Netoliese“ API. Galutinis taškas pateikia tik POI rezultatus. Jis neatsižvelgia į paieškos užklausos parametrą.

      Norėdami apriboti rezultatus, rekomenduojame nustatyti spindulį.


      Būsimi patobulinimai

      • 2019 m. Gegužės 6 d.: 9.3 versija - paieška pagal Australijos pašto kodą
      • 2018 m. Lapkričio 7 d.: 9.2 versija - pridėta nauja parinktis Rodyti pašto kodo žymeklius?
      • 2018 m. Rugsėjo 19 d.: 9.1 versija - nemokama teksto paieška nustatyta kaip numatytoji paieška
      • 2018 m. Rugpjūčio 27 d.: 9.0 versija - pakeista į informacinius lapelius
      • 2018 m. Balandžio 7 d.: 8.4 versija - atnaujinimai, siekiant pagerinti pašto kodo bazinio taško paiešką
      • 2017 m. Liepos 4 d.: 8.3 versija. Kombinuota produkcija dabar surūšiuota pagal atstumą nuo spindulio centro
      • 2017 m. Kovo 7 d.: 8.2 versija - viso ekrano valdymas dabar yra integruotas į žemėlapio sąsają
      • 2016 m. Balandžio 21 d.: 8.1 versija - pridėta kombinuota išvestis, suteikianti pašto kodą, priemiestį ir atstumą nuo spindulio centro
      • 2014 m. Gegužės 28 d.: 8 versija - spindulį dabar galima nuvilkti, kad atliktumėte naują paiešką netoliese. Pridėtas mygtukas „Išvalyti žemėlapį“
      • 2013 m. Lapkričio 18 d.: 7 versija - pridėta viso ekrano parinktis
      • 2013 m. Lapkričio 12 d. 6 versija - įdiegta „Google“ žemėlapio API V3
      • 2013 m. Rugpjūčio 6 d.: 5 versija - galimybė įtraukti pasikartojančius pašto kodus
      • 2013 m. Vasario 1 d.: 4 versija - pasikartojantys pašto kodai nebeišduodami
      • 2012 m. Vasario 5 d. 3 versija. Taip pat išvedamas priemiestis
      • 2011 m. Birželio 19 d. 2 versija - paieškos funkcijų klaidų pataisymas
      • 2011 m. Vasario 16 d. 1 versija - pradinė versija

      Sferos paskirstymo taškai

      Vieneto sfera (S^2 ) trimis matmenimis yra visų taškų rinkinys (x ), esančių (R^3 ) atstumu (| x | = 1 ) nuo kilmės. Čia mes svarstome tik sferos paviršių, o ne jo vidų. Priešingai nei apskritimas, vienodai paskirstyti taškus sferoje neįmanoma, išskyrus kelis ypatingus atvejus (platoninės kietosios medžiagos iliustruotos žemiau). Vietoj to, taškams paskirstyti naudojami daug skirtingų kriterijų, įskaitant minimalią energiją, dengimą, pakavimą, Voronoi ląsteles, jų išgaubto korpuso tūrį, didžiausią determinantą, kubatūrinius svorius ir Lagrange‘o polinomų normas. Šie skirtingi kriterijai iliustruoti tolesniuose paveikslėliuose, visi pagrįsti 100 taškų rinkiniu, kuris yra bent jau labai artimas potencialios energijos minimizavimui.

      Atsižvelgiant į taškų skaičių (m ), pagrindinė problema yra pasirinkti jų vietas (x_j ) (j = 1, ldots, m ) vieneto srityje (taigi kiekvienam (j ), (x_j ) yra 3 elementų vektorius su (| x_j | = 1 )) tam, kad optimizuotų (sumažintų arba padidintų) tam tikrą taškų padėties funkciją. Dauguma interesų yra besikeičiančios rotacijos būdu, tai yra, sukant visą taškų rinkinį, tikslo funkcija nesikeičia. Taigi taškų rinkinius galima normalizuoti taip, kad pirmasis taškas būtų šiauriniame poliuje, o antrasis - dienovidinio taške. Sferos optimizavimo problemų bruožas yra tas, kad jos turi daug vietinių minimumų. Išskyrus kelis ypatingus atvejus, labai sunku įrodyti, kad taškų rinkinys yra pasaulinis minimumas. Daugelis šių problemų tapo klasikinėmis matematinėmis problemomis, daugelis jų vis dar neišspręstos, kurios daugelį metų sudomino mokslininkus, apimančius platų matematikos spektrą - nuo geometrijos iki daugiamatių daugianarių.

      Taškų pasiskirstymas vienetų sferoje gali būti pritaikytas nuo globalių Žemės klimato modelių, Žemės gravitacinių ir magnetinių laukų kartografavimo, anglies fullerenų (buckyball arba C60), kristalografija, geodeziniai kupolai, sferiniai kodai, virusų modeliavimas, skaičiavimo geometrija, kompiuterinė grafika, golfo kamuoliukų ir net futbolo kamuolio projektavimas. UNSW skaičiavimo matematikos grupė ypač domina gerus taškų rinkinius (daugianariams) aproksimacijai, interpoliacijai ir integracijai sferoje bei jų geometrines savybes.

      Išgaubtas korpusas, Voronoi ląstelės ir Delaunay trikampis

      Atsižvelgiant į taškų rinkinį vieneto srityje, vienas dominantis kiekis yra taškų rinkinio išgaubto korpuso tūris. Išgaubtas korpusas yra visų taškų, esančių tiesės atkarpoje, jungiančioje du rinkinio taškus, rinkinys. Tai taip pat yra visų pusių tarpų, kuriuose yra visi taškai, sankirta. Maksimalūs išgaubti korpuso taškai padidina jų išgaubto korpuso, esančio vieneto sferos viduje, tūrį. Didžiausias išgaubto korpuso uždavinys yra taškų išdėstymas taip, kad sferos liestinės plokštumos šiuose taškuose apgaubtų minimalaus tūrio daugiakampį.

      Geodezinis atstumas tarp dviejų taškų (x ), (y ) vieneto sferoje yra (d (x, y) = cos^ <-1> (x^ Ty) ), kampas tarp vektoriai nuo kilmės iki taškų (x ) ir (y ). Čia (x^T y ) yra standartinis Euklido vidinis produktas, taigi (x^T x = | x |^2 ). Naudojant šį geodezinį atstumą, Vorono ląstelė (V_j ), susieta su tašku (x_j ), yra visų vieneto sferos taškų, esančių arčiau (x_j ) nei bet kuris kitas taškas, rinkinys. Delaunay trikampis yra toks, kad jokio kito taško nėra jokio trikampio apskritime. Voronoi ląstelės ir Delaunay trianguliacija yra dvilypės. Voronoi ląstelės yra sferiniai daugiakampiai. Jei įvyksta tik penkiakampiai (5 kraštinės), šešiakampiai (6 kraštinės) ir šešiakampiai (7 pusės) daugiakampiai, tai Eulerio formulė (išgaubtam daugiakampiui (V - E + F = 2 ), kur (V ) yra viršūnių skaičius, (E ) yra kraštų skaičius ir (F ) yra veidų skaičius, kurį Euleris atrado apie 1750 m.) reiškia, kad penkiakampių yra 12 daugiau nei šešiakampių. Ypač jei nėra šešiakampių, tada yra lygiai 12 penkiakampių su likusiais šešiakampiais, o tai yra artima idealiai struktūrai. Penkiakampių ir šešiakampių, atsirandančių su didesniu taškų skaičiumi, struktūra domina fiziką, nes jie yra sąveikos vietos.

      Riesz s-energija

      Riesz (s )-energija ( (s & gt 0 )) iš (m) taškų rinkinio (x_j ),, (j = 1. m ) vieneto sferoje yra visų skirtingų terminų (1/| x_i - x_j |^s ) porų suma. Standartinis Kulono potencialas, naudojamas vienas kitą atstumiantiems elektronams modeliuoti, atitinka (s = 1 ). Po J. J. Thomsono 1904 m. „Požiūris, kad elementų atomai susideda iš daugybės neigiamai įelektrintų korpusų, esančių vienodo teigiamo elektrifikavimo srityje“, taškų rinkiniai, kurie sumažina Kulono potencialą, yra žinomi kaip Tomsono problema. Riba, kai (s ) didėja, atitinka pakavimo problemą (žr. Toliau), nes dominuoja terminas iš artimiausio taško. Jei (s = 0 ), maksimaliai padidinamas atstumų sumos logaritmas (| x_i - x_j | ), o tai prilygsta maksimaliam atstumų sandaugai.

      Minimali energijos problema yra rasti vienetų sferoje (m ) taškų rinkinį, kuris sumažintų jų Riesz energiją. Aukščiau esantys vaizdai atitinka energiją, kai prie aukščiau pavaizduoto 100 taškų rinkinio pridedamas vienas papildomas taškas (iš kairės į dešinę) (s = 0,1 ), (s = 1 ) ir (s = 4 ).

      Dengimas ir pakavimas su sferiniais dangteliais

      Sferinis dangtelis (C (x, r) ), kurio centre yra (x ) ir kurio spindulys (r ), yra visų sferos taškų rinkinys, esantis ne daugiau kaip (r ) atstumu nuo taško (x ). Fiksuotam taškų skaičiui (m ) pakavimo problema yra surasti (x_j ), (j = 1, ldots, m ) identiškų, nepersidengiančių sferinių dangtelių kad jų bendras spindulys būtų maksimaliai padidintas. Šis pakavimo spindulys yra dvigubai mažesnis už minimalų kampą tarp taškų. Taškų rinkinys vadinamas sferiniu kodu. Problema rasti tašką, nustatytą siekiant maksimaliai padidinti minimalų kampą tarp taškų, yra žinoma kaip Tammeso problema po jo darbo su žiedadulkių grūdais 1930 m. Arba Fejeso Toto problemos (jis įrodė viršutinę ribą dėl minimalaus atstumo tarp taškų 1943 m.). Susijusi problema yra Keplerio spėjimas (1611 m.), Kad tankiausias kietų sferų pakavimas trimatėje erdvėje yra šešiakampis glaudus įpakavimas, kurio tankis yra apie 74,048% (pranešama, kad Halesas 1998 m. Patvirtino apie 282 puslapius).

      Kita vertus, uždengimo problema yra surasti identiškų sferinių dangtelių centrus (x_j ), (j = 1, ldots, m ), kurie visiškai dengia sferą taip, kad bendras jų spindulys būtų sumažintas. Šį uždengimo spindulį nurodo tolimiausio rutulio taško atstumas nuo artimiausio rinkinio taško (x_j ), (j = 1, ldots, m ), kuris taip pat žinomas kaip akių norma. Tinklelio normą galima apskaičiuoti naudojant Voronoi ląsteles arba Delaunay trianguliaciją. Kitas taškų rinkinio vienodo pasiskirstymo matas yra dengiamojo spindulio ir pakavimo spindulio santykis (visada didesnis nei 1). Kairysis paveikslas nurodo sferinį šio taškų rinkinio įpakavimą, vidurinis - taško atstumą nuo artimiausio rinkinio taško (akių norma yra šios funkcijos visuotinis maksimumas), o dešinėje esantis skaičius - sferinė danga.

      Lagranžo polinomų normos

      Sferiniai daugianariai, tai yra trijų kintamųjų daugiakampiai, apriboti sferos paviršiumi, ne daugiau kaip (n ) laipsnio, sudaro matmens erdvę (d_n = (n+1)^2 ). Dažniausias pagrindas yra sferinės harmonikos. Sferos (d_n ) taškų rinkinys (x_j ) sudaro pagrindinę sistemą, jei daugumos, daugiausiai n laipsnio polinomas, kuris taškuose yra lygus nuliui, turi būti nulis kiekviename sferos taške. Atsižvelgiant į pagrindinį rinkinį, Lagranžo daugianariai ( ell_j (x) ) (j = 1, ldots, d_n ) yra (n ) laipsnio polinomai, tokie kaip ( ell_j (x_i) = 1 ) jei (i = j ) ir 0 visiems (i ) nelygus (j ).

      Lagrange'o polinomų normos yra labai svarbios aproksimacijos teorijai. Lebesgue'o konstanta yra didžiausia sferoje, kurioje yra Lagranžė polinomų absoliučių verčių sumos (| ell_j (x) | ) suma (Lagranžo polinomų vektoriaus 1 norma). Lagrango kvadratų suma yra Lagrange'o polinomų kvadratų suma, o begalybės norma yra Lagrange'o polinomų absoliučios vertės maksimumas. Už 100 taškų šios trys funkcijos iliustruotos aukščiau. Tikslas yra pasirinkti taškus, kad būtų sumažintas visuotinis maksimumas šių funkcijų srityje.

      Interpoliacinė kubatūra, kubatūriniai svoriai ir determinantai

      Funkcijos integralą (f (x) ) per sferą galima apytiksliai apskaičiuoti svertine (svoriais (w_j )) funkcijų reikšmių (f (x_j) ) sumomis taškuose (x_j ) (j = 1, ldots, m ). Interpoliacinė kubatūros taisyklė turi (m = d_n ) taškų ir yra tiksli ne daugiau kaip sferiniams daugianariams laipsniams (n ). Esminės sistemos atveju interpoliacinės kubatūros taisyklės svoriai pateikiami (w_j = ) Lagrange'o daugianario ( ell_j (x) ) integrale per (S^2 ). Kadangi tokios kubatūros taisyklės turi būti tikslios pastovajam daugianariui, kubatinių svorių suma (w_j ) turi būti lygi sferos plotui (| S^2 | ). Visi kubatūriniai svoriai turėtų būti teigiami ir kuo arčiau vienodo. Sferinis (n )-dizainas yra (m ) taškų rinkinys vieneto sferoje, kad vienodo svorio ( (w_j = | S^2 |/m )) kubatūros taisyklė būtų tiksli visiems polinomams ne daugiau kaip (n ). Juos pristatė Delsarte, Goethals ir Seidel 1977 m. Sferinis (n )-dizainas taip pat yra Quasi-Monte Carlo (QMC) taisyklės, skirtos skaitmeninei integracijai visoje srityje, pavyzdys.

      Linijinė sistema, kurią reikia išspręsti norint rasti kubatūrinius svorius, gali būti taip blogai kondicionuojama, kad apskaičiuotas sprendimas yra visiškai nepatikimas. Linijinė sistema yra gerai kondicionuojama, jei taškai parenkami taip, kad maksimaliai padidintų pagrindinės matricos determinantą, idėją, kilusią 1923 m.

      Pirmieji du aukščiau esantys vaizdai rodo rutulio taškus ir jų Delaunay trikampį, nuspalvintą kubatūriniais svoriais. Paskutinis vaizdas yra pagrindinės matricos determinanto žurnalo neigiamas, nes taškas ties šiaurės ašigaliu perkeliamas per sferą. Sienos yra tos, kuriose šis kiekis tampa begalinis, nes pagrindinė matrica yra vienalytė.


      16 atsakymai 16

      Atsiprašau, bet dauguma atsakymų čia neteisingi. Originalus klausėjo užduotas pastebėjimas yra teisingas. Trimatėje erdvėje reikia tik trijų unikalių koordinačių, kad būtų galima apibūdinti tikslią objekto vietą, palyginti su žinomu kilmės tašku.

      Geras to pavyzdys realiame gyvenime, kuris tai įrodo - GPS įrenginiai yra skirti sekti jūsų buvimo vietą, esant mažiausiai trims palydovų signalams. GPS koordinatės tikslumui pagerinti naudoja daugiau palydovų nei tas, tačiau taip nėra todėl, kad turint daugiau atskaitos koordinačių, jie tampa tikslesni, o todėl, kad turint daugiau RADIO signalų sumažėja triukšmo ir kitų trikdžių poveikis. signalų, kuriuos jis seka.

      Įsivaizduokite, kad jūsų padėjėjas sėdi galinėje sėdynėje jūsų automobilio keleivio pusėje, ir jūs turite jam pasakyti tikslią kavos puodelio vietą, kurią palikote ant prietaisų skydelio. Galite naudoti šias orientacines koordinates:

      Priekinis buferis (X ašies koordinatė) Vairuotojo šoninio vaizdo veidrodis (Y ašies koordinatė) Stiklo valytuvai (Z ašies koordinatė)

      Dabar, pakeldami ranką link visų trijų tų objektų, nejudėdami pro šalį iš keleivio pusės galinės sėdynės, pateksite į vietą, kuri yra priešais jus, priekinio stiklo valytuvų aukštyje, vairuotojo sėdynės kryptimi, ir tai būtų transporto priemonės prietaisų skydelis, esantis arčiausiai vairuotojo lango esančiame kampe. Pridėjus dar 3 atskaitos taškus, jis nebūtų tikslesnis, nes nesvarbu, iš kelių krypčių matuojate, jei turite pakankamai atskaitos taškų.

      Tačiau manau, kad kalbant apie galaktines keliones, 3 milijonai galimų adresų derinių ir 38 atskaitos taškai yra pakankamai tikslūs. Jei reikia tikslesnio, jie turėtų naudoti simbolius ant vartų, tačiau adresams vis tiek reikės tik 3 simbolių ir kilmės taško!

      Tiems iš jūsų, kurie tiki kitais atsakymais, teigiančiais, kad 6 taškai ir atskaitos taškas yra logiški, aš suprantu, kodėl galite padaryti tokią išvadą, bet jūs per daug mąstote. ir tu klysti. Jei iš lygties pašalintumėte kilmės tašką, jums reikės 6 koordinačių vien todėl, kad jums reikės 3 kiekvienos taško koordinatės (viena jūsų kilmės taško ir viena jūsų paskirties vietos). Holivudas akivaizdžiai nesuprato matematikos ir neteisingai aiškino, kaip koordinatės veikia trimatėje erdvėje.

      Kitas būdas pamatyti, kaip tai būtų nelogiška, būtų imti dvimatį žemėlapį ir pažymėti du taškus. tada išsiaiškinkite, kaip apibūdinti vieno taško padėtį kito atžvilgiu. Remiantis „Žvaigždžių vartų“ logika, jums reikia vienos koordinatės jūsų kilmės taškui, o po to keturiems taškams į paskirties vietą (po vieną tašką kiekvienoje kelionės tikslo pusėje, sudarančią kvadratą, o ne kubą, kurį jie naudojo filme trimatėje erdvėje). . Pažadu, kai baigsite, jausitės gana kvailai. Neužtruksite daugiau nei poros sekundžių, kad suprastumėte, jog rasti 2 atskaitos taškus, apibūdinančius vieną vietą 2 dimensijų žemėlapyje, yra visiškai kvaila.

      Tiems iš jūsų, kurie yra nuoširdūs dėl mąstytojų, jums nereikia sutarto centro ar universalios ašies ar orientacinės orientacijos, kad atliktumėte šį darbą naudodami vieną koordinatę kiekvienam matmeniui ir kilmės tašką, jei užtikrinsite, kad kiekviena paskirties vieta aplink jį yra bent trys atskaitos taškai, kurie visi yra toliau nuo kelionės tikslo, nei yra iki kilmės vietos (nesigilinu į matematiką ir išsamiai nepaaiškinsiu tos dalies, bet priežastis yra ta, kad reikia nupiešti tris atskirus vektorius, einančius pro paskirties vietą iš trijų skirtingų kampų, kad atstumas tarp objekto išliktų lygus atstumui tarp kilmės taško ir trijų taškų susikirtimo).


      Jei jūsų taškų rinkinys yra didžiulis ir turite taškų srautą, kuris turi būti lyginamas su telkiniu (ty, suraskite baseino elementą, kuris yra arčiausiai įvesties taško), galite naudoti groteles/vokus: tarkime, kad jūsų taškai Turėkite koordinates nuo 0 iki 1. Galite jas padalyti į 100 langelių, padalindami kiekvieną koordinatę į 10. Pvz., langelio numeris 35 turės 0,2 & lt = x & lt0,3 ir 0,4 & lt = y & lt0,5. Tada kiekvienam naujam taškui reikia pažymėti tik „labai mažai“ langelius (vietoj visų 100).

      Tiksliau, reikia rasti artimiausią langelio tašką, kuriame taškas nusileido, ir tada palyginti atstumą iki artimiausio taško su atstumu iki langelio ribos.

      Jei artimiausias taškas yra arčiau ribos, viskas baigta.

      Priešingu atveju turite pažymėti tuos gretimus langelius, kurie yra arčiau nei artimiausias taškas (iki 11! Jei tikslinis taškas ir artimiausias jo taškas yra beveik priešinguose įstrižainės mazguose). Tačiau to neturėtų atsitikti, jei taškų skaičius langelyje yra „didelis“.


      2 atsakymai 2

      Sukurkite netikrą rezultatų suvestinės tikslą (čia pavadinau jį „EntityCount“):

      Tada suskaičiuokite visus norimus objektus, kad kiekvienas subjektas padidintų balą 1. Pirma komanda kartojasi, kiti - grandinė.

      Tada paleiskite komandą, kai rezultatas sutampa su 10:

      Jei norite aptikti „bent 10“, naudokite tai:

      Jei norite aptikti „daugiausia 10“ (įskaitant 0), naudokite tai:

      Priežastis, kodėl /vykdyti, jei objektas @e [limit = 10] šiuo atveju neveikia, yra tai, kad jūs iš esmės sakote žaidimui taip: „Sudarykite visų objektų sąrašą ir apribokite tą sąrašą iki 10 objektų. Tada ką nors darykite, jei yra yra kažkas tame sąraše “. Sąrašo apribojimas nepadeda išsiaiškinti, ar yra daugiau ar mažiau nei 10 objektų.

      AMJ atsakymas yra seniai veikusių objektų skaičiavimo metodas (atnaujinta iki 1.13+ komandų sintaksės), tačiau nuo 1.13 taip pat galite tai padaryti geriau, naudodami „Minecraft“ vidinių objektų sąrašų ilgį, o ne pakartodami komandą kiekvienas iš jų.

      Tam taip pat reikia rezultatų suvestinės tikslo:

      Dabar galite efektyviai suskaičiuoti visus subjektus naudodami šią šiek tiek keistai atrodančią komandą:

      Čia iš tikrųjų nereikia paleisti ir sekančios komandos. Tai vienas iš nedaugelio naudojimo atvejų, kai grąžinimo reikšmė /execute, jei elgiasi panašiai kaip senoji /testfor komanda 1.12 ir ankstesnėse versijose: grąžina atitinkančių objektų skaičių, kurį galite išsaugoti rezultatų suvestinėje naudodami / vykdyti parduotuvę.

      Tada galite naudoti balą, kaip nurodyta AMJ atsakyme, pavyzdžiui, ką nors padaryti, jei yra bent 5 ir daugiausiai 15 objektų, atliekama taip:

      Šis metodas yra labai efektyvus, nes „Minecraft“ jau turi visų objektų sąrašą ir, įvykdžius šią komandą, jis pasirenka nuorodą: užuot pakartojęs visus objektus ir kiekvieną kartą pridėjęs 1, jis tiesiog grąžina to sąrašo ilgį, kuris yra jau atmintyje. Tai bus labai pastebima, jei tokią komandą naudosite dideliems objektų kiekiams arba daug kartų, pavyzdžiui, ciklo funkcijose.
      Žinoma, norėdami kažkaip apriboti selektorių @e, kai iš tikrųjų naudojate šią komandą. Jei, pavyzdžiui, naudojate @e [type = zombie], „Minecraft“ neperžiūri visų pasaulio objektų ir tikrina, ar jie yra zombiai, bet taip pat naudoja nuorodą, nes siekiant efektyvumo, „Minecraft“ saugo objektų sąrašą pagal tipą, taigi šiuo atveju jis gali tiesiog grąžinti visų zombių sąrašo ilgį.
      Kadangi šie sąrašai pagal kiekvieno tipo objektus egzistuoja, iš tikrųjų yra efektyviau rašyti @e [type = armor_stand, tag = foo], o ne tik @e [tag = foo], net jei tikrai žinote, kad niekas kitas niekada nebus pažymėtas foo, nes „Minecraft“ reikia tik patikrinti, ar visi šarvai stovi, o ne visi objektai.


      5 atsakymai 5

      Pirmiausia nustatykite neršto zonos centrą:

      Tada nustatykite neršto spindulį į 0, kad įsitikintumėte, jog žaidėjai neršia tiksliai tas blokas:

      Norėdami perkelti neršto pasaulį, eikite į pasirinktą neršto sritį ir naudokite komandą setworldspawn. Dabar žaidėjai neršia pasirinktoje neršto zonoje arba šalia jos (paprastai per 20 kvartalų). Jei norite, kad būtų sukurtas tik konkretus blokas (vietoj konkrečios srities), naudokite gamerule spawnradius & ltany number & gt. Atminkite, kad komanda „gamrule“ veikia tik tam tikrose žaidimo versijose.

      Nuo 1.7.2 pasaulio nerštą galima nustatyti naudojant komandą /setworldspawn. Naudojimas:

      Sukūrimo tašką galite nustatyti naudodami „MCEdit“. Čia yra vaizdo įrašas, kuriame nurodoma, kaip tai padaryti.