কোনও রঙকে ব্যাকগ্রাউন্ডের চেয়ে কম সাদৃশ্য করতে পরিবর্তিত করতে অ্যালগরিদম


23

আমি দৃ balls় রঙে ভরাট পটভূমিতে একে অপরকে বাউন করে 20 বলের একটি ডেমো তৈরি করছি। প্রতিটি বলের জন্য রঙ randint(0, 255)প্রতিটি আর, জি, বি টিউপল উপাদানগুলির সাথে এলোমেলোভাবে চয়ন করা হয় ।

সমস্যাটি এমন কিছু বল যা এমন রঙের সাথে শেষ হয় যা পটভূমির সাথে খুব মিল, এটি দেখতে শক্ত করে তোলে। আমি এটি এড়াতে চাই, হয় নির্বাচিত রঙটি খুব বেশি অনুরূপ হলে ( অন্য একটি রঙের প্রদত্ত থ্রেশহোল্ডের মধ্যে) অন্য রঙকে ঘুরিয়ে বা পটভূমির রঙ থেকে দূরে সরিয়ে দিয়ে another

একটি থ্রেশহোল্ড হিসাবে ব্যবহার করার জন্য কীভাবে একটি সাদৃশ্য সূচক গণনা করবেন ? বা কীভাবে কোনও রঙ রূপান্তর করতে যায়, বলুন, কম নীল-ইশ ?

স্পষ্টত অস্বীকৃতি: আমি রঙ তত্ত্ব সম্পর্কে কিছুই জানি না, তাই উপরের ধারণাগুলি এমনকি বিদ্যমান কিনা আমি জানি না!

আমি অজগরটিতে কোডিং করছি, তবে আমি ধারণা এবং কৌশলগুলি খুঁজছি, সুতরাং সিউডো কোডটি ঠিক আছে (বা কেবল তত্ত্ব)।

সম্পাদনা করুন:

কয়েকটি বিষয় পরিষ্কার করতে:

  • প্রতিটি বলের নিজস্ব র্যান্ডম রঙ থাকে have আমি তাদের যথাসম্ভব এলোমেলো থাকতে এবং রঙের জায়গার যথাসম্ভব অন্বেষণ করতে চাই (এটি আরজিবি বা এইচএসভি হোক, pygameরঙ নির্ধারণের জন্য উভয় ফর্ম্যাটকে গ্রহণ করে)

  • আমি কেবল পটভূমির প্রতিটি রঙ "খুব কাছে" হওয়া এড়াতে চাই। সমস্যাটি কেবল রঙিন রঙের নয়: আমি গা dark়-নীল পটভূমির বিরুদ্ধে হালকা-নীল বলের সাথে পুরোপুরি ঠিক আছি (বা "সাদা-ইশ" নীল ইত্যাদির বিপরীতে "ফুল-নীল" ইত্যাদি)

  • আপাতত, কোনও বল অন্য বলের মতো একই রঙের (বা এমনকি অভিন্ন) সমাপ্ত হলে আমার কোনও যত্ন নেই। এটি এড়ানো একটি বোনাস, তবে এটি একটি সামান্য বিষয়।

  • পটভূমি রঙ একটি ধ্রুবক, একক আরজিবি রঙ। আপাতত আমি "বেসিক" নীল ব্যবহার করছি (0, 0, 255), তবে আমি এটির সাথে নিষ্পত্তি করছি না। সুতরাং ব্যাকগ্রাউন্ডটিকে একটি স্বেচ্ছাসেবী রঙ হিসাবে বিবেচনা করুন (স্বেচ্ছাসেবী রঙ, উজ্জ্বলতা, স্যাচুরেশন ইত্যাদি)।

EDIT2:

টিএল, ডিআর সংস্করণ: এক্স র্যান্ডম রঙগুলি তৈরির জন্য কেবল একটি উপায় দিন যাতে কোনওরকম "অত্যধিক ম্লান হয় না" স্বেচ্ছাসেবী (তবে একক এবং ধ্রুবক) রঙের পটভূমির বিরুদ্ধে



1
কেন না প্রতিটি বলের চারপাশে একটি রূপরেখা রাখুন?
ashes999

1
তারপরে ব্যাকগ্রাউন্ড এবং বলের রঙ উভয় থেকে আলাদা করে একটি বাহ্যরেখা রঙ তৈরি করতে সমস্যা হতে পারে;)
ক্রোমস্টার বলেছেন মনিকা 24 ই

1
@ অ্যালেক্সএম .: বিশ্বাস করা কঠিন যে "" নির্বিচারে রঙ এড়ানো এলোমেলো রঙ উত্পন্ন "এর সহজ সমাধান নেই
মেষ্টারলিয়ন

1
@ মাস্টারলিয়ন কেবল রূপরেখার জন্য কালো ব্যবহার করুন এবং সর্বনিম্ন আরজিবি 128 এর মান সহ রঙ তৈরি করুন That এটি সহজ That
ashes999

উত্তর:


33

