আমি প্রথমে প্রত্যেকের মত একই উত্তর পেতে যাচ্ছিলাম এবং সমস্যাগুলির সাথে এটি খড়ি rand()
। যাইহোক, আমি এটি করার চেয়ে ভাল মনে করেছি এবং পরিবর্তে আপনার গণিতটি উত্পাদিত বিতরণটিকে বিশ্লেষণ করেছি।
টিএল; ডিআর: আপনি যে প্যাটার্নটি দেখছেন তার অন্তর্নিহিত এলোমেলো সংখ্যা জেনারেটরের সাথে কোনও সম্পর্ক নেই এবং পরিবর্তে কেবল আপনার প্রোগ্রামটি যে সংখ্যাগুলি পরিচালনা করছে তার কারণেই এটি।
আমি আপনার নীল ফাংশনটি আঁকিব কারণ তারা সব একই রকম।
uint8_t blue(uint32_t x, uint32_t y) {
return (rand() % 2) ? (x + y) % rand() :
((x * y % 1024) % rand()) % 2 ? (x - y) % rand() :
rand();
}
প্রতিটি পিক্সেল মান তিনটি কার্যকারিতা এক থেকে নির্বাচন করা হয়নি: (x + y) % rand()
, (x - y) % rand()
, এবং rand()
;
আসুন একা এই প্রতিটি দ্বারা উত্পাদিত চিত্র দেখুন।
এই আপনি প্রত্যাশা করবে, শুধু শব্দ। এটিকে "চিত্র সি" কল করুন
এখানে আপনি পিক্সেল স্থানাঙ্কগুলি একসাথে যুক্ত করছেন এবং বাকীটি এলোমেলো সংখ্যায় ভাগ করে নিচ্ছেন। চিত্রটি যদি 1024x1024 হয় তবে যোগফলটি [0-2046] এর মধ্যে হয়। আপনি যে এলোমেলো সংখ্যাটি দিয়ে ডাইভিং করছেন সেগুলি [0, RAND_MAX] এর মধ্যে রয়েছে, যেখানে RAND_MAX কমপক্ষে 32 কে এবং কিছু সিস্টেমে 2 বিলিয়ন। অন্য কথায় 16 টির মধ্যে সেরা 1 টির সম্ভাবনা রয়েছে যে বাকীটি কেবলমাত্র নয় (x + y)
। সুতরাং বেশিরভাগ অংশের জন্য এই ফাংশনটি কেবলমাত্র + x + y দিকের দিকে নীল বৃদ্ধির একটি গ্রেডিয়েন্ট তৈরি করবে।
তবে আপনি কেবল সর্বনিম্ন 8 টি বিট ব্যবহার করছেন, কারণ আপনি ফিরে আসেন uint8_t
, সুতরাং আপনার 256 পিক্সেল প্রশস্ত গ্রেডিয়েন্টের স্ট্রাইপ থাকবে।
এটিকে "চিত্র এ" বলুন
এখানে আপনি অনুরূপ কিছু করেন তবে বিয়োগ দিয়ে। X যতক্ষণ না y এর চেয়ে বড় আপনার পূর্বের চিত্রের মতো কিছু থাকবে। কিন্তু কোথায় Y বেশী, ফলে খুব বড় সংখ্যা কারণ x
এবং y
স্বাক্ষরবিহীন (নেতিবাচক ফলাফল স্বাক্ষরবিহীন টাইপ এর পরিসীমা শীর্ষে চারপাশে মোড়ানো), এবং তারপর % rand()
মধ্যে kicks এবং আপনি আসলে গোলমাল পেতে।
এটিকে "চিত্র বি" কল করুন
আপনার চূড়ান্ত চিত্রের প্রতিটি পিক্সেল ফাংশন rand() % 2
এবং ব্যবহার করে এই তিনটি চিত্রের একটি থেকে নেওয়া হয়েছে ((x * y % 1024) % rand()) % 2
। এর মধ্যে প্রথমটি 50% সম্ভাব্যতার সাথে বেছে নেওয়া ( rand()
এটির সমস্যাগুলি এবং এর নিম্ন আদেশের বিটগুলি উপেক্ষা করে ) হিসাবে বেছে নেওয়া যেতে পারে )
এখানে rand() % 2
সত্য (সাদা পিক্সেল) এর একটি ক্লোজআপ তাই চিত্র এ নির্বাচন করা হয়েছে।
দ্বিতীয় ফাংশনটিতে ((x * y % 1024) % rand()) % 2
আবার এমন সমস্যা রয়েছে যেখানে rand()
আপনি (x * y % 1024)
বিভাজনিত জিনিসটির চেয়ে সাধারণত বৃহত্তর হয় যা সর্বাধিক 1023 (x*y%1024)%2
হয় Then তারপরে 0 এবং 1 সমানভাবে উত্পাদিত হয় না। যে কোনও বিজোড় সংখ্যাটি যে কোনও সংখ্যার দ্বারা গুণিত করা হয় সমান। যে কোনও সমান সংখ্যার দ্বারা গুণিত যে কোনও সমান সংখ্যাটিও সমান। বিজোড় সংখ্যা দ্বারা গুণিত একটি বিজোড় সংখ্যাটিই বিজোড়, এবং %2
এমনকী মানগুলি যা সময়ের তিনটি চতুর্থাংশ এমনকি সময়ের তিনটি চতুর্থাংশ উত্পাদন করে।
এখানে ((x * y % 1024) % rand()) % 2
সত্য যেখানে একটি ক্লোজআপ যাতে চিত্র বি নির্বাচন করা যায়। উভয় স্থানাঙ্ক বিজোড় যেখানে এটি ঠিক নির্বাচন করছে।
এবং এখানে চিত্র সি নির্বাচন করা যেতে পারে তার একটি ক্লোজআপ রয়েছে:
অবশেষে এখানে অবস্থাগুলির সংমিশ্রণ যেখানে চিত্র বি নির্বাচিত হয়েছে:
এবং যেখানে চিত্র সি নির্বাচন করা হয়েছে:
ফলস্বরূপ সংমিশ্রণটি পড়তে পারেন:
৫০% সম্ভাব্যতার সাথে চিত্র এ থেকে পিক্সেল ব্যবহার করুন, চিত্র বি এবং চিত্র সি, বি এর মধ্যে বাকি সময় বেছে নিন যেখানে উভয় স্থানাঙ্কগুলি বিজোড়, সি যেখানে উভয়ই সমান।
অবশেষে, যেহেতু আপনি তিনটি ভিন্ন রঙের জন্য একই করছেন, তবে বিভিন্ন দিকনির্দেশের সাহায্যে নিদর্শনগুলি প্রতিটি রঙে আলাদাভাবে আলোকিত হয় এবং আপনি যে ক্রসিং স্ট্রিপ বা গ্রিড প্যাটার্নটি দেখছেন তা উত্পাদন করে।