Daha çox

Ümumiyyətlə CBS-də çoxbucaqlı təpələrin sırası: saat yönünə və ya əksinə


İki gün əvvəl ESRI formalı formalarda bir çoxbucaqlının zirvələri üçün daxili saxlama qaydası barədə bir sual verdim. Bu suala cavab verildi (Çoxbucaqlılar bir şekil şəklində saat yönünün əksinə və ya saat yönünün əksinə saxlanılırmı?) Və köhnə bir postda da cavab verildi (Çoxbucaqlı yaradılış (Saat yönünün fırlanması ya da yox))

Ancaq indi sualım daha ümumidir və bənzərsiz bir cavabının olub olmadığını bilmirəm.

Saat yönünün sırası yalnız ESRI formalı sənədlər üçündür, yoxsa ümumi CİS formatları üçün?

Bəs CİS proqramının daxili nümayəndəliyi nədir?

Məsələn, QGIS istifadə etsəm və * .shp tərkibli çoxbucaqlı oxudumsa, xarici haşiyənin daxili təsvirinin orijinal shapefile olduğu kimi saat yönündə olduğunu düşünürəm, amma QGIS tərəfindən dəstəklənən bütün fayl formatları barədə nə deyə bilərəm?

Və ArcGIS üçün?

Və əgər bu fayllar QGIS, ArcGIS və s.-də yüklənərsə, saat yönünün əksinə olaraq saxlanılan çoxbucaqlı bir fayl formatı varsa, oriyentasiya daxili dəyişir, buna görə məlumatları PyQGIS-dən istifadə edərək oxuysam, məsələn, çoxbucaqlar saat yönündədir sifariş etdiniz?

Məqsədim QGIS üçün bir plagin yazmaqdır, lakin məlumat mənbəyi ESRI shapefiles və ya digər formatlar ola bilər. Çoxbucaqlıların azimutlarını istifadə edərək ardıcıl tərəfləri arasındakı açıları yoxlamağa ehtiyac duyduğum üçün əmrin saat yönünün olub olmadığını bilməliyəm. Çözümlərdən biri hər çoxbucaqlının sahəsini hesablamaq və düzgün xatırladığım təqdirdə müsbətdirsə, sıra saat yönünə, mənfi olduqda isə saat tərsinədir.

Sahə hesablanması intensiv bir iş deyil, ona görə də mənim plaginimi bu qədər ləngitməyəcəkdir.

Ancaq QGIS-in xüsusi vəziyyətində, çoxbucaqları orijinal mənbədəki sıradan asılı olmayaraq saat yönünə və ya əksinə saxladığını kimsə bilir?

İndiyə qədər ESRI formaları və koordinatları ilə işləyirəmlayer.getFeatures (). həndəsə (). asPolygon ()xarici sərhəd üçün saat yönünün əksinə, deliklər üçün saat yönünün əksinə olaraq saxlanılır, i. e. orijinal * .shp-də olduğu kimi.