আপনি এই সত্যটি ব্যবহার করতে পারেন যে রঙগুলি একটি (ত্রিমাত্রিক) রঙের স্থান তৈরি করে এবং এই রঙের স্থানটিতে একটি দূরত্ব গণনা করে। তারপরে দুটি রঙের মধ্যকার দূরত্ব জানতে আপনাকে এই রঙের জায়গাতে একটি মেট্রিক নির্ধারণ করতে হবে।

উদাহরণস্বরূপ, ইউক্লিডিয়ান স্পেসে দুটি পয়েন্ট x = (x1, x2, x3) এবং y = (y1, y2, y3) এর মধ্যকার দূরত্ব d (x, y) = sqrt ((y1-x1) * (y1- দ্বারা দেওয়া হয়েছে) x1) + (y2-x2) * (y2-x2) + (y3-x3) * (y3-x3))।

এখন আপনি একটি বলের রঙ এবং আপনার পটভূমির রঙের মধ্যে দূরত্ব গণনা করতে পারেন এবং যদি এটি খুব ছোট হয় তবে একটি নতুন এলোমেলো রঙ তৈরি করুন এবং আবার পরীক্ষা করুন।

আপনি দেখতে পাবেন যে আরজিবি বা এইচএসভি উভয়ই এই কাজের জন্য ভাল রঙের জায়গা নয়। রঙ পার্থক্য উইকিপিডিয়ার নিবন্ধ নিয়োগ এল একটি রঙ স্থান এবং বিভিন্ন সম্ভাব্য বৈশিষ্ট্যের মান দেয়।

বিষয়টিতে স্ট্যাকওভারফ্লো সম্পর্কে একটি বিবাদ রয়েছে


এটি একটি খুব সুন্দর পদ্ধতির, আমি এটি করতে পারে :) ধন্যবাদ! এছাড়াও, পর্যাপ্ত "ন্যূনতম দূরত্ব" প্রান্তিকাগুলি কীভাবে খুঁজে পাবেন সে সম্পর্কে কিছুটা বিস্তৃত করার যত্ন নিন? আরজিবি যদি পর্যাপ্ত না হয় তবে এল বি তে রূপান্তর কীভাবে করবেন ? আমি সঠিক উপলব্ধি মেট্রিকের জন্য চেষ্টা করছি না, তাই কোনও "যথেষ্ট যথেষ্ট" ডিফল্টগুলি করবে।
MestreLion

1
এই উত্তরটি পছন্দ করুন, ভালভাবে চিন্তাভাবনা করুন, প্রয়োজনীয় সমীকরণ এবং রেফারেন্স সরবরাহ করার সময় টাস্কটি কীভাবে করবেন তা সম্পর্কে ভাল ব্যাখ্যা। ভাল প্রথম উত্তর।
টম 'ব্লু' পিডক

1
আপনি যদি মানুষের উপলব্ধির একটি "যথেষ্ট পরিমাণে" সান্নিধ্যের সন্ধান করেন তবে আপনি YUV রঙের স্থানটি দেখতে চাইতে পারেন , যার আরজিবি থেকে সরাসরি রূপান্তর রয়েছে।
trm

5
কিছুটা সময় সাশ্রয় করুন এবং বর্গমূল (ব্যয়বহুল) নেবেন না। বর্গের সাথে তুলনা করে আপনার নূন্যতম রঙের দূরত্বের মানটি তৈরি করুন।
ক্রিস চুদমোর

1
@MestreLion দ্য এল একটি খ * রঙ স্থান perceptually অভিন্ন হতে, যার অর্থ দুটি রং মধ্যে অনুভূত দূরত্ব রঙ স্থান প্রকৃত দূরত্ব হিসাবে একই আবিষ্কৃত হয়। আরজিবি রঙগুলি ডিভাইস-নির্ভর, তাই আপনি সরাসরি ল্যাব এবং আরজিবি-র মধ্যে রূপান্তর করতে পারবেন না। তবে, আপনি যদি কোনও নির্দিষ্ট পরম আরজিবি রঙের স্থান ব্যবহার করেন তবে আপনি সেগুলি রূপান্তর করতে পারেন। : এই নিবন্ধটি দেখুন en.wikipedia.org/wiki/SRGB_color_space : এবং এই নিবন্ধটি en.wikipedia.org/wiki/Lab_color_space
jwir3

8

