একটি হেক্স গ্রিড সংরক্ষণ করা হচ্ছে


10

আমি ইউনিটি 3 ডি এর জন্য একটি ছোট্ট হেক্স গ্রিড ফ্রেমওয়ার্ক তৈরি করেছি এবং নীচের দ্বিধা নিয়ে এসেছি। এটি আমার সমন্বয় ব্যবস্থা ( এখান থেকে নেওয়া ):

এখানে চিত্র বর্ণনা লিখুন

এটি কীভাবে সংরক্ষণ করা যায় সে সম্পর্কে আমার কোনও ধারণা নেই বাদে এটি সমস্ত সুন্দরভাবে কাজ করে। আমি মূলত এটি একটি 2 ডি অ্যারেতে সঞ্চয় করতে এবং আমার মানচিত্র তৈরি করতে ছবি ব্যবহার করার উদ্দেশ্যে।

একটি সমস্যা ছিল এটির নেতিবাচক মান ছিল (এটি কিছুটা স্থানাঙ্কগুলি অফসেট করে সহজেই সংশোধন করা হয়েছিল)।

যাইহোক, এই সমন্বিত সিস্টেমের কারণে, এই জাতীয় চিত্র বা বিটম্যাপটি হীরা আকারের হতে হবে - এবং যেহেতু এই কাঠামোগুলি বর্গাকার আকারের, তাই আমি একসাথে কিছু হ্যাক করলেও এটি প্রচুর মাথা ব্যথার কারণ হতে পারে। আমি এখানে কিছু মিস করছি যা এটি ঠিক করতে পারে? আমি regardingক্য ফোরামে এ সম্পর্কিত একটি ফোরাম পোস্ট দেখে মনে পড়েছি তবে আমি আর লিঙ্কটি খুঁজে পাচ্ছি না।

সমন্বিত অনুবাদকদের একটি সেট লেখাই কি এখানে সেরা সমাধান?

আপনি যদি মনে করেন এটি সহায়ক হবে তবে আমি আমার সমস্যার কোড এবং চিত্র পোস্ট করতে পারি।


1
আপনি কি কেবল পিএনজি চিত্রগুলি সংরক্ষণ করতে পারবেন না যা হেক্সাগনগুলির চারপাশে স্বচ্ছ?
মারকাস ভন ব্রডি

পিএনজি এবং অ্যারেগুলিতে সঞ্চয় করার ক্ষেত্রে আমার প্রধান সমস্যা হ'ল এই স্থানাঙ্কিত ব্যবস্থাটি অক্ষত রাখার জন্য তাদের "হোয়াইটস্পেস" পরিমাণটি থাকতে হবে।
PeeC

1
যদি "হোয়াইটস্পেস" এর অর্থ স্বচ্ছ পিক্সেল হয়, তবে কেন এটির পরিমাণ একটি সমস্যা?
মার্কাস ভন ব্রডি

এটি একটি খুব ভাল পয়েন্ট। বেশিরভাগ চিত্রের ফর্ম্যাটগুলি পুনরাবৃত্ত নিদর্শনগুলি সংরক্ষণ করে এমন মেমরির অপচয় করে না। তবে তবুও, এটি আমাকে সামান্য বিরক্ত করেছে যে এই মানচিত্রটি সঞ্চয় করতে আমি এই প্রচুর স্মৃতি ব্যবহার করছি (ধূসর পিক্সেল খালি স্থান, অন্যান্য রঙগুলি বৈধ হেক্স স্থানাঙ্ক)।
PeeC

1
ওহ, আপনি গ্রিড ডেটা সংরক্ষণ করছেন, টাইল ইমেজ নয়! আপনি কেন কেবলমাত্র আপনার ডেটা স্ট্রাকচার (গ্রিড) বাইনারি ফাইলে সংরক্ষণ করবেন না, বা উদাহরণস্বরূপ JSON ব্যবহার করে এনকোড করবেন এবং কোনও পাঠ্য ফাইলে সংরক্ষণ করবেন না? যদিও আমি ইউনিটির ক্ষমতা জানি না। এছাড়াও, আপনি এটি নিশ্চিত করতে চাইতে পারেন, তবে আমি বিশ্বাস করি যে একই রঙের একটি অঞ্চল পিএনজি ফর্ম্যাটে অনুকূলিত (looseিলে .ালা সংক্ষেপিত)।
মারকাস ভন ব্রোডি