[Buradan] yüklənə bilən OGC spesifikasiyasında (http://www.opengeospatial.org/standards/sfs) deyirlər:

"Çoxbucaqlı dönmə bu standartla müəyyənləşdirilməyib; həqiqi çoxbucaqlı dönmə saat yönündə və ya əks istiqamətdə ola bilər."

Oracle sənədlərində xarici halqa sərhədlərinin saat yönünün əksinə, daxili halqa sərhədlərinin isə saat yönünün istiqamətində olduğu açıq şəkildə bildirilir. Eynilə, SQL Server Spatial-da coğrafiya məlumat növü xarici üzük üçün saat yönünün əksinə və daxili üzüklər üçün saat yönünün əks qaydasına əməl edir - daha ətraflı məlumat üçün bu MicroSoft bloguna baxın. Postgis, həndəsələr üçün buna hər hansı bir şəkildə icazə verir və çoxbucaqlı həndəsəni sağ və ya sol əl qaydalarına riayət etməyə məcbur edəcək funksiyalara sahibdir, bax ST_ForceRHR və ForceLHR. JTS / Geos, sağ tərəfdəki qaydaya, yəni xarici halqanın saat yönündə bir istiqamətinə riayət etdiyi görünür, buna görə hamısı bir az aydın deyil, həqiqətən.

Ümumiyyətlə bir coğrafiya məlumat növünün oriyentasiyanı məcbur etməsi məntiqli olur, çünki əks halda kiçik bir çoxbucaqlının sadəcə bu olduğunu və ya bütün dünya çoxbucağının daxili halqası olduğunu söyləmək mümkün olmazdı. Planar bir səthdə bir həndəsə məlumat növü ilə, xarici qarışıq və daxili halqanın ardıcıllıqla getdiyi və yalnız bir üzük olduğu təqdirdə, bir kürədən fərqli olaraq, (hansı istiqamətdə olmasından asılı olmayaraq) əhatə olunacağı üçün bu qarışıqlıq yarana bilməz. , yuvarlaq sarar.


@Mxfh-in bir şərhindən: OGC-nin OpenGIS Sadə Xüsusiyyətləri Erişimi (ISO 19125-1) 1.2.1 sənədinə [OGC 06-103r4] 6.1.11.1 / səh. 26-dan etibarən xarici üzüklər üçün saat yönünün əks istiqamətini göstərir opengeospatial.org / standartlar / sfa. Dəyişiklik ən son 2006-cı ildə 1.1.0 və 1.2.0 versiyaları arasında tətbiq olundu. Sitat gətirdiyiniz dipnot 2005-ci ildən bəri yenilənmir


Sonlu bir səthi əhatə edən coğrafi koordinat sistemləri üçün qeyri-müəyyənliklərin qarşısını almaq üçün üzük (sərhəd) istiqamətlərinə ehtiyac var, çünki sərhəd istiqamət üzrə sərhədin bir sol və bir sağ hissəsini müəyyən edəcəkdi. Bu iki sahədən hansının daha böyük olduğunu müəyyənləşdirmək mümkündür, lakin hələ də qeyri-müəyyənliyi tərk edir.

Xüsusiyyətlərinə görə müxtəlif formatlardakı çoxbucaqlıların xarici halqa istiqamətlərinə dair ümumi məlumat:

  • WKT / GML / KML və müxtəlif SQL tətbiqlərində də istifadə olunan sadə xüsusiyyət giriş (ISO 19125-1):

    • xarici üzüklər: saat yönünün əksinə
    • daxili üzüklər (deliklər): saat yönündə.

    Çoxbucaqlı, 1 xarici sərhəd və 0 və ya daha çox daxili sərhəd ilə təyin olunan düzənlikli bir Səthdir. Hər bir daxili sərhəd çoxbucaqlı bir çuxur təyin edir. […]

    Xarici sərhəd LinearRing, səthin tərəfi olan səthin “üstünü” müəyyənləşdirir xarici sərhəd a sərhədini keçmək üçün görünür saat yönünün əksinə istiqamət. The daxili LineerRings əks istiqamətə sahib olacaq və görünəcək saat yönünde “yuxarıdan” göründüyü zaman ... Sadə Xüsusiyyətə Giriş xüsusiyyətləri

    Əksər tətbiqetmələrdə bir POLYGON-da üzüklərin sırası vacibdir (şəkillərdən fərqli olaraq)

    Çuxurlu bir çoxbucaqlı üçün ilk alt element xarici üzük, ikinci alt element ilk daxili halqadır, üçüncü alt element ikinci daxili halqadır və s. Oracle Məkan

    Daha dərin yuvalar, adadakı göl adasındakı ada ... MultiPolygons kimi təmsil olunmalıdır (bax Şəkil 2.10 (4)), çünki yalnız bir xarici sərhəd ola bilər və daxili üzüklərdən daha dərin yuva deyil. müəyyən edilmişdir.

  • ESRI şəkillər / SHP:

    • xarici üzüklər: saat yönünde
    • daxili üzüklər: saat yönünün əksinə

    Bir çoxbucaqlı bir və ya daha çox üzükdən ibarətdir. Bir üzük, qapalı, öz-özünə kəsişməyən bir döngə meydana gətirən dörd və ya daha çox nöqtədən ibarət olan bir ardıcıllıqdır. Bir çoxbucaqlı ola bilər çoxlu xarici üzüklər. Bir üzük üçün zirvələrin və ya istiqamətləndirmənin qaydası, üzüyün hansı tərəfinin çoxbucağın içi olduğunu göstərir. Təpə qaydasında üzük boyunca gəzən bir müşahidəçinin sağındakı məhəllə çoxbucağın içindəki məhəllədir. Üzüklərin tərifləri deşiklər çoxbucaqlılarda a saat yönünün tersi istiqamət. Tək, halqalı bir çoxbucaqlı uclar, bu səbəbdən daima içəridədir saat yönünde sifariş. […]

    Xallar cərgəsində üzüklərin sırası əhəmiyyətli deyil. ESRI Whitepaper

    Çoxsaylı xarici sərhədlərə icazə verildiyi üçün bu çoxbucaqlı təriflə adada göl adası konfiqurasiyaları mümkündür. Topoloji cəhətdən bir göldəki ada saat yönünün başqa bir xarici üzüyü olardı. Effektiv şəkildə bu, bir ESRI Shapefile Poliqonunu Sadə Bir Xüsusiyyət MultiPolygon edir

    Xalları düzgün sifariş etməsəniz, üst-üstə düşən çoxbucaqlı köpüklərə sahib olacaqsınız. pişp

  • GeoJSON (RFC7946):

    DİQQƏT: Orijinal GeoJSON 2008 spesifikasiyasında heç bir sarma əmri tətbiq olunmamışdır

    • sarma qaydası: xarici halqa saat yönünün əksinədir (sağ əl qaydası)
    • daxili üzüklər saat istiqamətindədir
    • üzüklərin sırası vacibdir:

      Çoxsaylı üzüklü çoxbucaqlılar üçün ilk xarici üzük, digərləri isə daxili üzüklər və ya deliklər olmalıdır. GeoJSON spesifikası

  • TopoJSON: xarici üzükləri varsayılan olaraq saat yönünün əksinə məcbur edir

Ekskursiya:

İç içə halqaların sarma əmrlərinin niyə bir-birini əvəz etdiyinə dair riyazi əsas budur ki, ayaqqabının düsturu (əyani izah) ilə sahəni hesablamaq, üzük istiqamətindən asılı olaraq imzalanmış sahələri hesablayır.

Ümumiyyətlə iç içə olan üzüklər (daxili sərhədlər) deşik hesab olunur və xarici halqanın alternativ istiqamətinə malikdir. Onların töhfə verdiyi imzalanmış sahə dəyəri mənfidir. Xarici üzüklər pozitiv olduğu yerlərdə. Bütün ring xüsusiyyətlərinin ümumi sahəsi bütün imzalanmış sahələrin cəmidir.

ESRI tərəfindən tətbiq edildiyi kimi bu Məlumat Baza girişinə baxın: ArcGIS tərəfindən çoxbucaqlı sahəni təyin etmək üçün hansı alqoritmdən istifadə olunur?

Təklif olunan Mnemonic

Ox şəklində şərh olunan məktub formalarının açıq uçları:

  • Shapefile: S → ᔑ → ↻
  • Sadə Features: e → ᘓ (cc-müdrik şəkildə kənara sarın) → ↺
  • GeoJSON: G (G kökü oxdur) → ↺

Bilmirəm ki, hər bir vektor faylı formatı fərqli olduğu üçün hər kəsin bu məlumatları necə idarə etdikləri baxımından da fərqli olacağı üçün sualınıza qəti cavab verə biləcək. Ancaq sizə dəqiq deyə bilərəm ki, saat istiqamətində sifariş yalnız ESRI Shapefiles üçün deyil. Xarici halqalar üçün saat yönünün və daxili çuxur poliqonları üçün saat yönünün əksinə oxşar bir təyinat istifadə edən digər formatlar var. Məsələn, JTS vektor çoxbucaqlı quruluşu oxşar bir formatdan istifadə edir. Əslində burada tarixən bunun ESRI yanaşmasına bənzədiyi bildirilir. Həm də qəti şəkildə deyə bilərəm ki, yox, bütün formatlarda bu tələb yoxdur. Məsələn, GeoJSON format spesifikasiyaları, köpüklərin çoxbucaqlı formatında sıralanması ilə bağlı belə bir tələb qoymur. KML spesifikasiyası əslində belədir:

Üçün çoxbucaqlar saat yönünün tersi qaydada göstərilməlidir. Çoxbucaqlılar "sağ əl qaydalarına" riayət edirlər ki, bu da sağ əlinizin barmaqlarını koordinatların göstərildiyi istiqamətə qoyursanız, baş barmağınızın çoxbucaqlı üçün həndəsi normalın ümumi istiqamətini göstərdiyini bildirir.

Beləliklə, bütün seçimlər mövcuddur və orada həyata keçirilir. Bu vəhşi bir dünya!


Çoxbucaqlı mesh


A çoxbucaqlı mesh və ya strukturlaşdırılmamış ızgara, 3 ölçülü kompüter qrafiki və qatı modelləşdirmədə çoxyaşlı bir cisim şəklini təyin edən təpələr, kənarlar və üzlər toplusudur. Üzlər ümumiyyətlə üçbucaqlardan, dördbucaqlılardan və ya digər sadə qabarıq çoxbucaqlılardan ibarətdir, çünki bu göstərilməni asanlaşdırır, eyni zamanda daha ümumi konkav poliqonlarından və ya delikli çoxbucaqlardan ibarət ola bilər.

Çoxbucaqlı meshların işi kompüter qrafika və həndəsi modelləşdirmənin böyük bir alt sahəsidir. Müxtəlif tətbiqlər və məqsədlər üçün çoxbucaqlı meshların fərqli təsvirləri istifadə olunur. Meshlarda həyata keçirilən müxtəlif əməliyyatlar arasında Boole məntiqi, hamarlaşdırma, sadələşdirmə və digərləri ola bilər. Şəbəkə təmsilçiləri, "axın" və "mütərəqqi" meshlar, bir şəbəkə üzərindən çoxbucaqlı meshların ötürülməsi üçün istifadə olunur. Həcmli meshlar çoxbucaqlı meshlardan fərqli olaraq bir quruluşun həm səthini, həm də həcmini, çoxbucaqlı meshları isə səthi açıq şəkildə təmsil edir (həcm gizli). Çoxbucaqlı meshlar kompüter qrafikində geniş istifadə olunduğundan, şüa izi, toqquşma aşkarlanması və çoxbucaqlı meshların sərt bədən dinamikası üçün də alqoritmlər mövcuddur.


Mündəricat

Tərəflərin sayı

Çoxbucaqlar ilk növbədə tərəflərin sayına görə təsnif edilir, aşağıdakı poliqonların adlanmasına baxın.

Qabarıqlıq

Çoxbucaqlar qabarıqlıq dərəcəsi ilə xarakterizə edilə bilər:

  • Qabarıq: çoxbucaqlının içindən çəkilən hər hansı bir xətt (və ya kənara və ya küncə toxunmayan) sərhədini tam iki dəfə qarşılayır.
  • Qabarıq deyil: sərhədinə iki dəfədən çox uyğun gələn bir xətt tapıla bilər.
  • Sadə: çoxbucağın hüdudu öz-özünə keçmir. Bütün qabarıq poliqonlar sadədir.
  • İçbükey: Qabarıq olmayan və sadədir.
  • Ulduz formalı: bütün daxili bir nöqtədən, heç bir kənardan keçmədən görünür. Çoxbucaq sadə olmalıdır və qabarıq və ya içbükey ola bilər.
  • Öz-özünə kəsişən: çoxbucaqlının sərhədi özünü keçir. Branko Grünbaum bunları çağırır coptic, baxmayaraq ki, bu müddət geniş istifadə olunmur. Müddət kompleks bəzən əksinə olaraq istifadə olunur sadə, lakin bu, a fikri ilə qarışıqlığa səbəb olur kompleks çoxbucaqlı iki kompleks ölçüdən ibarət kompleks Hilbert müstəvisində mövcud olan biri kimi.
  • Ulduz çoxbucaqlı: nizamlı bir şəkildə öz-özünə kəsişən bir çoxbucaqlı.

Simmetriya

  • Bərabərbucaqlı: bütün künc açıları bərabərdir.
  • Dövri: bütün künclər tək bir dairənin üzərində uzanır.
  • Isogonal və ya vertex-keçid: bütün künclər eyni simmetriya orbitindədir. Çoxbucaqlı da döngə və bərabərbucaqlıdır.
  • Bərabər tərəfli: bütün kənarları eyni uzunluqdadır. (5 və ya daha çox tərəfi olan bir çoxbucaqlı ola bilər bərabər tərəfli Olmadan qabarıq.) (Williams 1979, s. 31-32)
  • İzotoksal və ya kənar keçid: hər tərəf eyni simmetriya orbitində yerləşir. Çoxbucaq eyni tərəflidir.
  • Daimi. Bir çoxbucaqlı, hər ikisidirsə müntəzəmdir Dövribərabər tərəfli. Qabarıq olmayan müntəzəm poliqona a deyilir müntəzəm ulduz çoxbucağı.

Müxtəlif

  • Düzbucaqlı: tərəfləri düz açılarla birləşən çoxbucaqlı, yəni bütün daxili açıları 90 və ya 270 dərəcədir.
  • Monoton müəyyən bir sətirlə əlaqədar olaraq L, L-ə dik olan hər bir xətt çoxbucağı iki dəfədən çox keçməsə.

Təklif olunan bəzi üsullar, hilal kimi qabarıq olmayan çoxbucaqlı vəziyyətdə uğursuz olacaqdır. Budur, qabarıq olmayan çoxbucaqlılarla işləyəcək sadə bir rəqəm (səkkiz rəqəm kimi öz-özünə kəsişən çoxbucaqla da işləyəcək, sizə olub olmadığını söyləyin əsasən saat yönünde).

Kənarları cəmləyin, (x2 - x1) (y2 + y1). Nəticə müsbətdirsə döngə saat yönünün, mənfi olarsa əyri saat yönünün əksidir. (Nəticə +/- konvensiyası ilə qapalı sahənin iki qatına bərabərdir.)

Başqa bir həll yolu atacağam, çünki sadə və riyazi baxımdan intensiv deyil - sadəcə əsas cəbrdən istifadə edir. Çoxbucağın işarələnmiş sahəsini hesablayın. Əgər mənfi olarsa, ballar saat əqrəbi sırası ilə, müsbətdirsə əksinədir. (Bu, Beta həllinə çox oxşayır.)

Qeyd edək ki, yalnız sifarişi yoxlayırsınızsa, 2-yə bölməkdən əziyyət çəkməyinizə ehtiyac yoxdur.

Ən kiçik y (və əlaqələr varsa ən böyük x) olan zirvəni tapın. Zirvəsi A, siyahıdakı əvvəlki zirvəsi B, siyahısındakı sonrakı zirvəsi C olsun. İndi hesablayın işarəsi AB və AC-nin çarpaz məhsulunun.

Çarpaz məhsul iki vektorun dik dərəcəsini ölçür. Çoxbucağınızın hər kənarının üç ölçülü (3-D) xyz fəzanın x-y müstəvisindəki bir vektor olduğunu düşünün. Ardından iki ardıcıl kənarın çarpaz məhsulu z istiqamətində bir vektordur, (ikinci seqment saat yönündədirsə müsbət z istiqaməti, əks istiqamətdə olarsa mənfi z istiqaməti). Bu vektorun böyüklüyü, iki orijinal kənar arasındakı bucağın sinusu ilə mütənasibdir, buna görə dik olduqda maksimuma çatır və kənarları kollinear olduqda (paralel) yoxa çıxır.

Beləliklə, çoxbucağın hər təpəsi (nöqtəsi) üçün iki bitişik kənarın çarpaz məhsul böyüklüyünü hesablayın:

Buna görə kənarları ardıcıl olaraq etiketləyin
kənar A nöqtədən 0-a və 1-ə qədər olan seqmentdir
nöqtə 1-dən nöqtə2-ə qədər
.
kənar E nöqtə4 ilə nöqtə0 arasındadır.

Daha sonra Vertex A (point0) arasındadır
edgeE [Nöqtədən 4-ə qədər]
edgeA [Nöqtədən 0-a, nöqtəyə1 ”

Bu iki kənar özləri x və y koordinatları başlanğıc və bitmə nöqtələrinin koordinatlarını çıxarmaqla təyin edilə bilən vektorlardır:

kənarE = nöqtə0 - nöqtə4 = (1, 0) - (5, 0) = (-4, 0) və
kənar A = nöqtə1 - nöqtə0 = (6, 4) - (1, 0) = (5, 4) və

Və bu iki bitişik kənarın çarpaz məhsulu, iki vektorun koordinatlarını üç koordinat oxunu (i, j, & amp k) təmsil edən simvolların altına qoyaraq qurulan aşağıdakı matrisin determinantından istifadə edərək hesablanır. Üçüncü (sıfır) qiymətli koordinat, çarpaz məhsul konsepsiyasının 3 ölçülü bir quruluş olduğu üçün var və buna görə çarpaz məhsulu tətbiq etmək üçün bu 2 ölçülü vektorları 3 ölçüyə uzatırıq:

Bütün çarpaz məhsulların vurulan iki vektorun müstəvisinə dik bir vektor yaratdığını nəzərə alsaq, yuxarıdakı matrisin determinantının yalnız k, (və ya z oxu) komponenti vardır.
K və ya z oxu komponentinin böyüklüyünü hesablamaq üçün düstur
a1 * b2 - a2 * b1 = -4 * 4 - 0 * 1 = -16

Bu dəyərin böyüklüyü (-16), 2 orijinal vektor arasındakı bucağın sinus ölçüsüdür və 2 vektorun böyüklüyünün məhsulu ilə vurulur.
Əslində, dəyəri üçün başqa bir düstur
A X B (Çapraz Məhsul) = | A | * | B | * günah (AB).

Beləliklə, yalnız bir açı ölçüsünə qayıtmaq üçün bu dəyəri (-16) iki vektorun böyüklüyünün məhsuluna bölmək lazımdır.

Deməli günahın ölçüsü (AB) = -16 / 16.4924 = -.97014.

Bu, təpədən sonra növbəti seqmentin sola və ya sağa əyildiyini və nə qədər olduğunun ölçüsüdür. Qövs sinusu götürməyə ehtiyac yoxdur. Bizi maraqlandıracaq olan yalnız onun böyüklüyü və əlbətdə işarəsidir (müsbət və ya mənfi)!

Qapalı yolun ətrafındakı digər 4 nöqtənin hər biri üçün bunu edin və hər hesaba bu hesablamanın dəyərlərini əlavə edin.

Son cəm müsbətdirsə, saat yönünün tersi istiqamətində, mənfi, əksinə getmisiniz.


Mümkün hər giriş üçün işləyəcək bir 3D meshın sarma qaydasını avtomatik olaraq çıxarmaq üçün bir yol yoxdur.

Məsələn, sizə (0, 0, 0), (1, 0, 0), (0, 1, 0) üçbucağını başqa bir kontekst olmadan təkbaşına versəm, bunun yara sayğacının olub olmadığını bilmirsiniz -saat tersi istiqamətində (beləliklə ön tərəf z oxu boyunca uzanır) və ya saat yönündə (beləliklə ön tərəf z + ox boyunca uzanır). (Sol əlli bir koordinat sistemi varsayırıq, ancaq koordinat sistemi də sağ əlli ola bilər və hər şeyi çevirir)

Bunların hər ikisi etibarlı şərhlər ola bilər və yaradıcıdan soruşmalı və ya mesh formatı və ya hansı versiyanın nəzərdə tutulduğunu müəyyənləşdirmək üçün nəyi təmsil etməsi barədə bir az məlumat istifadə etməlisiniz.

Ancaq daha yüksək bir inamla doğru üzləşməni çıxara biləcəyimiz ümumi bir xüsusi vəziyyət var: əgər meshlarınız möhkəm cisimləri təmsil edirsə və sızdırmaz manifold geometriniz varsa. (Bu o deməkdir ki, mesh deşik, boşluq, boş kənar və ya tək tərəfli üzgəclər olmadan davamlı bir səth düzəldir)

Əgər belə bir meshunuz varsa, onun dolamağını təxmin edə bilərsiniz, o zaman hər bir çoxbucağın ön üzünü içəridən çox, bərk maddənin "xaricinə" baxıb qoyduğunu görərək bu təxminin mənalı olub olmadığını yoxlayın. (Ancaq unutmayın: müxtəlif effektlər üçün qəsdən içəriyə çevrilmiş meshlar düzəltdiyimiz nadir hallar var, bu səbəbdən bu test də axmaq deyil!)

Özbaşına bir üçbucaq / poliqon seçin

Bu çoxbucağı normal olaraq təxmin etdiyiniz dolama görə qurun

O çoxbucaqlı bir nöqtədən normalın əksinə istiqamətdə bir şüa atın. Bu şüanı meshdakı hər çox poliqona qarşı sınayın (bu bahalı ola bilər)

Qeyri-adi bir hit (başqa bir çoxbucaqlının arxasına, daha sonra birinin önünə, sonra birinin arxasına və ya hər hansı bir ön arxa cütə vurmaq) vurursanız, sarma tahmininiz düzgün görünür. Bu möhkəm bir forma atəş edərkən görmək istədiyimiz nümunədir.

Cüt bir hit əldə etsəniz, ehtimal ki, sarma tahmininiz səhv idi və bunun əvəzinə əks sarğı istifadə etməlisiniz.

Konsensus yaratmaq üçün meshdakı bir neçə fərqli nümunə çoxbucağı üçün bu testi apara bilərsiniz və tək tərəfli yarpaq üzgəcləri kimi çoxsaylı həndəsə sayəsində yabanı otlardan təmizlənməyə çalışa bilərsiniz.

Gördüyünüz kimi, bu növ üçün hansı sargının standart olduğunu müəyyən etmək üçün həndəsə mənbəyinizin formatını yoxlamaq və ya mesh düzəldəndən soruşmaqdan daha çox işdir və daha az zəmanətə malikdir.

(Mən əvvəlcə bu işi atladım, çünki normal istehsal etmək istədiyinizi dediniz və bunları giriş kimi təqdim etdiyinizi qeyd etmədiniz. Ancaq tamlıq üçün.)

Mesh normal vektorlara malikdirsə, sonra bunları nəzərdə tutulan ön baxış istiqaməti üçün əsas həqiqət kimi istifadə edə bilərsiniz (modelin yaradıcısı əllə tənzimlənmiş normallarla çox qəribə bir şey etməməsi şərti ilə).

Söyləyin ki, nöqtələri a, b, c olan üçbucağınız var

Çarpaz məhsulu götürərək üçbucağınızın gözlənilən normasını hesablayın:

İndi bunu meshınızla gələn normallarla müqayisə edin (meshunuzun hər bir təpəsinə görə müəyyən edilmiş normaları varsa, üçbucağın normal bir üçbucağı əldə etmək üçün bir üçbucaq üçün üç təpə normalını ortalama edə bilərsiniz. Və ya müəyyən bir sərhəddə olan üçbucaqlar üçün bütün gözlənilənNormal dəyərləri ortalama edə bilərsiniz. vertex normal bir vertex almaq üçün)

Razılaşma & gt 0 olarsa, mesh sağ tərəfli bir koordinat sistemində normal vəziyyətinə baxarkən saat yönünün əksinə və ya sol əl koordinat sistemindəsinizsə saat əqrəbi istiqamətində sarılır. Razılaşma & lt 0 olarsa, mesh sağ əlli bir koordinat sistemində saat yönünə və ya sol əl koordinat sistemindəsinizsə saat yönünün əksinə sarılır. Razılaşma sıfırsa, test bu üçbucaq üçün nəticəsizdir (kimsə giriş normalarını sıfıra yaxın və ya nədənsə səthə paralel yaxınlaşdırdı) və meshun fərqli bir hissəsi ilə yenidən cəhd edə bilərsiniz.


AsSVG ¶

Tək bir coğrafi sahəni və ya ifadəni qəbul edir və həndəsənin Ölçeklenebilir bir Vektor Qrafikasını (SVG) qaytarır.

Açar söz mübahisəsi Təsvir
nisbi Doğru olaraq ayarlanarsa, yol məlumatları nisbi hərəkətlər baxımından həyata keçiriləcəkdir. Varsayılanlar False, bunun əvəzinə mütləq hərəkətlərdən istifadə olunduğu anlamına gəlir.
dəqiqlik Bu açar söz, SVG nümayəndəliyindəki koordinatlar üçün əhəmiyyətli rəqəmlərin sayını təyin etmək üçün istifadə edilə bilər - standart dəyər 8-dir.


3 Cavablar 3

Sualınız kifayət qədər dəqiq deyil. Bir sıra nöqtələr bir istinad nöqtəsinə nisbətən yalnız "saat yönünde" və ya "saat yönünün əksinə" olur. Əks təqdirdə, üç nöqtədən ibarət olan bir sıra həmişə CW və ya CCW ola bilər. Aşağıdakı şəkilə baxın: solda, nöqtələr sağda, saat yönünün tersi ilə eyni nöqtələr sıralanır.

Sizin vəziyyətinizdə, nöqtələrin baryenterentini istinad nöqtəsi olaraq istifadə etməyi məqsədəuyğun hesab edirəm.

Naməlum sayda nöqtə üçün yaxşı bir metod aşağıdakı ola bilər:

  • qoy P [0], P [1],. P [n-1] sıralanacaq nöqtələrin siyahısı
  • M bütün nöqtələrin mərkəz mərkəzidir
  • a [0], a [1], hesablayın. a [n-1] elə bir [i] = atan2 (P [i] .y - M.y, P [i] .x - M.x)
  • məsələn qsort istifadə edərək nöqtələri dəyərinə görə sıralayın.

Bununla birlikdə, yaxşı bir çeşidləmə alqoritminin müvəqqəti metodla müqayisədə üç giriş dəyəri ilə zəif performans göstərəcəyinə əmin ola bilərsiniz. Atan2 istifadə etmək hələ də etibarlıdır, ancaq qsort istifadə etməyin.

İnanıram ki, burada həqiqətən soruşduğunuz şey, sınamaq üçün olduqca sadə olan üçbucağın sarma qaydasıdır.

Üçbucağınızda yalnız üç nöqtə olduğundan, üçbucağınız onsuz da ya saat yönünde, ya da əks istiqamətdədir və buna görə də etməlisiniz ki, bu ikisindən hansının olduğunu yoxlayın və sargı varsa göstəricilərin sırasını tərs çevirin. istədiyiniz biri deyil.

Üçbucağın üç ucunun olduğunu düşünərək ümumi fikir budur a, bcvə sadə bir vektor çıxarma əməliyyatına sahib olduğunuz:

Diqqət yetirin ki, + y oxunuzu (yuxarı və ya aşağı) hansı istiqamətə yönəltdiyinizə görə, "saat əqrəbi" və "saat əqrəbinin əksinə" halları bu nümunə kodundakı şərhlərdə necə etiketlədiyimdən geri çevrilə bilər.

Daha çox məlumat verə bilərsiniz? CCW bal sırasını istəyirsən, amma sifariş mərkəzi hansı nöqtə olmalıdır?

Təyyarədə yalnız üçbucağınız varsa (3 nöqtə), müəyyənləşdiricini matrisdən hesablaya bilərsiniz, burada xətlər nöqtələrin koordinatlarıdır (3-cü koordinat 1-dir). Determinant> 0 olduqda, nöqtələr CCW sırasındadır. Əks təqdirdə, məsələn, son iki nöqtəni dəyişdirə bilərsiniz və CCW sifarişini alacaqsınız.

A, B, C nöqtələriniz varsa, matrisiniz belə görünür:

Müəyyənedici: xA * yB + xB * yC + xC * yA - yB * xC - yC * xA - yA * xB. Sonra sıfırla müqayisə edə bilərsiniz. > 0 olduqda A, B, C nöqtələrini qaytarın, olmasa A, C, B qayıdın.

Əgər nöqtələriniz varsa və bilirsinizsə, onlar qabarıq çoxbucaqlı düzəldirlər (hamısı qabarıq gövdənin bir hissəsidir) və onların qaydalarını almaq istəyirsinizsə, Graham Scan və ya Jarvis's March istifadə edə bilərsiniz (bunlar bir çox nöqtədən qabarıq gövdə tapmaq üçün alqoritmlərdir, lakin burada da işləməlidir :))


Sintaksis

Hüceyrələrin çıxarılacağı giriş rasteri.

Çıxarılan giriş rasterinin sahəsini təyin edən çoxbucaqlı (və ya çoxbucaqlı).

Hər bir çoxbucaqlı hissə, Point sinifləri tərəfindən təyin olunan zirvələrin siyahısıdır. Nöqtələr giriş rasteri ilə eyni xəritə vahidlərində x, y koordinat cütləri olaraq təyin olunur.

Bir çoxbucaq üçün obyektin forması belədir:

İstəyə görə çoxbucaqlı hissələrin siyahısını təyin etmək üçün bir çoxbucaqlı sinifindən istifadə edərək çoxsaylı çoxbucaqlı qrup müəyyən edilə bilər. Bunu etmək üçün bütün hissələri bitişik olmalı və beləliklə tək bir perimetr forması ilə əhatə olunmalıdır. Bu vəziyyətdə obyektin forması aşağıdakı kimi bitişik bir siyahıda olardı:

Bütün hallarda, hər bir çoxbucaqlı hissə üçün son koordinat onu bağlamaq üçün ilk ilə eyni olmalıdır.

Giriş poliqonunun daxilində və ya xaricində hüceyrələrin çıxarılmasını müəyyənləşdirir.

  • INSIDE —Çıxış poliqonunun içərisində yalnız hüceyrələrin seçilməli və çıxış rasterinə yazılmalı olduğunu göstərən bir söz. Çoxbucaqlı xaricindəki bütün hüceyrələr çıxış rasterində NoData dəyərləri alacaqlar.
  • OUTIDE — Giriş poliqonunun xaricindəki hüceyrələrin seçilməli və çıxış rasterinə yazılması lazım olduğunu göstərən bir söz. Çoxbucağın içərisindəki bütün hüceyrələr NoData alacaqlar.

Qaytarma Dəyəri

Giriş rasterindən çıxarılan xana dəyərlərini ehtiva edən çıxış rasteri.


Sintaksis

Hüceyrələrin çıxarılacağı giriş rasteri.

Çıxarılacaq giriş rasterinin sahəsini təyin edən çoxbucaqlı (və ya çoxbucaqlı).

Hər bir çoxbucaqlı hissə, Point sinifləri tərəfindən təyin olunan zirvələrin siyahısıdır. İstəyə görə bir çoxbucaqlı sinif çoxbucaqlı hissələrin siyahısını təyin etmək üçün istifadə edilə bilər.

Nöqtələr giriş rasteri ilə eyni xəritə vahidlərində x, y koordinat cütləri olaraq təyin olunur. Obyektin forması:

Bir çoxbucağı bağlamaq üçün son koordinat birincisi ilə eyni olmalıdır.

Giriş poliqonunun daxilində və ya xaricində hüceyrələrin çıxarılmasını müəyyənləşdirir.

  • INSIDE - Giriş poliqonunun içərisindəki hüceyrələrin seçilməli və çıxış rasterinə yazılması lazım olduğunu göstərən bir söz. Çoxbucaqlı xaricindəki bütün hüceyrələr çıxış rasterində NoData dəyərləri alacaqlar.
  • Çöldə - Giriş poliqonundan kənarda olan hüceyrələrin seçilməli və çıxış rasterinə yazılması lazım olduğunu göstərən bir söz. Çoxbucaq içərisindəki bütün hüceyrələr çıxış rasterində NoData dəyərləri alacaqlar.

Qaytarma Dəyəri

Giriş rasterindən çıxarılan xana dəyərlərini ehtiva edən çıxış rasteri.


JavaScript 3.36 üçün ArcGIS API

Müştəri tərəfindəki həndəsə mühərriki. Aşağıdakı metodlardan hər hansı biri üçün birdən çox həndəsə tələb olunursa, metodun gözlənildiyi kimi işləməsi üçün bütün həndəsələrin eyni məkan istinadına sahib olması lazımdır. Bir kod nümunəsi üçün birləşmə metoduna baxın.

Məlum məhdudiyyət: Bu sinif yalnız AMD tərzi kodlaşdırma sintaksisindən istifadə edərək dəstəklənir.

Nümunələr

Metodlar

AdQayıdış növüXülasə
bufer (həndəsə, məsafə, vahid, birlik Nəticələr?) Poliqon | Poliqon [] Giriş həndəsələri ətrafında müəyyən məsafədə düzbucaqlı (və ya Öklid) bufer poliqonları yaradır.
klip (həndəsə, zərf) Həndəsə Bir zərflə hədəf həndəsədən kəsilmiş həndəsəni hesablayır.
ehtiva edir (konteynerGeometriya, daxiliGeometry) Mantiq Bir həndəsədə başqa bir həndəsə olub olmadığını göstərir.
convexHull (həndəsə, birləşmə?) Həndəsə | Həndəsə [] Giriş həndəsəsinin qabarıq qabığını hesablayır.
xaçlar (həndəsə1, həndəsə2) Mantiq Bir həndəsənin digər həndəsəni keçdiyini göstərir.
kəsmək (həndəsə, kəsici) Həndəsə [] Giriş Polyline və ya Polygon'u bir kəsmə Polyline keçdiyi yerdə bölün.
sıxlaşdırmaq (həndəsə, maxSegmentLength, maxSegmentLengthUnit) Həndəsə Mövcud təpələr arasında nöqtələr düzəldərək həndəsələri sıxlaşdırın.
fərq (inputGeometry, subtractor) Həndəsə | Həndəsə [] İki həndəsənin fərqini yaradır.
ayrılma (həndəsə1, həndəsə2) Mantiq Bir həndəsənin başqa bir həndəsə ilə ayrıldığını (heç bir şəkildə kəsişmədiyini) göstərir.
məsafə (həndəsə1, həndəsə2, məsafəUnit) Sayı İki həndəsə arasındakı ən qısa düz məsafəni hesablayır.
bərabərdir (həndəsə1, həndəsə2) Mantiq İki həndəsənin bərabər olub olmadığını göstərir.
genişləndirilmişSpatialReferenceInfo (məkanReference) Obyekt Giriş məkan referansı haqqında əlavə məlumat olan bir obyekti qaytarır.
flipHorizontal (həndəsə, flipOrigin?) Həndəsə Üfüqi oxda bir həndəsi çevirir.
flipVertical (həndəsə, flipOrigin?) Həndəsə Şaquli oxda bir həndəsi çevirir.
ümumiləşdirmək (həndəsə, maxDeviation, removeDegenerateParts?, maxDeviationUnit?) Həndəsə Kursordakı həndəsələr üzərində ümumiləşdirmə əməliyyatını yerinə yetirir.
geodeziya ərazisi (həndəsə, vahid) Sayı Giriş həndəsəsinin sahəsini hesablayır.
geodesicBuffer (həndəsə, məsafə, vahid, birlik Nəticələr?) Poliqon | Poliqon [] Giriş həndəsələri ətrafında müəyyən bir məsafədə geodeziya bufer poliqonları yaradır.
geodezikDensify (həndəsə, maxSegmentLength, maxSegmentLengthUnit?) Həndəsə Giriş həndəsəsinin geodeziya baxımından sıx bir versiyasını qaytarır.
geodezik uzunluq (həndəsə, vahid) Sayı Giriş həndəsəsinin uzunluğunu hesablayır.
kəsişmək (həndəsə, kəsişmə) Həndəsə | Həndəsə [] İki həndəsə ilə kəsişmə yolu ilə yeni bir həndəsə yaradır.
kəsişir (həndəsə1, həndəsə2) Mantiq Bir həndəsənin digər həndəsə ilə kəsişdiyini göstərir.
isSimple (həndəsə) Mantiq Verilən həndəsənin topoloji cəhətdən sadə olub olmadığını göstərir.
nearestCoordinat (həndəsə, inputPoint) Obyekt Göstərilən nöqtəyə ən yaxın olan həndəsənin koordinatını tapır.
nearestVertex (həndəsə, inputPoint) Obyekt Göstərilən nöqtəyə ən yaxın olan həndəsədə vertex tapır.
nearestVertices (həndəsə, inputPoint, searchRadius, maxVertexCountToReturn) Obyekt [] Müəyyən olunmuş nöqtədən verilmiş məsafədəki, ən ucundan ən uzağa qədər çeşidlənmiş bütün zirvələri tapır və bir sıra obyekt kimi qaytarır.
ofset (həndəsə, ofsetDistance, offsetUnit, joinType, bevelRatio?, flattenError?) Həndəsə | Həndəsə [] Ofset əməliyyatı giriş polilinindən və ya çoxbucaqlından sabit bir düzənlik məsafəsi olan bir həndəsə yaradır.
üst-üstə düşür (həndəsə1, həndəsə2) Mantiq Bir həndəsənin digər həndəsə ilə üst-üstə düşməməsini göstərir.
planarArea (həndəsə, vahid) Sayı Giriş həndəsəsinin sahəsini hesablayır.
planarLength (həndəsə, vahid) Sayı Giriş həndəsəsinin uzunluğunu hesablayır.
əlaqələndirmək (həndəsə1, həndəsə2, münasibət) Mantiq Verilən DE-9IM münasibətinin iki həndəsə üçün uyğun olub olmadığını göstərir.
döndür (həndəsə, bucaq, fırlanmaOrigin?) Həndəsə Həndəsəni müəyyən bir bucaqla döndərir.
sadələşdirmək (həndəsə) Həndəsə Verilən həndəsələrin təriflərini həndəsə növlərinə görə topoloji baxımdan qanuni etmək üçün dəyişdirən həndəsə üzərində sadələşdirmə əməliyyatını həyata keçirir.
simmetrikFərq (solGeometriya, sağGeometry) Həndəsə | Həndəsə [] İki həndəsənin simmetrik fərqini yaradır.
toxunuşlar (həndəsə1, həndəsə2) Mantiq Bir həndəsənin başqa bir həndəsəyə toxunduğunu göstərir.
birləşmə (həndəsələr) Həndəsə Bütün girişlər eyni həndəsə tipində olmalı və bir məkan istinadını paylaşmalıdır.
daxilində (daxiliGeometriya, xariciGeometry) Mantiq Bir həndəsənin başqa bir həndəsə içində olub olmadığını göstərir.

Bufer (həndəsə, məsafə, vahid, birlik Nəticələr?)

Giriş həndəsələri ətrafında müəyyən məsafədə düzbucaqlı (və ya Öklid) bufer poliqonları yaradır.


Videoya baxın: Test toplusu. Çoxbucaqlılar. Dördbucaqlılar. Qabarıq çixbucaqlı. Düzgün çoxbucaqlı. (Oktyabr 2021).