জাতিসংঘের ওয়েব অ্যাক্সেসিবিলিটি স্ট্যান্ডার্ড পৃষ্ঠা ( http://www.un.org/webaccessibility/1_visual/13_colourcontrast.shtml ) ওয়েবসাইটগুলিতে সঠিক পাঠ্য বৈসাদৃশ্য নিশ্চিত করার জন্য একটি মানকে নির্দেশ করে যা কিছু ব্যবহারকারী রঙিনব্লাইন্ড রয়েছে তা মনে রেখে। এটি আপনার পক্ষে বিশেষত গুরুত্বপূর্ণ যেহেতু আপনার ব্যবহারকারীর মধ্যে কিছু রঙব্লাইন্ডও হতে পারে (সবুজ পটভূমি থেকে একটি লাল বল যদি তাদের একই আলোকিত থাকে তবে তা বলা শক্ত হবে)।

জাতিসংঘের পৃষ্ঠায় জুসি স্টুডিওজ লুমিনোসিটি কালার কনট্রাস্ট অনুপাতের বিশ্লেষককে নির্দেশিত হয়েছে ( http://juicystudio.com/services/luminositycontrastratio.php#specify ) যা ব্যাকগ্রাউন্ডে পাঠ্যটির বিপরীতে অনুপাত অবশ্যই 4.5: 1 এর সাথে থাকা উচিত, আমি ব্যতীত আপনার ক্ষেত্রে অনুরূপ হতে পারে বিশ্বাস:

  • বড় পাঠ্য: বড় আকারের পাঠ্য এবং বড় আকারের পাঠ্যের চিত্রগুলির কমপক্ষে 3: 1 এর বিপরীতে অনুপাত রয়েছে

এখন একটি বিপরীতে অনুপাত কি? হাইপারলিঙ্কগুলি আরও অনুসরণ করে (এটি মজাদার!) আমরা একটি ডাব্লু 3 পৃষ্ঠায় পৌঁছে যা বিপরীতে অনুপাতটিকে সংজ্ঞায়িত করে:

Contrast Ratio = (L1 + 0.05)/(L2 + 0.05)

যেখানে এল 1 এবং এল 2 হ'ল রঙগুলির তুলনামূলক আলোকসজ্জা। এল 1 তত লুমিন্যান্ট রঙ, এল 2 কম লুমিন্যান্ট রঙ। আবার, আমরা একই ডাব্লু 3 পৃষ্ঠার লিঙ্কটি অনুসরণ করি যা নির্দিষ্ট করে:

L = 0.2126 * R + 0.7152 * G + 0.0722 * B where R, G and B are defined as:

if RsRGB <= 0.03928 then R = RsRGB/12.92 else R = ((RsRGB+0.055)/1.055) ^ 2.4
if GsRGB <= 0.03928 then G = GsRGB/12.92 else G = ((GsRGB+0.055)/1.055) ^ 2.4
if BsRGB <= 0.03928 then B = BsRGB/12.92 else B = ((BsRGB+0.055)/1.055) ^ 2.4
and RsRGB, GsRGB, and BsRGB are defined as:

RsRGB = R8bit/255
GsRGB = G8bit/255
BsRGB = B8bit/255

দ্রষ্টব্য : ক্যারেট প্রতীক ^ উপরে বর্ণনামূলক (x²) বোঝায়

একটি আমাদের কাছে একটি বিপরীত অ্যালগরিদমের জন্য বেশ সুন্দর ফ্রেমওয়ার্ক রয়েছে (এটি রঙিন ব্লেন্ড বান্ধব!)

  • প্রতিটি রঙের জন্য আর, জি, বি মান নির্ধারণ করুন
  • প্রতিটি রঙের জন্য লুমিন্যানস নির্ধারণ করুন
  • যদি কম লুমিন্যান্ট কালার থেকে আরও লুমিনেন্ট রঙের কনট্রাস্ট অনুপাতটি 3 এরও কম হয়, তবে পুনরায় তালিকাভুক্ত করুন!

2
লক্ষ্য করতে চাই যে ^ এক্সপেনসেন্টেশন হওয়ার কথা। আমাদের ক্রেজি সি-জাতীয় ব্যবহারকারীদের কাছে এর অর্থ জাওর (আমি সত্যিই ভেবেছিলাম আপনি এক মিনিটের জন্য ভাসমান পয়েন্টের মানগুলিতে কিছুটা অপারেশন করার চেষ্টা করছেন)।
ফারাপ

এটি একটি আশ্চর্যজনক পদ্ধতির, আমি এটি পছন্দ করি! :)
MestreLion

এবং উদ্বিগ্ন ^হবেন না, এই প্রসঙ্গে আমি কখনই বিটওয়াইজ এক্সওআর সম্পর্কে ভাবব না। (বা কোনও বাস্তবে। সিমন সি ফ্রেইকস, ^সিউডো কোডগুলিতে ক্ষয়ক্ষতির জন্য ডি-ফ্যাক্টো সিম্বল (যদিও খুব কম ভাষা আসলে এটি ব্যবহার করে ... **
পাইথনটিতে

1
শুধু টাইপস ঠিক করা। এছাড়াও, যদি কোনও ব্যক্তির with এর সাথে সমস্যা হয় তবে ভবিষ্যতে অন্য কারও জন্য সম্ভাবনা রয়েছে। নির্দিষ্ট হতে আঘাত করে না।
জন

1
@ জন কোন উদ্বেগ নেই,। আমি নিশ্চিত না যে বিভ্রান্তিটি কোথা থেকে এসেছে (অর্থাত্ কোন ভাষাটি ব্যবহৃত হয়েছিল which কোন উদ্দেশ্যে প্রথমে)। আমি কেবল জানি sometimes কখনও কখনও ভিবি-র সাথে আমার অভিজ্ঞতার কারণে ক্ষয়ক্ষতির জন্য ব্যবহৃত হয় (আমি অন্য কোনও ভাষা জানি না যা এটি ক্ষতিকারক হিসাবে ব্যবহার করে, তবে সম্ভবত কিছু আছে)। ঠিক যেমন একটি মাথা আপ হিসাবে, এটি ক্যারেট প্রতীক, গাজরের প্রতীক নয়। শাকসবজি (বিশেষত স্কোয়ার শিকড়গুলির সাথে জড়িত) এর সাথে প্রোগ্রামিং সম্পর্কে কেউ godশ্বরকে ভয়ঙ্কর কৌতুক করার আগে এটিকে পরিবর্তন করতে পারে।
ফারাপ

2

0-255প্রতিটি উপাদানগুলির জন্য একটি এলোমেলো মান উত্পন্ন করে আরজিবি মানগুলি ব্যবহার করা কেবল পটভূমির অনুরূপ রঙ তৈরি করতে পারে না, আপনি বলগুলির জন্য খুব অনুরূপ রঙগুলি দিয়ে শেষ করতে পারেন।

আমি সম্ভবত একটি কম এলোমেলো পদ্ধতির চয়ন করব এবং এর পরিবর্তে আলাদা হওয়ার গ্যারান্টিযুক্ত এমন রঙ তৈরি করব। আপনি হিউ রেঞ্জের প্রতিটি ~ 32 ডিগ্রির জন্য একটি রঙ তৈরি করতে এবং উজ্জ্বলতা বা স্যাচুরেশনকে বিকল্প করতে পারেন (আরজিবিটির পরিবর্তে এইচএসভি রঙ-মডেল ব্যবহার করুন)।

সুতরাং এর মতো কিছু:

numColors = 20;
stepSize = 360 / (numColors / 2 + 1); // hue step size
for(i = 0; i < numColors; i++){
    color = HSV(i / 2 * stepSize, 0.5 + (i % 2) * 0.5, 1.0) 
}

যা 20 টি রঙ তৈরি করবে, সুন্দরভাবে বিতরণ করা হবে। এটি ধরে নিয়েছে যে আপনি পূর্ণসংখ্যার গণিত ব্যবহার করছেন, সুতরাং i = 0এবং i = 1একই মানটি তৈরি করবে।

অবশ্যই এটি খুব ভাল স্কেল করে না .. আপনার যদি 100 রঙের মান তৈরি করতে হয় তবে হিউ স্পেসিং যথেষ্ট নাও হতে পারে এবং আপনি আবার একই বর্ণের সাথে শেষ করবেন। সেক্ষেত্রে আপনি V(উজ্জ্বলতা) মানও পৃথক করতে পারেন ।

আমি জানি না যে আপনার ব্যাকগ্রাউন্ডের রঙটি কেমন, তবে এইচএসভি রংগুলির তুলনা করা আরও সহজ করে তোলে (কেবলমাত্র 3 টি উপাদানগুলির সাথে তুলনা করুন এবং ভুলে যাবেন না যে এইচইউটি বৃত্তাকার (0 == 360))।

হালনাগাদ:

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

// background color, currently equals RGB(0, 0, 255)
bg = HSV(240, 1.0, 1.0)

// number of colors to create is equal to the amount of balls
numColors = balls.length

// set threshold to compare colors. you can tweak this to your liking
threshold = 0.15

for(i = 0; i < numColors; i++){
    do {
        // assuming rnd returns a random float 0-1 inclusive
        color = HSV(rnd() * 360, rnd(), rnd())
        // calculate delta values, normalize hue to 0-1
        dH = (180 - abs(abs(bg.h - color.h) - 180)) / 360
        dS = bg.s - color.s
        dV = bg.v - color.v
        // "distance" between bg and color
        difference = sqrt(dH * dH + dS * dS + dV * dV)
    } while(difference < threshold)

    ball[i].color = color
}

আপনার অ্যালগোরিটম সম্পর্কে, কীভাবে এটি পটভূমির রঙটি বিবেচনায় নিচ্ছে?
MestreLion

এটি বর্তমানে পটভূমির রঙটি বিবেচনায় নিচ্ছে না ... উত্পন্ন রঙের তুলনা করে আপনি এটি শেষ করতে পারেন (শেষ অনুচ্ছেদে বর্ণিত) এবং তারপরে একটি আলাদা দিয়ে একটি রঙ তৈরি করতে পারেন V(বর্তমান অ্যালগরিদম যে এটি পরিবর্তন করে না)।
বামমজ্যাক

@MestreLion একটি বিকল্প অ্যালগরিদমের সাথে একটি আপডেট যুক্ত করেছে
bummzack

দুর্দান্ত, এটিকে দুর্দান্ত কৌশল বলে মনে হচ্ছে। ব্রুট ফোর্স ঠিক আছে, রঙগুলি একবার শুরুতে একবার তৈরি করা হয়, গেম লুপের মধ্যে নয়। মনে হচ্ছে আপনি এইচএসভিতে ইউক্লিডিয়ান প্লেইন দূরত্বের সাথে রেনির মতো একই পদ্ধতির ব্যবহার করছেন, তাই না? এইচএসভির জন্য উপযুক্ত প্রান্তিকের কোনও রেফারেন্স? আরজির মতো দূরত্বে কি এইচ, এস এবং ভি ওজন একই হয়?
MestreLion

@ মাস্টারলিয়ন হ্যাঁ, আমার দ্বিতীয় অ্যালগরিদম রেনির উত্তরে যা ব্যাখ্যা করেছে তা অনেকটাই। দুঃখের বিষয় একটি ভাল প্রান্তিকের জন্য কোনও নির্দিষ্ট মান নেই যেহেতু রঙ পরিবর্তনগুলি অভিন্ন হিসাবে ধরা হয় না। আমরা নীল রঙের তুলনায় সবুজ রঙের পরিবর্তনগুলি খুব দ্রুত স্বীকৃতিতে পারি ... তাই সবুজ টোনগুলির জন্য একটি ছোট প্রান্তিক কাজ করতে পারে তবে অন্যান্য রঙের জন্য যথেষ্ট হবে না won't যতদূর আমি জানি ল্যাব রঙের স্থানটি মানুষের রঙ উপলব্ধি এবং তার কাছাকাছি is আপনি যদি এইচএসভি কালারস্পেসের সাথে পছন্দসই ফলাফল না পান তবে সবচেয়ে উপযুক্ত হতে পারে।
বম্মজ্যাক

1

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

বুনিয়াদি। আমরা এটি করার আগে আপনাকে প্রাথমিক বিষয়গুলি জানতে হবে। নিম্নলিখিত রঙগুলি বিবেচনা করুন:

Black   #000000 rgb(0,0,0)
Red     #FF0000 rgb(255,0,0)
Green   #00FF00 rgb(0,255,0)
Blue    #0000FF rgb(0,0,255)
Yellow  #FFFF00 rgb(255,255,0)
Cyan    #00FFFF rgb(0,255,255)
Pink    #FF00FF rgb(255,0,255)
Gray    #C0C0C0 rgb(192,192,192)
White   #FFFFFF rgb(255,255,255)

রঙগুলির মিশ্রণ আরজিবি [(0..255), (0..255), (0..255)] উপরের মতো নতুন রঙ তৈরি করে।

নেতিবাচক রঙের জন্য কম্পিউটিং নেতিবাচক রঙের জন্য কম্পিউটিং হ'ল সায়ানে লাল, বেগুনীতে সবুজ, হলুদে নীল trans

Red     #FF0000 rgb(255,0,0) ->     Cyan    #00FFFF rgb(0,255,255)
Green   #00FF00 rgb(0,255,0) ->     Purple   #FF00FF    rgb(255,0,255)
Blue    #0000FF rgb(0,0,255) ->     Yellow  #FFFF00 rgb(255,255,0)

পরিপূরক রঙ

পরিপূরক রঙগুলির কম্পিউটিং সম্পর্কিত রেফারেন্স অনুসারে: http://serennu.com/colour/rgbtohsl.php

এইচএসএল সম্পর্কে

এইচএসএল তাদের হিউ, স্যাচুরেশন এবং লাইটনেসের ক্ষেত্রে রঙ প্রকাশ করে, রঙের এই তিনটি বৈশিষ্ট্যের প্রত্যেকটির জন্য একটি নম্বর দেয়।

হিউ হ'ল রঙ চাকাতে রঙের অবস্থান, 0 ° থেকে 359 degrees ডিগ্রিতে প্রকাশিত হয়, যা চক্রের 360 represent প্রতিনিধিত্ব করে; 0 red লাল হচ্ছে, 180 red হচ্ছে লাল রঙের বিপরীত রঙের সায়ান এবং আরও।

স্যাচুরেশন হ'ল রঙের তীব্রতা, এটি কতটা নিস্তেজ বা উজ্জ্বল। কম স্যাচুরেশন, ডুলার (গ্রেয়ার) বর্ণটি দেখায়। এটি শতাংশ হিসাবে প্রকাশ করা হয়, 100% সম্পূর্ণ স্যাচুরেশন, সবচেয়ে উজ্জ্বল এবং 0% কোনও স্যাচুরেশন, ধূসর নয়।

হালকা হ'ল রঙ কত হালকা। স্যাচুরেশনের থেকে কিছুটা আলাদা। রঙে যত বেশি সাদা তার লাইটেন্সিটির মান তত বেশি, তত কম তার লাইটনেস। সুতরাং 100% লাইটনেস রঙ সাদা করে তোলে, 0% হালকা রঙ কালো করে তোলে, এবং "খাঁটি" বর্ণটি 50% হালকা হবে।

স্যাচুরেশন এবং লাইটেন্সিটির ব্যাখ্যা দেওয়ার চেয়ে পার্থক্যটি দেখতে এটি আরও সহজ। আপনি যদি স্পষ্ট করতে চান তবে রঙিন ক্যালকুলেটর পৃষ্ঠায় লাইটনেস এবং স্যাচুরেশনের বিভিন্নতা দেখার চেষ্টা করুন, আপনার স্টার্টার রঙ হিসাবে বেশ উজ্জ্বল রঙ বেছে নিন।

সুতরাং এইচএসএল স্বরলিপিটি এর মতো দেখাচ্ছে, হু, স্যাচুরেশন এবং লাইটনেস মানটিকে সেই ক্রমে প্রদান করছে: টি

লাল: 0 ° 100% 50% ফ্যাকাশে গোলাপী: 0 ° 100% 90% সায়ান: 180 ° 100% 50% এখানে পদক্ষেপ রয়েছে:

  1. আপনার রঙকে এইচএসএলে রূপান্তর করুন।

  2. হিউটির বিপরীতে হিউটির মানটি পরিবর্তন করুন (উদাঃ, যদি আপনার হিউ 50 is হয় তবে বিপরীতটি চাকাতে 230 at এ হবে - আরও 180 180)।

  3. স্যাচুরেশন এবং লাইটেন্সি মানগুলি যেমন ছিল তেমন ত্যাগ করুন।

  4. এই নতুন এইচএসএল মানটিকে আপনার মূল রঙ স্বরলিপিতে (আরজিবি বা যাই হোক না কেন) রূপান্তর করুন।

ইজিআরজিবি.কম এর মত সাইটগুলি আপনার জন্য আরজিবি থেকে এইচএসএল বা বিপরীতে জেনেরিক রূপান্তর করতে পারে।

প্রোগ্রামিং উদাহরণ হিসাবে পিএইচপি মধ্যে সম্পন্ন করা হয়েছে

আরজিবি থেকে এইচএসএল রূপান্তর

নীল # 0000FF আরজিবি (0,0,255) এর উপরে মানটি রেড হেক্সাডেসিমাল 00 + গ্রিন হেক্সাডেসিমেল 00 + নীল হেক্সাডেসিমেল এফএফ হিসাবে উপস্থাপন করা যেতে পারে

$redhex  = substr($hexcode,0,2);
$greenhex = substr($hexcode,2,2);
$bluehex = substr($hexcode,4,2);

এটি রেড দশমিক 0 + সবুজ দশমিক 0 + নীল দশমিক 255 হিসাবে উপস্থাপিত হতে পারে

$var_r = (hexdec($redhex)) / 255;
$var_g = (hexdec($greenhex)) / 255;
$var_b = (hexdec($bluehex)) / 255;

এখন rgb2hsl রুটিনে এই মানগুলি প্লাগ করুন। নীচে আমার রূপান্তরটির জন্য ইজিআরজিবি.কম এর জেনেরিক কোডটির পিএইচপি সংস্করণটি রয়েছে:

ইনপুটটি $ var_r, $ var_g এবং $ var_b উপরের আউটপুট থেকে এইচএসএল সমান হয় $ h, and s এবং $ l - এগুলি আবার ইনপুট মানগুলির মতো 1 এর ভগ্নাংশ হিসাবে প্রকাশ করা হয়

$var_min = min($var_r,$var_g,$var_b);ttt
$var_max = max($var_r,$var_g,$var_b);
$del_max = $var_max - $var_min;

$l = ($var_max + $var_min) / 2;

if ($del_max == 0)
{
        $h = 0;
        $s = 0;
}
else
{
        if ($l < 0.5)
        {
                $s = $del_max / ($var_max + $var_min);
        }
        else
        {
                $s = $del_max / (2 - $var_max - $var_min);
        };

        $del_r = ((($var_max - $var_r) / 6) + ($del_max / 2)) / $del_max;
        $del_g = ((($var_max - $var_g) / 6) + ($del_max / 2)) / $del_max;
        $del_b = ((($var_max - $var_b) / 6) + ($del_max / 2)) / $del_max;

        if ($var_r == $var_max)
        {
                $h = $del_b - $del_g;
        }
        elseif ($var_g == $var_max)
        {
                $h = (1 / 3) + $del_r - $del_b;
        }
        elseif ($var_b == $var_max)
        {
                $h = (2 / 3) + $del_g - $del_r;
        };

        if ($h < 0)
        {
                $h += 1;
        };

        if ($h > 1)
        {
                $h -= 1;
        };
};

সুতরাং এখন আমাদের এইচএসএল মান হিসাবে ভেরিয়েবল $ এইচ, $ এস এবং $ l এ রঙ রয়েছে। এই তিনটি আউটপুট ভেরিয়েবলগুলি ডিগ্রি এবং শতাংশের পরিবর্তে এই পর্যায়ে আবার 1 এর ভগ্নাংশ হিসাবে ধরা হয়। সুতরাং, সায়ান (180 ° 100% 50%) $ h = 0.5, 0.5 s = 1 এবং $ l = 0.5 হিসাবে প্রকাশিত হবে।

এরপরে হিউ এর বিপরীতে মানটি নির্ণয় করুন, অর্থাৎ ১৮০ ডিগ্রি বা ০.০ এর দূরে (আমি নিশ্চিত যে গণিতবিদরা এগুলিকে আঁকানোর আরও সুন্দর পদ্ধতিতে রয়েছে তবে):

বিপরীত হিউ গণনা করুন, $ এইচ 2

            $h2 = $h + 0.5;

            if ($h2 > 1)
                    {
                            $h2 -= 1;
                    };

পরিপূরক রঙের এইচএসএল মান এখন $ h2, $ s, $ l এ। সুতরাং আমরা এটিকে আরজিবিতে রূপান্তর করতে প্রস্তুত (আবার, EasyRGB.com সূত্রের আমার পিএইচপি সংস্করণ)। নোট করুন এবং আউটপুট ফর্ম্যাটগুলি এবার আলাদা আলাদা করে দেখুন, কোডের শীর্ষে আমার মন্তব্য দেখুন:

ইনপুটটি পরিপূরক রঙের এইচএসএল মান, 1 আউটপুট এর ভগ্নাংশ হিসাবে $ h2, $ s, $ l এ আটকানো হয় সাধারণ 255 255 255 ফর্ম্যাটে আরজিবি, $ r, $ g, $ b এ হিউ ফাংশন ব্যবহার করে hue_2_rgb ব্যবহার করে রূপান্তরিত হয় এই কোড শেষে

    if ($s == 0)
    {
            $r = $l * 255;
            $g = $l * 255;
            $b = $l * 255;
    }
    else
    {
            if ($l < 0.5)
            {
                    $var_2 = $l * (1 + $s);
            }
            elset
            {
                    $var_2 = ($l + $s) - ($s * $l);
            };

            $var_1 = 2 * $l - $var_2;
            $r = 255 * hue_2_rgb($var_1,$var_2,$h2 + (1 / 3));
            $g = 255 * hue_2_rgb($var_1,$var_2,$h2);
            $b = 255 * hue_2_rgb($var_1,$var_2,$h2 - (1 / 3));
    };

   // Function to convert hue to RGB, called from above

    function hue_2_rgb($v1,$v2,$vh)
    {
            if ($vh < 0)
            {
                    $vh += 1;
            };

            if ($vh > 1)
            {
                    $vh -= 1;
            };

            if ((6 * $vh) < 1)
            {
                    return ($v1 + ($v2 - $v1) * 6 * $vh);
            };

            if ((2 * $vh) < 1)
            {
                    return ($v2);
            };

            if ((3 * $vh) < 2)
            {
                    return ($v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6));
            };

            return ($v1);
    };

এবং সেই রুটিনের পরে অবশেষে আমাদের 255 255 255 (আরজিবি) ফর্ম্যাটে $ r, $ g এবং $ b রয়েছে, যা আমরা ছয় অঙ্কের হেক্সে রূপান্তর করতে পারি:

    $rhex = sprintf("%02X",round($r));
    $ghex = sprintf("%02X",round($g));
    $bhex = sprintf("%02X",round($b));

    $rgbhex = $rhex.$ghex.$bhex;

g rgbhex হ'ল আমাদের উত্তর - হেক্সের পরিপূরক রঙ।

যেহেতু আপনার রঙের পটভূমি নীল বা 0,0,255 এইচএসএল

হিউ (এইচ): 240 ডিগ্রি / স্যাচুরেশন (এস): 100% / হালকা (এল): 4.9%

240 এর বিপরীতে একটি বৃত্তের 60 হয় তারপরে আরজিবিতে রূপান্তর করুন # 181800 এর মান দেয়


ধন্যবাদ! তবে লিঙ্কটি নিজের একটি "পরিপূরক রঙ" (যাই হোক না কেন) তৈরি করার কথা বলে । আমার সমস্যা সমাধানের জন্য এটি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি এখনও নির্বিঘ্ন: নিশ্চিত হয়ে নিন যে প্রতিটি এলোমেলো রঙ পটভূমির রঙের মতো নয়। পটভূমির রঙ ধ্রুবক, একক রঙ এবং একাধিক বল রয়েছে।
MestreLion

ধন্যবাদ ক্রোম এখন এটি করছেন। @ মাস্টারলিয়ন, যেহেতু ব্যাকগ্রাউন্ড স্থির থাকে আপনি আপনার বলগুলিতে এমন একটি পরিসীমা নির্দিষ্ট করতে পারেন যা এখনও পটভূমিকে পরিপূরক করে।
এস ক্যাসেরিয়া

বর্তমানে আমার উত্তরটি ব্যাখ্যা করছি।
এস কেসারিয়া

সম্পন্ন. সাইটগুলির ব্যাখ্যাতে খুব বেশি কী পরিবর্তন করা যায় তা আমি করি না কারণ এটি যথেষ্ট পরিমাণে ব্যাখ্যা করা হয়েছে। ইজিআরজিবি.কম এ ছেলেদের ক্রেডিট
এস ক্যাসেরিয়া


1

আমি @ ashes999 এর একটি রূপরেখা তৈরির ধারণাটি প্রসারিত করতে চাই।

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

def lerp(a,b,value): # assuming your library was not kind enough to give you this for free
    return a + ((b - a) * value);

def drawRandomBall(bgColour,radius,point):
    var ballColour = Colour(random(0,255),random(0,255),random(0,255);
    var outlineColour = Colour(lerp(bgColour.R,255 - ballColour.R,0.5),lerp(bgColour.G,255 - ballColour.G,0.5),lerp(bgColour.B,255 - ballColour.B,0.5));
    fillCircle(point,radius+1,outlineColour);
    fillCircle(point,radius,ballColour);

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


সম্পাদনা:

প্রকৃত কোডটি ব্যবহারের পরে, পরিস্থিতিটি তার মাথায় উল্টে গেছে, তাই পরিবর্তে আমি এই সমাধানটি দেই।

নিম্নলিখিতগুলির সাথে লাইনগুলি 276-284 প্রতিস্থাপন করুন:

# Colour generator
def generateColourNonBG(leeway):
    color = (randint(0,255), randint(0,255), randint(0,255))
    while color[0] >= BG_COLOR[0]-leeway and color[0] =< BG_COLOR[0] + leeway and
    color[1] >= BG_COLOR[1]-leeway and color[1] =< BG_COLOR[1] + leeway and
    color[2] >= BG_COLOR[2]-leeway and color[2] =< BG_COLOR[2] + leeway:
        color = (randint(0,255), randint(0,255), randint(0,255))

# Ball generator
def generateBall():
    Ball(generateColourNonBG(5),
                   radius=randint(10, radius),
                   position=[randint(100, screen.get_size()[0]-radius),
                             randint(100, screen.get_size()[0]-radius)],
                   velocity=[randint(50, 50+vel[0]), randint(50, 50+vel[1])],
                   )                       

# Create the balls
balls = pygame.sprite.Group()
for _ in xrange(BALLS):
    balls.add(generateBall())

এই নতুন সরলীকৃত সংস্করণে, একটি কারখানা পদ্ধতি বলগুলিকে ছড়িয়ে দেয় এবং একটি বিশেষ পদ্ধতি রঙগুলি উত্পন্ন করে। রঙ জেনারেটরটি এলোমেলোভাবে উত্পাদিত রঙটি পটভূমির রঙের নিবিড়তার একটি নির্দিষ্ট পরিসরের মধ্যে রয়েছে কিনা তা পরীক্ষা করে। এর তিনটি রঙের চ্যানেল যদি leewayবিজি এর উভয় পাশের মধ্যে থাকে তবে কোনও রঙকে বিজির রঙের খুব কাছে মনে করা হয়। সুতরাং যদি অবধি 0 হয় তবে কেবলমাত্র BG এর সাথে মেলে এমন রংগুলি প্রত্যাখ্যান করা হবে। আমি ডিফল্ট হিসাবে 5 টি বেছে নিয়েছি, যা বিজি রঙ এবং 5 টি রঙ উভয় পক্ষকে প্রত্যাখ্যান করে। বিজি রঙ যেহেতু সাদা, তাই আমি নিশ্চিত নই যে এটি কালোটিকে অস্বীকার করবে কিনা কারণ অঙ্কগুলি মোড়কে দেয়। এটি ন্যূনতম এবং সর্বাধিক ক্রিয়াকলাপগুলির সাহায্যে এড়ানো যেতে পারে তবে আমি ব্রেভিটির জন্য এগুলি ছেড়ে দিয়েছি।


আমি যে কোনও কৌশলের জন্য উন্মুক্ত আছি :) যেমন কোনও প্রোগ্রামকে বিকশিত করার জন্য, আমি আপনাকে এটি দিতে পারি: github.com/MestreLion/rainballs প্রাসঙ্গিক লাইনগুলি 279-284 হবে
MestreLion

আমি pygameএকটি গ্রন্থাগার হিসাবে ব্যবহার করছি । কোনও এলার্প নেই, কেবলমাত্র আরজিবি-এইচএসভি- সিওয়াইএমকে
MestreLion

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

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

আপনি printপৃথক কারণ আপনি পাইথন 3 ব্যবহার করছেন এবং আমি এখনও পাইথন 2 এ আছি এবং আমি এখনও নিশ্চিত নই যে পাই 3 pygameতে পোর্ট করা হয়েছিল কিনা । বটমলাইন: বিরক্ত করবেন না :) প্রশ্ন রঙ সম্পর্কিত, আপনার আশেপাশে
উত্সাহিত

1

আরজিবি ফর্ম্যাটের জন্য, এটি যথেষ্ট ভাল কাজ করে বলে মনে হচ্ছে এবং এটি তুচ্ছ:

বৈচিত্র্য_স্কোর = (অ্যাবস (আর 1 - আর 2) + অ্যাবস (জি 1 - জি 2) + অ্যাবস (বি 1 - বি 2)) / 765.0

এটি আপনাকে 0.0 এবং 1.0 এর মধ্যে স্কোর দেবে। দুটি রঙের পার্থক্য করা কম, আরও শক্ত।

এটি সুস্পষ্ট হওয়া উচিত, তবে সম্পূর্ণতার জন্য: আর, জি, বি মানগুলি অবশ্যই একটি ভাসমান বিন্দুতে প্রথমে নিক্ষেপ করা উচিত এবং এটি ধরে নেওয়া হয় যে তাদের সর্বাধিক মান 255।

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