পার্লিন নয়েজ বোঝা


31

আমি ডায়মন্ড স্কয়ারের সাথে কিছু কাজ করার পরে পার্লিন নয়েজের সাথে কথা বলছি। আমি হুগো ইলিয়াসের বাস্তবায়ন অনুসরণ করেছি যা মূলত, প্রতিটি সমন্বিত মান নিক্ষেপ করার জন্য ইনপুট হিসাবে এক্স, ওয়াই দিয়ে একটি ক্রিয়াকলাপ তৈরি করে।

আমার পিএইচপি কোড এখানে :

আমার দুটি প্রশ্ন আছে:

অ্যারেতে উচ্চতার মানচিত্র তৈরি করতে আমি কীভাবে অ্যালগরিদম ব্যবহার করব? আমি এটি পুরোপুরি বুঝতে পারি নি এবং কেবল পিএইচপি সিউডোকোডে পোর্ট করেছিলাম, তবে কোথাও পড়ার পরে শেষ ফাংশনটি (মানচিত্র_প্রেইন) করছিলাম যে অ্যালগরিদম "ম্যাজিকালি" আপনাকে প্রদত্ত প্রতিটি এক্স, ওয়াই পয়েন্টের জন্য স্থানান্তরিত মান দেয় (স্পষ্টতই, এর পড়া না করেই) সংলগ্ন মান), আমি এলোমেলো ফাংশন হিসাবে ব্যবহার করার সময় এটি পেয়েছিmt_rand(-100,100)/100;

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

এবং এটি ক্রিপ্টোগ্রাফিক ব্যবহার করার সময়: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;(যা, বিটিডাব্লু, পিএইচপি তে "যেমন রয়েছে" প্রয়োগ করা যেতে পারে?):

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

সুতরাং, সংক্ষেপে তিনটি প্রশ্ন:

  1. আমার কোড কি সঠিক?
  2. কোডটিতে বর্ণিত হিসাবে এলোমেলো ফাংশনটি পিএইচপিতে পোর্ট করা যেতে পারে? এটি কোনও ত্রুটি নিক্ষেপ করে, তবে ফলাফলগুলি পাওয়া যায় না।
  3. আমি কীভাবে আসলে অ্যালগরিদম ব্যবহার করব?

হালনাগাদ

ঠিক আছে, গুস্তাভসন কাগজে দেখানো কোডটির একটি পিএইচপি পোর্ট তৈরি করেছে, এবং অন্যান্য কোডার যেমন বলেছে, এটি কেবল একটি অষ্টক উত্পন্ন করে। গোলমালটির ক্রিয়াকলাপ নিয়ন্ত্রণ করতে একাধিক অক্টেভ, প্রশস্ততা, ফ্রিকোয়েন্সি ইত্যাদির ধারণাগুলি সহ এটি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে অন্য কোনও দরকারী সাইট / কাগজ / গাইড রয়েছে? গুস্তাভসনের কাগজে কেবল ফলাফলগুলি দেখানো হয়েছে, অ্যালগোরিদমের আসল বাস্তবায়ন নয়, সম্ভবত আমি কিছু মিস করছি?

আপডেট 2
@ নাথান

আমি এরকম কিছু তৈরি করেছি:

$persistence = 0.5;