উত্তর:


9

আপনি যে সমান্তরাল স্থানাঙ্কগুলি ব্যবহার করছেন তার সাথে কাজ করা আরও সহজ তবে আয়তক্ষেত্রাকার মানচিত্রের জন্য তাদের অদ্ভুত হওয়ার অপূর্ণতা রয়েছে। একটি পদ্ধতির অফসেট স্থানাঙ্কের সাথে এটি সঞ্চয় করা কিন্তু আসলে আপনার গেম যুক্তিতে সমান্তরাল স্থানাঙ্ক ব্যবহার করুন।

পর্যবেক্ষণ: মানচিত্রের প্রতিটি সারিতে গ্রিডের ডেটা সুসংগত। সমস্ত নষ্ট স্থান বাম এবং ডানদিকে রয়েছে।

সমাধান: এই সারির মধ্যে, 0 চিহ্নিত কলামটির পরিবর্তে বামতম কলামে শুরু হওয়া ডেটা সঞ্চয় করুন coord আপনার স্থানাঙ্ক সিস্টেমে আয়তক্ষেত্রাকার মানচিত্রের প্রথম কলামটি গণনা করুন , তারপরে অ্যারে কোথায় চলেছে তা নির্ধারণের জন্য কলাম স্থানাঙ্ক থেকে বিয়োগ করুন। এটি নেতিবাচক কলাম স্থানাঙ্কগুলির জন্যও কাজ করে।

এই জাতীয় কিছু সহ মানচিত্রের জন্য গিটার এবং সেটারে রূপান্তর সম্পাদন করুন:

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

আপনার পছন্দের স্থানাঙ্ক এবং মানচিত্রের সাথে কাজ করতে আপনাকে এটি সংশোধন করতে হবে (এক পার্থক্যের দ্বারা মনোযোগ দিন)। কিছু লেআউটে আপনি বিপরীতে পরিবর্তে সারি দ্বারা কলামগুলি অফসেট করতে চান।

অন্যান্য আকারের মানচিত্র তৈরি করতে আপনি একই কৌশল ব্যবহার করতে পারেন; এটি আয়তক্ষেত্রের মধ্যে সীমাবদ্ধ নয়।

আপনি যদি সি বা সি ++ ব্যবহার করেন তবে এটি দ্রুত করতে আপনি পয়েন্টার গাণিতিক ব্যবহার করতে পারেন। অ্যারেগুলিতে পয়েন্টারগুলির একটি অ্যারে সঞ্চয় করার পরিবর্তে, পয়েন্টারগুলির একটি অ্যারে সংরক্ষণ করুন যা দ্বারা সামঞ্জস্য করা হয়েছে first_column_in_row। (এটি পোর্টেবল নাও হতে পারে)


এটি যতদূর আমি বলতে পারি এটি কাজ করে তবে গণিতটি সত্যিই অদ্ভুত ছিল। আমার মাথায় উপলব্ধি করা বেশ কয়েকটি সমীকরণ চেষ্টা করার পরে, আমি yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)কিছু পরীক্ষা এবং ত্রুটির পরে স্থির হয়েছি । কীভাবে এটি শক্ত কাজ করে তা ধারণা নেই।
পিইসি

ওটা করে দাও yIndex = y-((x%2==0)?(-x/2):(-x/2)-1)। এক্স / 2 হ'ল সমস্ত ইন্টিজার-ভিত্তিক বিটিডব্লু তাই মেঝে লাগানোর দরকার নেই।
পিইসি

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

আপনার মানচিত্রটি বিকৃত করার প্রয়োজন নেই, কারণ আয়তক্ষেত্রাকার এবং "ক্যানোনিকাল" স্থানাঙ্কগুলির মধ্যে রূপান্তরটি দ্রুত এবং সহজ। এটি কীভাবে করা যায় তার একটি ভূমিকাটির এখানে একটি লিঙ্ক:

আয়তক্ষেত্রাকার এবং ক্যানোনিকাল হেক্স স্থানাঙ্কের মধ্যে রূপান্তর

এই কৌশলটি অলস বিচ্ছিন্নতা গণনা করে রূপান্তরগুলি ক্যাশে করার সাথে সংযুক্ত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.