ঠিক আছে, এই আমাকে কঠিন সময় দিয়েছে। আমি মনে করি যদিও এটি খুব সুন্দর যদিও ফলাফলগুলি অন্য কারও মতো অতুল্কর না হলেও । এলোমেলো সাথে চুক্তি। কিছু মধ্যবর্তী চিত্রগুলি আরও ভাল দেখায়, তবে আমি সত্যিই ভোরোনাই ডায়াগ্রামগুলির সাথে একটি সম্পূর্ণরূপে কার্যকরী অ্যালগরিদম পেতে চেয়েছিলাম।
সম্পাদনা:
এটি চূড়ান্ত অ্যালগরিদমের একটি উদাহরণ। চিত্রটি মূলত তিনটি ভোরোনাই চিত্রের সুপারপজিশন, প্রতিটি রঙের উপাদানগুলির জন্য একটি (লাল, সবুজ, নীল)।
কোড
অবহেলিত, শেষে সংস্করণ মন্তব্য
unsigned short red_fn(int i, int j){
int t[64],k=0,l,e,d=2e7;srand(time(0));while(k<64){t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}
unsigned short green_fn(int i, int j){
static int t[64];int k=0,l,e,d=2e7;while(k<64){if(!t[k])t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}
unsigned short blue_fn(int i, int j){
static int t[64];int k=0,l,e,d=2e7;while(k<64){if(!t[k])t[k]=rand()%DIM;if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)d=e,l=k;}return t[l];
}
এটি আমার প্রচুর প্রচেষ্টা নিয়েছে, তাই ফলাফলটি বিভিন্ন পর্যায়ে ভাগ করে নেওয়ার মতো আমার মনে হয় এবং দেখানোর মতো সুন্দর (ভুল) রয়েছে।
প্রথম পদক্ষেপ: কিছু পয়েন্ট এলোমেলোভাবে রেখে দিন x=y
আমি এটিকে জেপেইজে রূপান্তর করেছি কারণ আসল png আপলোডের জন্য খুব ভারী ছিল ( >2MB
), আমি বাজি ধরেছি যে 50 ধরণের ধূসর এর চেয়ে বেশি শেড!
দ্বিতীয়: একটি ভাল y সমন্বয় আছে
y
অক্ষের জন্য এলোমেলোভাবে উত্পাদিত স্থানাঙ্কের আরেকটি টেবিল আমি তুলতে পারি না, সুতরাং যতটা সম্ভব কম অক্ষরে " এলোমেলো "গুলি পাওয়ার জন্য আমার একটি সহজ উপায় প্রয়োজন । আমি x
টেবিলের অন্য পয়েন্টের স্থানাঙ্কটি ব্যবহার করতে গিয়েছিলাম , পয়েন্টের সূচকটিতে AND
কিছুটা দিক দিয়ে।
তৃতীয়: আমার মনে নেই তবে ভাল লাগছে
তবে এই মুহুর্তে আমি 140 টিরও বেশি পথ পেরিয়ে এসেছি, তাই আমার এটি বেশ কিছুটা গল্ফ করা দরকার।
৪ র্থ: স্ক্যানলাইনস
শুধু মজা করছি, এটি চাওয়া নয় বরং ধরণের, মিথথিক্স।
এখনও অ্যালগরিদমের আকার হ্রাস করার জন্য কাজ করছি, আমি উপস্থাপন করতে পেরে গর্বিত:
স্টারফক্স সংস্করণ
ভোরোনাই ইনস্টাগ্রাম
5 ম: পয়েন্ট সংখ্যা বৃদ্ধি
আমার কাছে এখন কোডের একটি কার্যকরী অংশ রয়েছে, তাই আসুন 25 থেকে 60 পয়েন্টে চলে আসুন।
এটি কেবল একটি চিত্র থেকে পাওয়া শক্ত, তবে পয়েন্টগুলি প্রায় একই y
রেঞ্জে অবস্থিত । অবশ্যই, আমি বিটওয়াইজ অপারেশনটি পরিবর্তন করি নি, &42
এটি আরও ভাল:
এবং আমরা এখানে এই পোস্ট থেকে প্রথম চিত্র হিসাবে একই সময়ে। আসুন এখন আগ্রহী হতে হবে এমন বিরলগুলির জন্য কোডটি ব্যাখ্যা করুন।
বর্ণহীন এবং ব্যাখ্যা কোড
unsigned short red_fn(int i, int j)
{
int t[64], // table of 64 points's x coordinate
k = 0, // used for loops
l, // retains the index of the nearest point
e, // for intermediary results
d = 2e7; // d is the minimum distance to the (i,j) pixel encoutnered so far
// it is initially set to 2e7=2'000'000 to be greater than the maximum distance 1024²
srand(time(0)); // seed for random based on time of run
// if the run overlaps two seconds, a split will be observed on the red diagram but that is
// the better compromise I found
while(k < 64) // for every point
{
t[k] = rand() % DIM; // assign it a random x coordinate in [0, 1023] range
// this is done at each call unfortunately because static keyword and srand(...)
// were mutually exclusive, lenght-wise
if (
(e= // assign the distance between pixel (i,j) and point of index k
_sq(i - t[k]) // first part of the euclidian distance
+
_sq(j - t[42 & k++]) // second part, but this is the trick to have "" random "" y coordinates
// instead of having another table to generate and look at, this uses the x coordinate of another point
// 42 is 101010 in binary, which is a better pattern to apply a & on; it doesn't use all the table
// I could have used 42^k to have a bijection k <-> 42^k but this creates a very visible pattern splitting the image at the diagonal
// this also post-increments k for the while loop
) < d // chekcs if the distance we just calculated is lower than the minimal one we knew
)
// { // if that is the case
d=e, // update the minimal distance
l=k; // retain the index of the point for this distance
// the comma ',' here is a trick to have multiple expressions in a single statement
// and therefore avoiding the curly braces for the if
// }
}
return t[l]; // finally, return the x coordinate of the nearest point
// wait, what ? well, the different areas around points need to have a
// "" random "" color too, and this does the trick without adding any variables
}
// The general idea is the same so I will only comment the differences from green_fn
unsigned short green_fn(int i, int j)
{
static int t[64]; // we don't need to bother a srand() call, so we can have these points
// static and generate their coordinates only once without adding too much characters
// in C++, objects with static storage are initialized to 0
// the table is therefore filled with 60 zeros
// see http://stackoverflow.com/a/201116/1119972
int k = 0, l, e, d = 2e7;
while(k<64)
{
if( !t[k] ) // this checks if the value at index k is equal to 0 or not
// the negation of 0 will cast to true, and any other number to false
t[k] = rand() % DIM; // assign it a random x coordinate
// the following is identical to red_fn
if((e=_sq(i-t[k])+_sq(j-t[42&k++]))<d)
d=e,l=k;
}
return t[l];
}
এতক্ষণ পড়ার জন্য ধন্যবাদ।