for ($j = 0; $j < $size; $j++) {
    for ($i = 0; $i < $size; $i++) {

        for ($o = 0; $o < 8; $o++) {
            $frequency = pow(2,$o);
            $amplitude = pow($persistence, $o);
            $value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
            }

            //$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
            $this->mapArray[$i][$j] = new Cell($value);

এবং মানগুলি ০.১-এ স্বাভাবিক করার পরে, আমি একটি বরং নিস্তেজ উচ্চতার মানচিত্র পেয়েছি যেমন:

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

আমি কীভাবে মানচিত্র বীজ করব? সম্ভবত আমার যা বাস্তবায়নের দরকার তা হল তৃতীয় মানের একটি এলোমেলো উচ্চতা সহ 3 ডি সংস্করণ? তবে যদি তা হয় তবে আমাকে প্রতিবেশী মূল্যবোধ বিবেচনার জন্য খুঁজে বের করতে হবে, যা আমি হীরা বর্গাকার অ্যালগরিদমের মতো কিছু দিয়ে শেষ করব, ঠিক আমি কী করতে চাই না।

আপডেট 3

আরও পার্লিন কাজ। আমার ফলাফলগুলিতে গোলমালটি পরিচালনা করার জন্য আমার এখনও কোনও উপায় খুঁজে পাওয়া যায় নি। এই অষ্টক এবং চূড়ান্ত ফলাফল দেখুন:

অক্টাভা I to IV

Octave1Octave2Octave3Octave4

সংকলিত

অক্টোভাস 1-4 সংক্ষিপ্ত

প্রতিটি অষ্টক বেশ প্রায় একই। কোডটি পরীক্ষা করুন:

$persistence = 0.5;

    for ($j = 0; $j < $size; $j++) {
      for ($i = 0; $i < $size; $i++) {
        $value = 0;

        for ($o = 0; $o < 4; $o++) {
          $frequency = pow(2,$o);
          $amplitude = pow($persistence, $o);
          $value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;

        }
        $this->map[$i][$j] = new Cell($value);

ফলাফলগুলি স্বাভাবিক করা হয়। গোলমালের বিকাশে আপনি কী শক্তিশালী প্রভাব ফেলবেন? আমি উদাহরণগুলি দেখি যেখানে প্রশস্ততা পরিবর্তন করা নরম বা রুক্ষ পৃষ্ঠকে দেয় তবে আমি একটি বিশাল প্রশস্ততা দিলেও আমি সামান্য পার্থক্য দেখি।


কেবলমাত্র একসাথে একাধিক উদাহরণ যুক্ত করুন, বার বার ফ্রিকোয়েন্সি বৃদ্ধি করুন এবং প্রশস্ততা হ্রাস করুন, যেমন: পার্লিন (এক্স) + 0.5 * পারলিন (2 * এক্স) + 0.25 * পারলিন (4 * এক্স) + ... (যতগুলি অষ্টভের জন্য তুমি চাও). বিভিন্ন চেহারার জন্য আপনি উপাদানগুলি পরিবর্তনের চেষ্টা করতে পারেন; তাদের 2 এর শক্তি হওয়ার দরকার নেই
নাথান রিড

1
আপডেট-পরে, দেখে মনে হচ্ছে আপনি Y সঠিকভাবে স্কেল করছেন না - আমি পিএইচপি কর্কশ করতে খুব ক্লান্ত হয়ে পড়েছি (যেমন আমি পিএইচপি জানি না); তবে প্রথমবার পার্লিন প্রয়োগ করার সময় আমি আমার হোম জিভে একইরকম সমস্যা এনেছি। অষ্টাভাকেও হত্যা করুন এবং পার্লিনের মাত্র একটি স্তর ডিবাগ করুন।
জোনাথন ডিকিনসন

আমার তৃতীয় আপডেটের জন্য কেউ?
গ্যাব্রিয়েল এ জোরিলা

উত্তর:


28

আপনি যা প্রয়োগ করেছেন তা পার্লিনের গোলমাল নয়। হুগো ইলিয়াস কেন বলেছেন তা আমি নিশ্চিত নই, তবে সে বিভ্রান্ত। এখানে কেন পারলিন এর রেফারেন্স বাস্তবায়ন। এটি আসলে কোনও বাহ্যিক এলোমেলো সংখ্যা জেনারেটর কল করে না, তবে সিউডোর্যান্ডম গ্রেডিয়েন্ট ভেক্টর উত্পাদন করতে একটি বিল্ট-ইন হ্যাশ ফাংশন ব্যবহার করে।

আরও মনে রাখবেন যে পার্লিন শব্দের মাত্র একটি অষ্টক রয়েছে। হুগো ইলিয়াসের পরামর্শ অনুসারে একাধিক অক্টাভের (গোলমাল ফাংশনটির ছোট আকারের উদাহরণ) সংশ্লেষ করা একটি দরকারী কৌশল, তবে পার্লিন গোলমালের অংশ নয়। এটি করে আপনি যা পান তা হ'ল ফ্র্যাক্টাল গোলমাল, কখনও কখনও "ফ্র্যাক্টাল ব্রাউনিয়ান গোলমাল" (ব্রাউনিয়ান গতির সাথে অনুমিত সমীকরণের কারণে)।

যদি আপনি জ্যামিতিকভাবে বুঝতে চান যে অ্যালগোরিদম কী করছে, এই কাগজটি চেষ্টা করে দেখুন । এটি "সিমপ্লেক্স শোর" নামে একটি ভিন্ন ধরণের শব্দ সম্পর্কে, তবে এটি ক্লাসিক পার্লিন শব্দগুলির ব্যাখ্যাও অন্তর্ভুক্ত করে। ঘটনাক্রমে, সিমপ্লেক্স শব্দটি পার্লিন দ্বারা আবিষ্কার করা হয়েছিল এবং তার ক্লাসিক গোলমালের চেয়ে উন্নতি হবে বলে মনে করা হচ্ছে, আপনি যদি শব্দ শব্দগুলি নিয়ে খেলতে আগ্রহী হন তবে আপনি এটি প্রয়োগ করার চেষ্টাও করতে পারেন।


2
গুস্তাভসনের কাগজের জন্য +1। এটি এতক্ষণ আমি যে স্পষ্টভাবে দেখেছি পার্লিন এবং সিমপ্লেক্স শব্দের ব্যাখ্যা করে। স্পষ্টতই সরল শব্দের নিয়ম!
FxIII

আমি এই কাগজটি কিছু সময় আগে পেয়েছি কিন্তু হুগো আরও সহজ দেখায়। আমি এটা পড়ে শট দেব! ধন্যবাদ!
গ্যাব্রিয়েল এ জোরিলা

2
সিমপ্লেক্স শব্দটি ডাউনলোড করার সময় সতর্কতা অবলম্বন করুন, এতে কোনও ভাইরাস থাকতে পারে;)
বোবোবো

আমি জানি এটি একটি পুরানো বিষয়, তবে উল্লেখ যে রেফারেন্স প্রয়োগটি এলোমেলো নম্বর ব্যবহার করে না ভুল। যখন গ্রন্থাগারটি শুরু করা হয় (বা প্রথমবারের মতো একটি শোনার ফাংশন বলা হয়) 256 এলোমেলো গ্রেডিয়েন্ট উত্পন্ন হয়। আপনি যে হ্যাশিংয়ের কথা উল্লেখ করেছেন তা কেবল ক্যাশ হওয়া [0, 255] রেঞ্জের মধ্যে সীমাহীন অসীম সংখ্যাকে বাধ্য করা। মূলত এটি কেবল চেহারা-সারণী অপ্টিমাইজেশান, এবং অ্যালগরিদম ঠিক পাশাপাশি কাজ করে যদি উদাহরণস্বরূপ, আপনি গ্রিড সমন্বয়যুক্ত একটি পিআরএনজি বীজ করেন এবং গ্রেডিয়েন্ট উত্পন্ন করতে ব্যবহার করেন, এটি ঠিক (অনেক) ধীর গতিতে।
খ্রিস্ট

@ বিক্রিস্ট আমি মনে করি আপনি পার্লিন গোলমালের একটি পুরানো সংস্করণ উল্লেখ করছেন। পার্লিনের "উন্নত শব্দ", যার সাথে আমি সংযুক্ত হয়েছি , 256 এলোমেলো নয়, 12 গ্রেডিয়েন্ট ভেক্টরগুলির একটি নির্দিষ্ট সেট ব্যবহার করা হয়েছে। গ্রিড স্থানাঙ্কগুলিকে সেই 12 গ্রেডিয়েন্ট ভেক্টরগুলির মধ্যে একটিতে ম্যাপ করতে এটি হ্যাশ ফাংশন হিসাবে একটি ক্রমাঙ্কন টেবিল ব্যবহার করে।
নাথান রিড

11

এটি একটি সাধারণ ভুল ধারণা। হুগো ইলিয়াস যাকে "পার্লিন" শব্দের ডাকছেন তা আসলে ফ্র্যাক্টাল বা গোলাপী, গোলমাল। পার্লিনের গোলমাল কী তা আরও ভালভাবে বুঝতে, আপনি নাথন রিডের উত্তরটিতে লিঙ্কিত পার্লিনের নিবন্ধটি পড়তে পারেন, বা লাইবোনাইজ ডক্স (সেখানে একই ত্রুটি রয়েছে: পার্লিন গোলমাল যা তারা গ্রেডিয়েন্ট শোর বলে) বা কোহরেন্টনিজ ডক্স

এখন, আসলে আপনার প্রশ্নের উত্তর দেওয়ার জন্য: আপনি শব্দটির ফ্রিকোয়েন্সি খুব বেশি হওয়ায় আপনি প্রত্যাশিত ফলাফলটি পান নি। আপনার ফ্রিকোয়েন্সিগুলি 1 দিয়ে শুরু হয় এবং বৃদ্ধি পায়, অর্থাত ফলাফলের মানচিত্রে প্রতিটি পিক্সেলের একটি এলোমেলো মান থাকে। মানচিত্রের সূক্ষ্ম কাঠামো দেখতে আপনার গোলমালের উপর "জুম ইন" করতে হবে। আমি সত্যিই পিএইচপি বলি না, তবে আমি মনে করি কোডটি দেখতে এমন হওয়া উচিত:

$arrayMap[$i][$j] = PerlinNoise_2D($i/$width, $j/$height, $p, $octaves);

এটি হ'ল, আপনি আপনার পুরো মানচিত্রের এক সময়ের শব্দকে "প্রসারিত" করেন। অবশ্যই, আপনি অন্যান্য সহগ ব্যবহার করতে পারেন - কেবল বিভিন্ন চেষ্টা করুন, দেখুন কী ঘটে।


সুসংগত শব্দ নথির জন্য ধন্যবাদ! আমি দেখতে পাচ্ছি যে আপনি এটি লিখেছেন :) libnoise ডক্সে ত্রুটিটি কী? পার্লিন গোলমাল কি এক ধরণের গ্রেডিয়েন্ট কোলাহল নয়?
কিংবদন্তি 2 কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.