एक हेक्स ग्रिड का भंडारण


10

मैं यूनिटी 3 डी के लिए एक छोटा हेक्स ग्रिड ढांचा बना रहा हूं और निम्नलिखित दुविधा में आ गया हूं। यह मेरी समन्वय प्रणाली है ( यहाँ से ली गई है ):

यहाँ छवि विवरण दर्ज करें

यह सब बहुत अच्छी तरह से काम करता है इस तथ्य को छोड़कर मुझे नहीं पता कि इसे कैसे संग्रहीत किया जाए। मैं मूल रूप से इसे 2 डी सरणी में संग्रहीत करने और अपने मानचित्र बनाने के लिए छवियों का उपयोग करने का इरादा रखता हूं।

एक समस्या यह थी कि इसमें नकारात्मक मूल्य थे (यह आसानी से निर्देशांक को थोड़ा ऑफसेट करके तय किया गया था)।

हालांकि, इस समन्वय प्रणाली के कारण, इस तरह की छवि या बिटमैप को हीरे के आकार का होना पड़ता है - और चूंकि ये संरचनाएं चौकोर आकार की होती हैं, इससे बहुत सारे सिरदर्द हो जाते हैं, भले ही मैं एक साथ कुछ हैक कर लूं। क्या ऐसा कुछ है जो मुझे याद आ रहा है जो इसे ठीक कर सकता है? मुझे एकता मंचों में इस बारे में एक मंच पोस्ट देखकर याद आया लेकिन मैं अब लिंक नहीं ढूंढ सकता।

क्या समन्वयक अनुवादकों का एक सेट यहाँ सबसे अच्छा समाधान लिख रहा है?

अगर आप लोग सोचते हैं कि यह मददगार होगा, तो मैं अपनी समस्या का कोड और चित्र पोस्ट कर सकता हूं।


1
क्या आप सिर्फ PNG छवियों को नहीं बचा सकते हैं जो कि हेक्सागोन्स के आसपास पारदर्शी हैं?
मार्कस वॉन ब्रॉडी

Pngs और सरणियों को सहेजने के साथ मेरी मुख्य समस्या "व्हॉट्सएप" की मात्रा है जो इस समन्वय प्रणाली को अक्षुण्ण रखने के लिए उन्हें शामिल करना होगा।
PeeC

1
यदि "व्हाट्सएप" का अर्थ पारदर्शी पिक्सेल है, तो यह एक समस्या क्यों है?
मार्कस वॉन ब्रॉडी

यह बहुत अच्छी बात है। अधिकांश छवि प्रारूप दोहराए गए पैटर्न को संग्रहीत करने में बहुत अधिक स्मृति बर्बाद नहीं करते। लेकिन फिर भी, यह मुझे थोड़ा गुस्सा दिलाता है कि इस नक्शे को स्टोर करने के लिए मैं इस मेमोरी का उपयोग कर रहा हूं (ग्रे पिक्सल खाली जगह है, अन्य रंग वैध हेक्स निर्देशांक हैं)।
PeeC

1
ओह, आप ग्रिड डेटा स्टोर कर रहे हैं, टाइल इमेज नहीं! आप अपनी डेटा संरचनाओं (ग्रिड) को केवल एक बाइनरी फ़ाइल में क्यों नहीं सहेजेंगे, या उदाहरण के लिए JSON का उपयोग करके इसे एनकोड करें और टेक्स्ट फ़ाइल में सहेजें? मैं एकता की क्षमताओं को नहीं जानता, हालांकि। इसके अलावा, आप इसकी पुष्टि करना चाहते हैं, लेकिन मेरा मानना ​​है कि PNG प्रारूप में एक ही रंग का एक क्षेत्र अनुकूलित (शिथिल संपीड़ित) है।
मार्कस वॉन ब्रॉडी

जवाबों:


9

आपके द्वारा उपयोग किए जा रहे समानांतर चतुर्भुज निर्देशांक के साथ काम करना आसान है, लेकिन उनके पास आयताकार नक्शे के लिए अजीब होने का दोष है। एक दृष्टिकोण इसे ऑफसेट निर्देशांक के साथ संग्रहीत करना है लेकिन वास्तव में आपके गेम लॉजिक में समांतर चतुर्भुज निर्देशांक का उपयोग करना है।

अवलोकन: मानचित्र की प्रत्येक पंक्ति में, ग्रिड डेटा सन्निहित है। सभी बर्बाद जगह बाईं और दाईं ओर है।

समाधान: उस पंक्ति के भीतर, स्तंभ के बजाय बाएं स्तंभ पर शुरू होने वाले डेटा को चिह्नित करें। 0. अपने समन्वय प्रणाली में आयताकार नक्शे के पहले कॉलम की गणना करें , फिर उस कॉलम में से यह निर्धारित करें कि यह कहाँ जाता है यह निर्धारित करने के लिए समन्वय करें। यह नकारात्मक स्तंभ निर्देशांक के लिए भी काम करता है।

नक्शे के लिए गेट्टर और सेटर में रूपांतरण कुछ इस तरह से करें:

inline function get(q, r) {
    first_column_in_this_row = -floor(q/2);
    return array[r][q - first_column_in_this_row];
}

आपको निर्देशांक और नक्शे के अपने विकल्प के साथ काम करने के लिए इसे संशोधित करना होगा (एक अंतर से ध्यान देना)। कुछ लेआउट में, आप इसके विपरीत कॉलम को पंक्ति द्वारा ऑफसेट करना चाहेंगे।

आप अन्य आकृतियों के नक्शे बनाने के लिए उसी चाल का उपयोग कर सकते हैं; यह आयतों तक सीमित नहीं है।

यदि आप C या C ++ का उपयोग कर रहे हैं, तो आप इसे तेज़ बनाने के लिए सूचक अंकगणितीय का उपयोग कर सकते हैं। सरणियों को सरणी के एक सरणी को संग्रहीत करने के बजाय, उन बिंदुओं की एक सरणी को संग्रहीत करें जिन्हें द्वारा समायोजित किया गया है first_column_in_row। (यह पोर्टेबल नहीं हो सकता है)


यह काम करता है जहाँ तक मैं बता सकता हूँ, हालांकि गणित वास्तव में अजीब था। कई समीकरणों को आज़माने के बाद जो मेरे दिमाग में आया, मैं yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)कुछ परीक्षण और त्रुटि के बाद सुलझा । यह कठिन कैसे काम करता है कोई पता नहीं।
PeeC

वह बना लो yIndex = y-((x%2==0)?(-x/2):(-x/2)-1)। x / 2 सभी पूर्णांक-आधारित btw है ताकि फर्श की कोई आवश्यकता न हो।
PeeC

6

व्यक्तिगत रूप से, मैं स्मृति को बचाने के लिए सादगी पसंद करूंगा। जरूरत पड़ने तक अनुकूलित न करें!

यदि आप अभी भी कुछ बाइट्स बचाने पर तुले हुए हैं, तो यहां बताया गया है कि आप यह कैसे कर सकते हैं:

यहाँ छवि विवरण दर्ज करें

  1. आधे समांतर चतुर्भुज को दो दाएं त्रिकोण बनाने के लिए स्लाइस करें
  2. आयत बनाने के लिए दो त्रिकोणों को फिर से व्यवस्थित करें।
  3. (नोट मैंने हरे रंग की बफर पट्टी को जोड़ा है ताकि गणित अच्छी तरह से काम करे।)

आयत को मैप करने के लिए पायथन कोड समानांतर चतुर्भुज निर्देशांक और पीठ के लिए निर्देशांक:

# Height of rectangle
H = 15

def r2p(x, y):
"rectangle to parallelogram"
if y < -x/2 + H:
    y = y + H
return (x - 1, y)

def p2r(x,y):
"parallelogram to rectangle"
if y >= H:
    y = y - H
return (x + 1, y)

2
आप केवल पिक्सेल को लंबवत रूप से नीचे ले जा सकते हैं - उस छवि परoffsetY = Math.floor ( (x+1)/2 )
मार्कस वॉन ब्रॉडी

1

यह आपके नक्शे को विकृत करने के लिए आवश्यक नहीं है, क्योंकि आयताकार और "विहित" निर्देशांक के बीच रूपांतरण त्वरित और आसान है। यह कैसे करना है पर एक परिचय के लिए एक कड़ी है:

आयताकार और कैनोनिकल हेक्स के बीच रूपांतरण निर्देशांक

यह तकनीक गणना किए गए रूपांतरणों के कैशिंग के साथ आलसी निष्कासन को जोड़ती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.