ബഹിരാകാശത്ത് കോർഡിനേറ്റ് അക്ഷങ്ങൾ തിരിക്കുക. യൂലർ കോണുകൾ വഴിയുള്ള റൊട്ടേഷൻ മെട്രിക്സുകളുടെ പ്രതിനിധാനം
ദ്വിമാന സ്ഥലത്ത്, ഒരു കാർട്ടീഷ്യൻ കോർഡിനേറ്റ് സിസ്റ്റത്തിൽ ഇനിപ്പറയുന്ന ലീനിയർ ട്രാൻസ്ഫോർമേഷൻ മാട്രിക്സ് ഉപയോഗിച്ച് ഒരൊറ്റ കോണിൽ ഒരു ഭ്രമണം വിവരിക്കാം:
റൊട്ടേറ്റഡ് പോയിൻ്റ് വിവരിക്കുന്ന കോളം വെക്റ്റർ ഉപയോഗിച്ച് റൊട്ടേഷൻ മാട്രിക്സ് ഗുണിച്ചാണ് റൊട്ടേഷൻ നടത്തുന്നത്:
.
പോയിൻ്റ് (x,y) കറക്കുന്നതിൻ്റെ ഫലമായി കോർഡിനേറ്റുകൾക്ക് (x",y") ഫോം ഉണ്ട്:
ഈ സാഹചര്യത്തിൽ, പോസിറ്റീവ് കോണുകൾ സാധാരണ വലത് കൈ കോർഡിനേറ്റ് സിസ്റ്റത്തിൽ വെക്ടറിൻ്റെ എതിർ ഘടികാരദിശയിലും ഇടത് കൈ കോർഡിനേറ്റ് സിസ്റ്റത്തിൽ ഘടികാരദിശയിലും ഭ്രമണം ചെയ്യുന്നു.
[തിരുത്തുക] ത്രിമാന സ്ഥലത്ത് റൊട്ടേഷൻ മാട്രിക്സ്
ഒരു കോണിലൂടെ ഒരു കാർട്ടീഷ്യൻ കോർഡിനേറ്റ് സിസ്റ്റത്തിൻ്റെ അച്ചുതണ്ടിന് ചുറ്റുമുള്ള റൊട്ടേഷൻ മെട്രിക്സ് α ത്രിമാന സ്ഥലത്ത് ഇവയാണ്:
x അക്ഷത്തിന് ചുറ്റുമുള്ള ഭ്രമണം:
,
y അക്ഷത്തിന് ചുറ്റുമുള്ള ഭ്രമണം:
,
z അക്ഷത്തിന് ചുറ്റുമുള്ള ഭ്രമണം:
.
ഈ സാഹചര്യത്തിൽ, പോസിറ്റീവ് ആംഗിളുകൾ വലത് കോർഡിനേറ്റ് സിസ്റ്റത്തിൽ വെക്ടറിൻ്റെ എതിർ ഘടികാരദിശയിലും ഇടത് കോർഡിനേറ്റ് സിസ്റ്റത്തിൽ ഘടികാരദിശയിലും ഭ്രമണവുമായി പൊരുത്തപ്പെടുന്നു, നിങ്ങൾ അർദ്ധ-സ്ഥലത്തിൻ്റെ വശത്ത് നിന്ന് ഭ്രമണ തലം നോക്കുകയാണെങ്കിൽ, കോർഡിനേറ്റ് മൂല്യങ്ങൾ ഭ്രമണം നടത്തുന്ന അച്ചുതണ്ട് പോസിറ്റീവ് ആണ്. ശരിയായ കോർഡിനേറ്റ് സിസ്റ്റം ശരിയായ അടിസ്ഥാനം തിരഞ്ഞെടുക്കുന്നതുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു (ജിംലെറ്റ് നിയമം കാണുക).
റൊട്ടേഷൻ മാട്രിക്സിൻ്റെ സവിശേഷതകൾ.
റൊട്ടേഷൻ മാട്രിക്സ് പ്രോപ്പർട്ടികൾ
ഒരു ആംഗിൾ ϕ കൊണ്ട് ഒരു അച്ചുതണ്ടിന് ചുറ്റും ഭ്രമണം സൂചിപ്പിക്കുന്ന ഒരു മാട്രിക്സ് ആണെങ്കിൽ:
· (റൊട്ടേഷൻ മാട്രിക്സ് ട്രെയ്സ്)
· (മാട്രിക്സിന് ഒരു ഐഡൻ്റിറ്റി ഡിറ്റർമിനൻ്റ് ഉണ്ട്).
· വരികൾ (അല്ലെങ്കിൽ മാട്രിക്സിൻ്റെ നിരകൾ) വെക്റ്ററുകളുടെ കോർഡിനേറ്റുകളായി കണക്കാക്കുന്നുവെങ്കിൽ, ഇനിപ്പറയുന്ന ബന്ധങ്ങൾ ശരിയാണ്:
ഒ
· റിവേഴ്സ് റൊട്ടേഷൻ മാട്രിക്സ്, ഫോർവേഡ് റൊട്ടേഷൻ മാട്രിക്സിൻ്റെ സാധാരണ ട്രാൻസ്പോസിഷൻ വഴിയാണ് ലഭിക്കുന്നത്, അതായത്. .
24. ഒരു സെഗ്മെൻ്റ് റാസ്റ്ററൈസ് ചെയ്യുന്നതിനുള്ള ബ്രെസെൻഹാമിൻ്റെ അൽഗോരിതം.
ബ്രെസെൻഹാമിൻ്റെ അൽഗോരിതം(ഇംഗ്ലീഷ്) ബ്രെസെൻഹാമിൻ്റെ ലൈൻ അൽഗോരിതം) നൽകിയിരിക്കുന്ന രണ്ട് പോയിൻ്റുകൾക്കിടയിലുള്ള ഒരു നേർരേഖയുടെ അടുത്ത ഏകദേശ കണക്ക് ലഭിക്കുന്നതിന് ദ്വിമാന റാസ്റ്ററിലെ ഏത് പോയിൻ്റുകളാണ് ഷേഡ് ചെയ്യേണ്ടതെന്ന് നിർണ്ണയിക്കുന്ന ഒരു അൽഗോരിതം ആണ്. കംപ്യൂട്ടർ ഗ്രാഫിക്സിലെ ഏറ്റവും പഴയ അൽഗോരിതങ്ങളിലൊന്നാണിത് - 1962-ൽ IBM-ൽ ജാക്ക് ഇ ബ്രെസെൻഹാം വികസിപ്പിച്ചെടുത്തതാണ് ഇത്. ഒരു കമ്പ്യൂട്ടർ സ്ക്രീനിൽ വരകൾ വരയ്ക്കുന്നതിന് അൽഗോരിതം വ്യാപകമായി ഉപയോഗിക്കുന്നു. 2nd ഓർഡർ കർവുകൾ നിർമ്മിക്കുന്നതിന് ബ്രെസെൻഹാം അൽഗോരിതത്തിൻ്റെ ഒരു പൊതുവൽക്കരണം ഉണ്ട്.
അൽഗോരിതം
സെഗ്മെൻ്റ് രണ്ട് പോയിൻ്റുകൾക്കിടയിൽ വരച്ചിരിക്കുന്നു - ( x 0 ,വൈ 0) ഒപ്പം ( x 1 ,വൈ 1), ഈ ജോഡികൾ യഥാക്രമം ഒരു നിരയും വരിയും സൂചിപ്പിക്കുന്നു, അവയുടെ സംഖ്യകൾ വലത്തോട്ടും താഴോട്ടും വർദ്ധിക്കുന്നു. ആദ്യം നമ്മുടെ ലൈൻ താഴേക്കും വലത്തോട്ടും തിരശ്ചീന ദൂരത്തിൽ പോകുന്നുവെന്ന് ഞങ്ങൾ അനുമാനിക്കും x 1 − x 0 ലംബമായതിനേക്കാൾ മികച്ചത് വൈ 1 − വൈ 0, അതായത്. തിരശ്ചീനത്തിൽ നിന്നുള്ള വരിയുടെ ചെരിവ് 45°-ൽ താഴെയാണ്. ഓരോ കോളത്തിനും എന്നതാണ് ഞങ്ങളുടെ ലക്ഷ്യം xഇടയിൽ x 0 ഒപ്പം x 1, ഏത് വരി നിർണ്ണയിക്കുക വൈവരയോട് ഏറ്റവും അടുത്ത്, ഒരു പോയിൻ്റ് വരയ്ക്കുക ( x,വൈ).
രണ്ട് പോയിൻ്റുകൾക്കിടയിലുള്ള ഒരു വരിയുടെ പൊതു ഫോർമുല ഇതാണ്:
നമുക്ക് കോളം അറിയാവുന്നതിനാൽ x, പിന്നെ ലൈൻ വൈഇനിപ്പറയുന്ന മൂല്യം മൊത്തത്തിൽ റൗണ്ട് ചെയ്യുന്നതിലൂടെ ലഭിക്കും:
എന്നിരുന്നാലും, ഈ പദപ്രയോഗത്തിൻ്റെ കൃത്യമായ മൂല്യം കണക്കാക്കേണ്ട ആവശ്യമില്ല. അത് ശ്രദ്ധിച്ചാൽ മതി വൈനിന്ന് വളരുന്നു വൈ 0 കൂടാതെ ഓരോ ഘട്ടത്തിനും ഞങ്ങൾ ചേർക്കുന്നു xഒന്ന് ഒപ്പം ചേർക്കുക വൈചരിവ് മൂല്യം
മുൻകൂട്ടി കണക്കാക്കാൻ കഴിയുന്നത്. മാത്രമല്ല, ഓരോ ഘട്ടത്തിലും ഞങ്ങൾ രണ്ട് കാര്യങ്ങളിൽ ഒന്ന് ചെയ്യുന്നു: ഒന്നുകിൽ ഞങ്ങൾ അതേപടി നിലനിർത്തുന്നു വൈ, അല്ലെങ്കിൽ അത് 1 വർദ്ധിപ്പിക്കുക.
ഈ രണ്ടിൽ ഏതാണ് തിരഞ്ഞെടുക്കേണ്ടതെന്ന് ട്രാക്ക് ചെയ്ത് തീരുമാനിക്കാം പിശക് മൂല്യം, അതായത് നിലവിലെ മൂല്യം തമ്മിലുള്ള ലംബമായ ദൂരം വൈകൃത്യമായ മൂല്യവും വൈകറൻ്റിനായി x. നമ്മൾ വർദ്ധിക്കുമ്പോഴെല്ലാം x, ചരിവിൻ്റെ അളവ് കൊണ്ട് ഞങ്ങൾ പിശക് മൂല്യം വർദ്ധിപ്പിക്കുന്നു എസ്, മുകളിൽ നൽകിയിരിക്കുന്നു. പിശക് 0.5 കവിഞ്ഞാൽ, ലൈൻ അടുത്തതിലേക്ക് അടുക്കുന്നു വൈ, അതിനാൽ ഞങ്ങൾ വർദ്ധിപ്പിക്കുന്നു വൈഒന്നായി, ഒരേസമയം പിശക് മൂല്യം 1 ആയി കുറയ്ക്കുന്നു. ചുവടെയുള്ള അൽഗോരിതം നടപ്പിലാക്കുമ്പോൾ, പ്ലോട്ട്(x,y) ഒരു പോയിൻ്റ് വരയ്ക്കുന്നു, കൂടാതെ abs സംഖ്യയുടെ കേവല മൂല്യം നൽകുന്നു:
പ്രവർത്തനംലൈൻ(x0, x1, y0, y1) intഡെൽടാക്സ്:= abs(x1 - x0) int deltay:= abs(y1 - y0) യഥാർത്ഥമായപിശക്:= 0 യഥാർത്ഥമായ deltaerr:= deltay / deltax int y:=y0 വേണ്ടി x നിന്ന് x0 വരെ എങ്കിൽപിശക് >= 0.5 y:= y + 1 പിശക്:= പിശക് - 1.0പിശക്, ഡെൽറ്റേർ തുടങ്ങിയ യഥാർത്ഥ മൂല്യങ്ങൾ ഉപയോഗിച്ച് കമ്പ്യൂട്ടറുകൾ താരതമ്യേന സാവധാനത്തിൽ പ്രവർത്തിക്കുന്നു എന്നതാണ് ഈ സമീപനത്തിലെ പ്രശ്നം. കൂടാതെ, ഫ്ലോട്ടിംഗ് പോയിൻ്റ് കണക്കുകൂട്ടൽ സമയത്ത് പിശകുകൾ ശേഖരിക്കപ്പെടാം. ഈ കാരണങ്ങളാൽ, പൂർണ്ണസംഖ്യകളിൽ മാത്രം പ്രവർത്തിക്കുന്നതാണ് നല്ലത്. ഡെൽടാക്സ് ഉപയോഗിക്കുന്ന എല്ലാ യഥാർത്ഥ മൂല്യങ്ങളും ഗുണിച്ചുകൊണ്ട് ഇത് ചെയ്യാൻ കഴിയും. സ്ഥിരമായ 0.5 ആണ് ഒരേയൊരു പ്രശ്നം - എന്നാൽ ഈ സാഹചര്യത്തിൽ അസമത്വത്തിൻ്റെ ഇരുവശങ്ങളെയും 2 കൊണ്ട് ഗുണിച്ചാൽ മതിയാകും. നമുക്ക് ഇനിപ്പറയുന്ന കോഡ് ലഭിക്കും:
പ്രവർത്തനംലൈൻ(x0, x1, y0, y1) intഡെൽടാക്സ്:= abs(x1 - x0) int deltay:= abs(y1 - y0) intപിശക്:= 0 intഡെൽറ്റേർ: = ഡെൽറ്റേ int y:=y0 വേണ്ടി x നിന്ന് x0 വരെ x1 പ്ലോട്ട്(x,y) പിശക്:= പിശക് + deltaerr എങ്കിൽ 2 * പിശക് >= ഡെൽടാക്സ് y:= y + 1 പിശക്:= പിശക് - ഡെൽടാക്സ്പൂർണ്ണസംഖ്യകൾക്കായി 2 കൊണ്ട് ഗുണിക്കുന്നത് ഇടതുവശത്തേക്ക് ഒരു ബിറ്റ് ഷിഫ്റ്റ് വഴി നടപ്പിലാക്കുന്നു.
ഇപ്പോൾ നമുക്ക് 1-ൽ താഴെയുള്ള ചരിവ് മൂല്യം ഉപയോഗിച്ച് വലത്തോട്ടും താഴോട്ടും ഡയറക്റ്റ് ചെയ്ത വരകൾ വേഗത്തിൽ വരയ്ക്കാം. എല്ലാ ദിശകളിലേക്കും ഡ്രോയിംഗിലേക്ക് അൽഗോരിതം വിപുലീകരിക്കാൻ ഇത് ശേഷിക്കുന്നു. ഊഹക്കാഴ്ചകളിലൂടെയാണ് ഇത് നേടിയെടുക്കുന്നത്, അതായത്. ചിഹ്നം മാറ്റുന്നു (1 ൻ്റെ ഒരു ഘട്ടം -1 ഉപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കുന്നു), വേരിയബിളുകൾ കൈമാറ്റം ചെയ്യുന്നു xഒപ്പം വൈ, സെഗ്മെൻ്റിൻ്റെ തുടക്കത്തിൻ്റെ കോർഡിനേറ്റുകൾ അവസാനത്തിൻ്റെ കോർഡിനേറ്റുകളുമായി കൈമാറ്റം ചെയ്യുന്നു.
[തിരുത്തുക] വരകൾ വരയ്ക്കുന്നു
C++ ൽ നടപ്പിലാക്കൽ:
അസാധുവായ ഡ്രോലൈൻ (int x1, int y1, int x2, int y2)( int deltaX = abs (x2 - x1); int deltaY = abs (y2 - y1); int signX = x1< x2 ? 1: -1; int signY = y1 < y2 ? 1: -1; int error = deltaX - deltaY; for (;;) { setPixel(x1, y1); if(x1 == x2 && y1 == y2) break; int error2 = error * 2; if(error2 >-deltaY) (പിശക് -= deltaY; x1 += signX; ) if(error2< deltaX) { error += deltaX; y1 += signY; } }}
25. ഒരു സർക്കിൾ റാസ്റ്ററൈസ് ചെയ്യുന്നതിനുള്ള ബ്രെസെൻഹാമിൻ്റെ അൽഗോരിതം.
സർക്കിളുകൾ വരയ്ക്കുന്നു
സർക്കിളുകൾ വരയ്ക്കുന്നതിന് ബ്രെസെൻഹാമിൻ്റെ അൽഗോരിതം ഉണ്ട്. ഒരു വര വരയ്ക്കുന്നതിന് സമാനമാണ് നിർമ്മാണ രീതി. ഈ അൽഗോരിതത്തിൽ, ആദ്യത്തെ ക്വാഡ്രൻ്റിനായി ഒരു വൃത്താകൃതിയിലുള്ള ആർക്ക് നിർമ്മിക്കപ്പെടുന്നു, ശേഷിക്കുന്ന ക്വാഡ്രൻ്റുകളുടെ സർക്കിൾ പോയിൻ്റുകളുടെ കോർഡിനേറ്റുകൾ സമമിതിയായി ലഭിക്കും. അൽഗോരിതത്തിൻ്റെ ഓരോ ഘട്ടത്തിലും, മൂന്ന് പിക്സലുകൾ പരിഗണിക്കപ്പെടുന്നു, കൂടാതെ കേന്ദ്രത്തിൽ നിന്ന് തിരഞ്ഞെടുത്ത പിക്സലിലേക്കുള്ള ദൂരം സർക്കിളിൻ്റെ ആരവുമായി താരതമ്യം ചെയ്തുകൊണ്ട് അവയിൽ നിന്ന് ഏറ്റവും അനുയോജ്യമായത് തിരഞ്ഞെടുക്കുന്നു.
// R - ആരം, X1, Y1 - സെൻ്റർ കോർഡിനേറ്റുകൾ int x:= 0 int y:= ആർ intഡെൽറ്റ:= 2 - 2 * ആർ intപിശക്:= 0 സമയത്ത്(y >= 0) ഡ്രോപിക്സൽ (X1 + x, Y1 + y) ഡ്രോപിക്സൽ (X1 + x, Y1 - y) ഡ്രോപിക്സൽ (X1 - x, Y1 + y) ഡ്രോപിക്സൽ (X1 - x, Y1 - y) പിശക് = 2 * (ഡെൽറ്റ + y) - 1 എങ്കിൽ((ഡെൽറ്റ< 0) && (error <= 0)) delta += 2 * ++x + 1 തുടരുകപിശക് = 2 * (ഡെൽറ്റ - x) - 1 എങ്കിൽ((ഡെൽറ്റ > 0) && (പിശക് > 0)) ഡെൽറ്റ += 1 - 2 * --y തുടരുക x++ ഡെൽറ്റ += 2 * (x - y) y--
അസാധുവായ ഡ്രോ സർക്കിൾ (int x0, int y0, int radius) ( int x = 0; int y = ആരം; int delta = 2 - 2 * radius; int error = 0; while(y >= 0) ( setPixel(x0 + x , y0 + y); setPixel (x0 - x, y0 - y) - 1 ;< 0 && error <= 0) { ++x; delta += 2 * x + 1; continue; } error = 2 * (delta - x) - 1; if(delta >0 && പിശക് > 0) ( --y; ഡെൽറ്റ += 1 - 2 * y; തുടരുക; ) ++x; ഡെൽറ്റ += 2 * (x - y); --y; ))
വുവിൻ്റെ സ്മൂത്തിംഗ് അൽഗോരിതം.
വുവിൻ്റെ അൽഗോരിതംമിനുസപ്പെടുത്തൽ ഉപയോഗിച്ച് ഒരു സെഗ്മെൻ്റ് ഒരു റാസ്റ്ററിലേക്ക് വിഘടിപ്പിക്കുന്നതിനുള്ള ഒരു അൽഗോരിതം ആണ്. വു സിയോലിൻ നിർദ്ദേശിച്ചത് ( Xiaolin Wu 1991 ജൂലൈയിൽ കമ്പ്യൂട്ടർ ഗ്രാഫിക്സ് മാഗസിൻ പ്രസിദ്ധീകരിച്ച ഒരു ലേഖനത്തിൽ അൽഗോരിതത്തിന് റഷ്യൻ നാമം നന്നായി സ്ഥാപിതമായി. അൽഗോരിതം ഉയർന്ന നിലവാരമുള്ള ഡി-അലിയാസിംഗും ബ്രെസെൻഹാം അൽഗോരിതത്തോട് ചേർന്നുള്ള വേഗതയും ആൻ്റി-അലിയാസിംഗ് ഇല്ലാതെ സംയോജിപ്പിക്കുന്നു.
അൽഗോരിതം
തിരശ്ചീനവും ലംബവുമായ വരികൾക്ക് ആൻ്റി-അലിയാസിംഗ് ആവശ്യമില്ല, അതിനാൽ അവ പ്രത്യേകം വരയ്ക്കുന്നു. ശേഷിക്കുന്ന വരികൾക്കായി, ബ്രെസെൻഹാം അൽഗോരിതത്തിന് സമാനമായി മൈനർ അക്ഷത്തിൽ കോർഡിനേറ്റുകൾ തിരഞ്ഞെടുത്ത് വു അൽഗോരിതം അവയെ പ്രധാന അക്ഷത്തിലൂടെ കടന്നുപോകുന്നു. വ്യത്യാസം, വു അൽഗോരിതത്തിൽ, ഓരോ ഘട്ടത്തിലും ഒന്നല്ല, രണ്ട് പോയിൻ്റുകൾ സ്ഥാപിച്ചിട്ടുണ്ട്. ഉദാഹരണത്തിന്, പ്രധാന അക്ഷം ആണെങ്കിൽ എക്സ്, തുടർന്ന് കോർഡിനേറ്റുകളുള്ള പോയിൻ്റുകൾ (x, y), (x, y+1) എന്നിവ പരിഗണിക്കും. പിക്സലുകൾ നോൺ-പ്രൈമറി അക്ഷത്തിൽ നിന്ന് അനുയോജ്യമായ വരിയിൽ നിന്ന് എത്ര ദൂരം പോയി എന്ന് കാണിക്കുന്ന പിശകിൻ്റെ വ്യാപ്തിയെ ആശ്രയിച്ച്, ഈ രണ്ട് പോയിൻ്റുകൾക്കിടയിൽ തീവ്രത വിതരണം ചെയ്യപ്പെടുന്നു. ആദർശരേഖയിൽ നിന്ന് ഒരു ബിന്ദു എത്രത്തോളം അകന്നിരിക്കുന്നുവോ അത്രയും അതിൻ്റെ തീവ്രത കുറയും. രണ്ട് പിക്സലുകളുടെ തീവ്രത മൂല്യങ്ങൾ എല്ലായ്പ്പോഴും ഒന്നിലേക്ക് കൂട്ടിച്ചേർക്കുന്നു, അതായത്, അനുയോജ്യമായ വരിയിൽ കൃത്യമായി വീഴുന്ന ഒരു പിക്സലിൻ്റെ തീവ്രതയാണിത്. ഈ വിതരണം ലൈനിന് അതിൻ്റെ മുഴുവൻ നീളത്തിലും ഒരേ തീവ്രത നൽകും, അതേസമയം പോയിൻ്റുകൾ രണ്ടായിട്ടല്ല, ഒരു സമയം ഒന്നായി സ്ഥിതിചെയ്യുന്നുവെന്ന മിഥ്യാധാരണ സൃഷ്ടിക്കുന്നു.
അൽഗോരിതത്തിൻ്റെ ഫലം
സ്യൂഡോകോഡിൽ നടപ്പിലാക്കൽ (x ലൈനിന് മാത്രം):
പ്രവർത്തനംപ്ലോട്ട്(x, y, c) ആണ് // കോർഡിനേറ്റുകൾ (x, y) // തെളിച്ചം c (ഇവിടെ 0 ≤ c ≤ 1) ഉപയോഗിച്ച് ഒരു പോയിൻ്റ് വരയ്ക്കുന്നു പ്രവർത്തനം ipart(x) തിരിച്ചുവരവ് ആണ് x-ൻ്റെ പൂർണ്ണസംഖ്യ പ്രവർത്തനംറൗണ്ട്(x) തിരിച്ചുവരവ് ആണ് ipart(x + 0.5) // അടുത്തുള്ള പൂർണ്ണസംഖ്യയിലേക്ക് റൗണ്ട് പ്രവർത്തനം fpart(x) തിരിച്ചുവരവ് ആണ് ഫ്രാക്ഷണൽ ഭാഗം x പ്രവർത്തനം draw_line(x1,y1,x2,y2) എങ്കിൽ ആണ് x2< x1 പിന്നെ സ്വാപ്പ്(x1, x2) സ്വാപ്പ്(y1, y2) എങ്കിൽ അവസാനിപ്പിക്കുക dx:= x2 - x1 dy:= y2 - y1 ഗ്രേഡിയൻ്റ്:= dy ÷ dx // ആരംഭ പോയിൻ്റ് പ്രോസസ്സ് ചെയ്യുക xend:= റൗണ്ട്(x1) yend:= y1 + ഗ്രേഡിയൻ്റ് × (xend - x1) xgap:= 1 - fpart(x1 + 0.5) xpxl1:= xend ypxl1:= ipart(yend) പ്ലോട്ട്(xpxl1, ypxl1, 1 - fpart(yend) × xgap) പ്ലോട്ട്(xpxl1, ypxl1 + 1, fpart(yend) × xgap) ഇൻ്ററി:= yend + ഗ്രേഡിയൻ്റ് // ലൂപ്പിനുള്ള ആദ്യ y-ഇൻ്റർസെക്ഷൻ // പ്രോസസ്സ് എൻഡ്പോയിൻ്റ് xend:= റൗണ്ട്(x2) yend:= y2 + ഗ്രേഡിയൻ്റ് × (xend - x2) xgap:= fpart(x2 + 0.5) xpxl2:= xend // പ്രധാന ലൂപ്പിൽ ഉപയോഗിക്കും ypxl2:= ipart(yend) പ്ലോട്ട്(xpxl2, ypxl2, 1 - fpart(yend) × xgap) പ്ലോട്ട്(xpxl2, ypxl2 + 1, fpart(yend) × xgap) // പ്രധാന ലൂപ്പ് വേണ്ടി x നിന്ന് xpxl1 + 1 വരെ xpxl2 - 1 ചെയ്യുകപ്ലോട്ട്(x, ipart(intery), 1 - fpart(intery)) പ്ലോട്ട്(x, ipart(intery) + 1, fpart(intery)) intery:= intery + gradient ആവർത്തന പ്രവർത്തനം26. പെയിൻ്റിംഗ് അൽഗോരിതങ്ങൾ.
പെയിൻ്റിംഗ് അൽഗോരിതം
ബോർഡറുകളുള്ള ആകൃതികൾ വരയ്ക്കുന്നതിന് കമ്പ്യൂട്ടർ ഗ്രാഫിക്സിൽ പെയിൻ്റിംഗ് അൽഗോരിതം പലപ്പോഴും ഉപയോഗിക്കുന്നു. ഈ അൽഗോരിതത്തിന് മറ്റ് ആപ്ലിക്കേഷനുകളും ഉണ്ടാകാം, ഉദാഹരണത്തിന്, ഒരു ശരീരത്തിൻ്റെ പിണ്ഡത്തിൻ്റെ കേന്ദ്രം അതിൻ്റെ ഇമേജിൽ നിന്ന് കണ്ടെത്താൻ ഇത് ഉപയോഗിക്കാം.
2D റാസ്റ്റർ ഗ്രാഫിക്സ് അൽഗോരിതം: ഷേഡിംഗ്
ഒരു റാസ്റ്ററിൽ ഇതിനകം വരച്ച ഒരു ഏകപക്ഷീയമായ കോണ്ടൂർ വരയ്ക്കുന്നതിനുള്ള അൽഗോരിതങ്ങൾ നമുക്ക് പരിഗണിക്കാം. ആദ്യം, ആകൃതിയുടെ രൂപരേഖയ്ക്കുള്ളിൽ ഒരു പിക്സൽ സ്ഥിതി ചെയ്യുന്നു. ഈ പിക്സലിൻ്റെ നിറം ആവശ്യമുള്ള നിറത്തിലേക്ക് മാറ്റുക. തുടർന്ന് എല്ലാ അയൽ പിക്സലുകളുടെയും നിറം വിശകലനം ചെയ്യുന്നു. അയൽപക്കത്തുള്ള ചില പിക്സലിൻ്റെ നിറം ബോർഡർ വർണ്ണത്തിനോ ഫിൽ നിറത്തിനോ തുല്യമല്ലെങ്കിൽ, ആ പിക്സലിൻ്റെ നിറം ഫിൽ നിറത്തിലേക്ക് മാറ്റും.
ലളിതമായ ആവർത്തന പാഡിംഗ്.
നടപടിക്രമം PixelFill(x, y, BCColor, Color: Integer);
(x, y - സീഡ് പോയിൻ്റിൻ്റെ കോർഡിനേറ്റുകൾ, BCColor - ബോർഡർ നിറം,
നിറം - നിറങ്ങൾ നിറയ്ക്കുക)
C:=GetPixel (x,y) (നിലവിലെ പിക്സൽ നിറം വിശകലനം ചെയ്യുക)
എങ്കിൽ (സി<>ബി കളർ) കൂടാതെ (സി<>നിറം) പിന്നെ
PutPixel(x, y, നിറം);
PixelFill(x+1, y, BCColor, Colour);
PixelFill(x, y+1, BCColor, Colour);
PixelFill(x-1, y, BCColor, Colour);
PixelFill(x, y-1, BCColor, Colour);
ഈ അൽഗോരിതം സ്റ്റാക്ക് മെമ്മറി ഉപയോഗത്തിനായി ഒപ്റ്റിമൈസ് ചെയ്തിട്ടില്ല, ഇത് ഏറ്റവും വേഗത കുറഞ്ഞ ഷേഡിംഗ് അൽഗോരിതങ്ങളിൽ ഒന്നാണ് (ശരാശരി, ഷേഡിംഗിനായി നാലിൽ ഒന്ന് കോളുകൾ മാത്രമേ ഉപയോഗിക്കുന്നുള്ളൂ). ഫിൽ കളർ കൊണ്ട് പരിമിതപ്പെടുത്തിയ ഏരിയകൾ പൂരിപ്പിക്കാൻ അൽഗോരിതത്തിന് കഴിയില്ല. നിങ്ങൾ ഒരു സ്റ്റാക്കിന് പകരം അറേകൾ ഉപയോഗിക്കുകയാണെങ്കിൽ ആവർത്തനമില്ലാതെ സമാനമായ ഒരു അൽഗോരിതം നിർമ്മിക്കാൻ കഴിയും.
വരകൾ ഉപയോഗിച്ച് പെയിൻ്റ് ചെയ്യുന്നതിനുള്ള അൽഗോരിതം.
1. കോർഡിനേറ്റുകളുള്ള ഒരു സീഡ് പോയിൻ്റ് ഉണ്ട് (x st, y st)ആവർത്തന കോളുകളുടെ പ്രവർത്തനത്തിൻ്റെ പ്രാരംഭ ദിശയും dir=1. ഇടത്, വലത് അതിരുകളുടെ പാരാമീറ്ററുകൾ തുടക്കത്തിൽ സീഡ് പോയിൻ്റിൻ്റെ കോർഡിനേറ്റുകളുമായി പൊരുത്തപ്പെടുന്നു: x PL = x st , x PR = x st . നടപടിക്രമം വിളിക്കുന്നു ലൈൻഫിൽ, ഇതിൽ:
2. x L, x R എന്നിവയുണ്ട് - ഇടത്, വലത് അതിരുകൾ, അവയ്ക്കിടയിൽ നിലവിലെ തിരശ്ചീന രേഖ വരച്ചിരിക്കുന്നു.
3. ഇൻക്രിമെൻ്റ് ഉണ്ടാക്കിയിട്ടുണ്ട് y=y+dirകൂടാതെ, x L നും x R നും ഇടയിൽ, പിക്സലുകളുടെ നിറം വിശകലനം ചെയ്യുന്നു കഴിഞ്ഞുലൈൻ. പൂരിപ്പിക്കൽ നിറവുമായി പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, നടപടിക്രമം ലൈൻഫിൽകൂടെ ആവർത്തിച്ച് വിളിച്ചു dir = 1കൂടാതെ xPL = xL, xLR = xR.
4. ഇൻക്രിമെൻ്റ് ഉണ്ടാക്കിയിട്ടുണ്ട് y=y–dirകൂടാതെ, x L മുതൽ മുമ്പത്തെ മൂല്യം x PL വരെ, വരിയുടെ കീഴിലുള്ള പിക്സലുകളുടെ നിറം വിശകലനം ചെയ്യുന്നു. പിക്സൽ നിറം ഫിൽ നിറത്തിൽ നിന്ന് വ്യത്യസ്തമാണെങ്കിൽ, നടപടിക്രമത്തെ ആവർത്തനമായി വിളിക്കുന്നു dir = –1കൂടാതെ xPL = xL, xPR = xR.
5.
മുമ്പത്തെ x PR മുതൽ x R വരെയുള്ള അതേ തിരശ്ചീന രേഖയിൽ തുടരുമ്പോൾ, നിറം വിശകലനം ചെയ്യുന്നു കീഴിൽലൈൻ. ഏതെങ്കിലും പിക്സലിൻ്റെ നിറം ഫിൽ നിറത്തിൽ നിന്ന് വ്യത്യസ്തമാണെങ്കിൽ, നടപടിക്രമത്തെ റികർസിവ് ആയി വിളിക്കുന്നു dir = –1കൂടാതെ xPL = xL, xPR = xR.
C++-ൽ ഈ അൽഗോരിതം നടപ്പിലാക്കുന്നതിൻ്റെ ഒരു ഉദാഹരണം ചുവടെ:
void LineFill (int x, int y, int dir, int xPL, int xPR)
// ഈ വേരിയബിൾ പിക്സൽ നിറം സംഭരിക്കും
// നിലവിലെ അതിരുകൾ xL ഉം xR ഉം സജ്ജമാക്കുക
നിറം = GetPixel(--xL,y);
// xL=xL-1 ഫംഗ്ഷൻ കോളിൽ സ്ഥാപിച്ചിരിക്കുന്നു
അതേസമയം (നിറം != bcolor); // bcolor - ബോർഡർ നിറം
നിറം = GetPixel(++xR,y);
അതേസമയം (നിറം !=bcolor);
ലൈൻ(xL,y, xR,y, Mycolor);
//ഇത് ഏത് ലൈൻ ഡ്രോയിംഗ് ഫംഗ്ഷനും ആകാം
// ലൈനിന് മുകളിലുള്ള പിക്സലുകൾ വിശകലനം ചെയ്യുക
ഇതിനായി (x=xL; x<=xR; x++) {
നിറം = GetPixel(x, y+dir);
എങ്കിൽ (നിറം !=bcolor)
x = LineFill(x, y+dir, dir, xL, xR);
// ഇടതു വശത്തുള്ള വരിയുടെ കീഴിലുള്ള പിക്സലുകൾ വിശകലനം ചെയ്യുക
ഇതിനായി (x=xL; x<=xPL; x++) {
നിറം = GetPixel(x, y-dir);
എങ്കിൽ (നിറം !=bcolor)
// വലത് വശത്തുള്ള വരിയുടെ കീഴിലുള്ള പിക്സലുകൾ വിശകലനം ചെയ്യുക
ഇതിനായി (x=xPR; x<=xR; x++) {
നിറം = GetPixel(x, y-dir);
എങ്കിൽ (നിറം !=bcolor)
x = LineFill(x, y-dir, –dir, xL, xR);
പ്രോഗ്രാമുകളിൽ, ലൈൻഫിൽ ഫംഗ്ഷനെ ഇനിപ്പറയുന്ന രീതിയിൽ വിളിക്കുന്നു:
LineFill(xst, yst, 1, xst, xst);
മറ്റ് കാര്യക്ഷമമായ പൂരിപ്പിക്കൽ അൽഗോരിതങ്ങൾ ഉണ്ടെന്ന് വ്യക്തമാണ്. ഉദാഹരണത്തിന്, കോണ്ടൂരിൻ്റെ ഗണിതശാസ്ത്ര വിവരണം ഉപയോഗിക്കുന്ന ഫില്ലിംഗ് അൽഗോരിതങ്ങൾ പൂരിപ്പിക്കേണ്ട ബഹുഭുജത്തിൻ്റെ പ്രത്യേക രൂപവുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു (ഉദാഹരണത്തിന്, ഒരു ദീർഘചതുരം അല്ലെങ്കിൽ ഒരു വൃത്തം). ഈ സാഹചര്യത്തിൽ, കോണ്ടൂർ റാസ്റ്ററിൽ പ്രദർശിപ്പിച്ചേക്കില്ല. അതേ സമയം, ഏതെങ്കിലും ടെക്സ്ചർ ഒരു ഫിൽ ആയി ഉപയോഗിക്കുന്നത് എളുപ്പമാണ്.
27. സതർലാൻഡ്-കോഹൻ സെഗ്മെൻ്റ് കട്ടിംഗ് അൽഗോരിതം.
കോഹൻ-സതർലാൻഡ് അൽഗോരിതം(ഇംഗ്ലീഷ്) കോഹൻ-സതർലാൻഡ്) സെഗ്മെൻ്റുകൾ മുറിക്കുന്നതിനുള്ള ഒരു അൽഗോരിതം, അതായത്, ഒരു ദീർഘചതുരം വിഭജിക്കുന്ന ഒരു സെഗ്മെൻ്റിൻ്റെ ഭാഗം നിർണ്ണയിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്ന ഒരു അൽഗോരിതം. 1966-1968 കാലഘട്ടത്തിൽ ഹാർവാർഡിലെ ഡാൻ കോഹനും ഇവാൻ സതർലാൻഡും ചേർന്ന് ഇത് വികസിപ്പിച്ചെടുത്തു, 1968 ലെ AFIPS കോൺഫറൻസിൽ പ്രസിദ്ധീകരിച്ചു.
അൽഗോരിതം വിവരണം
അൽഗോരിതം വിമാനത്തെ നേർരേഖകളാൽ 9 ഭാഗങ്ങളായി വിഭജിക്കുന്നു, ഇത് ദീർഘചതുരത്തിൻ്റെ വശങ്ങൾ രൂപപ്പെടുത്തുന്നു. 9 ഭാഗങ്ങളിൽ ഓരോന്നിനും നാല്-ബിറ്റ് കോഡ് നൽകിയിരിക്കുന്നു. ബിറ്റുകൾ (കുറഞ്ഞത് പ്രാധാന്യമുള്ളത് മുതൽ ഏറ്റവും പ്രധാനപ്പെട്ടത് വരെ) അർത്ഥമാക്കുന്നത് "ഇടത്തേക്ക്", "വലത്തേക്ക്", "താഴെ", "മുകളിൽ" എന്നാണ്. മറ്റൊരു വിധത്തിൽ പറഞ്ഞാൽ, ദീർഘചതുരത്തിൻ്റെ ഇടതുവശത്തുള്ള വിമാനത്തിൻ്റെ മൂന്ന് ഭാഗങ്ങൾക്ക് 1 ന് തുല്യമായ ഏറ്റവും കുറഞ്ഞ പ്രാധാന്യമുള്ള ബിറ്റ് ഉണ്ട്.
സെഗ്മെൻ്റിൻ്റെ അവസാന പോയിൻ്റുകൾക്കുള്ള കോഡ് അൽഗോരിതം നിർണ്ണയിക്കുന്നു. രണ്ട് കോഡുകളും പൂജ്യത്തിന് തുല്യമാണെങ്കിൽ, സെഗ്മെൻ്റ് പൂർണ്ണമായും ദീർഘചതുരത്തിൽ അടങ്ങിയിരിക്കുന്നു. കോഡുകളുടെ ബിറ്റ്വൈസ് AND പൂജ്യമല്ലെങ്കിൽ, സെഗ്മെൻ്റ് ദീർഘചതുരത്തെ വിഭജിക്കില്ല (ഇതിനർത്ഥം സെഗ്മെൻ്റിൻ്റെ രണ്ട് അവസാന പോയിൻ്റുകളും ദീർഘചതുരത്തിൻ്റെ ഒരേ വശത്താണെന്നാണ്). മറ്റ് സന്ദർഭങ്ങളിൽ, അൽഗോരിതം ദീർഘചതുരത്തിന് പുറത്തുള്ള ഒരു എൻഡ്പോയിൻ്റ് തിരഞ്ഞെടുക്കുന്നു, ദീർഘചതുരത്തിൻ്റെ വശങ്ങൾ രൂപപ്പെടുത്തുന്ന ഒരു വരി ഉപയോഗിച്ച് സെഗ്മെൻ്റിൻ്റെ ഏറ്റവും അടുത്തുള്ള ഇൻ്റർസെക്ഷൻ പോയിൻ്റ് കണ്ടെത്തുന്നു, കൂടാതെ ഈ ഇൻ്റർസെക്ഷൻ പോയിൻ്റ് സെഗ്മെൻ്റിൻ്റെ പുതിയ അവസാന പോയിൻ്റായി ഉപയോഗിക്കുന്നു. ചുരുക്കിയ സെഗ്മെൻ്റ് വീണ്ടും അൽഗോരിതത്തിലൂടെ കടന്നുപോകുന്നു.
ഒരു ത്രിമാന മോഡലിനായുള്ള അൽഗോരിതം നടപ്പിലാക്കുന്നത് ദ്വിമാന നിർവ്വഹണത്തിന് സമാനമാണ്, അല്ലാതെ നാല്-ബിറ്റ് കോഡിന് പകരം ഒരു ആറ്-ബിറ്റ് കോഡ് ഉപയോഗിക്കുന്നു (കൂടുതൽ രണ്ട് ബിറ്റ് ഡെപ്ത്).
28. മിഡ്പോയിൻ്റ് പാർട്ടീഷനിംഗ് അൽഗോരിതം.
ഒരു കോർഡിനേറ്റ് സിസ്റ്റം അല്ലെങ്കിൽ ഒബ്ജക്റ്റ്, സീൻ തിരിക്കാൻ റൊട്ടേഷൻ മാട്രിക്സ് ഉപയോഗിക്കുന്നു.
പ്രധാന അക്ഷങ്ങൾക്ക് ചുറ്റുമുള്ള റൊട്ടേഷൻ മെട്രിക്സ്.
ഏകപക്ഷീയമായ അക്ഷത്തിന് ചുറ്റുമുള്ള റൊട്ടേഷൻ മാട്രിക്സ്.
പൊതുവായ റൊട്ടേഷൻ മാട്രിക്സ്.
ബഹിരാകാശത്ത് ഒരു വസ്തുവിൻ്റെ സ്ഥാനം അവ്യക്തമായി വ്യക്തമാക്കാൻ ഞാൻ ആഗ്രഹിക്കുന്നു. വ്യത്യസ്ത അക്ഷങ്ങൾക്ക് ചുറ്റുമുള്ള 3 ഭ്രമണങ്ങളാൽ ഏത് സ്ഥാനവും അദ്വിതീയമായി നിർണ്ണയിക്കപ്പെടുന്നു എന്നത് വളരെ വ്യക്തമാണ്. എന്നാൽ ഏത് ക്രമത്തിലാണ് തിരിയേണ്ടത്, അക്ഷങ്ങൾ എങ്ങനെ തിരഞ്ഞെടുക്കാം എന്ന ചോദ്യം ഉയർന്നുവരുന്നു.
സാമാന്യവൽക്കരിച്ച റൊട്ടേഷൻ മാട്രിക്സ് വ്യത്യസ്ത രീതികളിൽ വ്യക്തമാക്കാം. ഒരു വശത്ത്, നമുക്ക് നിശ്ചിത അക്ഷങ്ങൾക്ക് ചുറ്റും ഒരു വസ്തുവിനെ തിരിക്കാം. മറുവശത്ത്, വസ്തുവുമായി ബന്ധപ്പെട്ട അക്ഷങ്ങൾക്ക് ചുറ്റും അവയെ ലോക്കൽ എന്നും വിളിക്കുന്നു. മാട്രിക്സ് ഗുണനത്തിൻ്റെ പ്രവർത്തനം കമ്മ്യൂട്ടേറ്റീവ് അല്ല എന്നത് ഓർമ്മിക്കേണ്ടതാണ്, അതിനാൽ, സ്ഥാനം അദ്വിതീയമായി നിർണ്ണയിക്കാൻ, നിങ്ങൾ 3 കോണുകൾ മാത്രമല്ല, മാട്രിക്സ് ഗുണന പദ്ധതിയും അറിയേണ്ടതുണ്ട്.
2 ജനപ്രിയ സ്കീമുകൾ ഉണ്ട്.
1) യൂലർ കോണുകൾ വഴിയുള്ള റൊട്ടേഷൻ മാട്രിക്സ്.
2) വിമാനത്തിൻ്റെ കോണുകളിലൂടെയുള്ള റൊട്ടേഷൻ മാട്രിക്സ്: യോ, പിച്ച്, റോൾ.
ആദ്യത്തേതിന് ധാരാളം കണക്കുകൂട്ടലുകൾ ആവശ്യമുള്ളതിനാൽ, പ്രായോഗികമായി രണ്ടാമത്തേത് സാധാരണയായി ഉപയോഗിക്കുന്നു.
യൂലർ കോണുകൾ വഴിയുള്ള റൊട്ടേഷൻ മാട്രിക്സ്.
ഒരു നിശ്ചിത കോർഡിനേറ്റ് സിസ്റ്റത്തിൽ നിന്ന് ചലിക്കുന്ന ഒന്നിലേക്കുള്ള പരിവർത്തനത്തെ നിർവചിക്കുന്ന, കർക്കശമായ ശരീരത്തിൻ്റെ ഓറിയൻ്റേഷൻ അദ്വിതീയമായി നിർണ്ണയിക്കുന്ന മൂന്ന് കോണുകളാണ് യൂലർ കോണുകൾ.
ശരീരവുമായി ഘടിപ്പിച്ചിരിക്കുന്ന കോർഡിനേറ്റ് സിസ്റ്റമാണ് ചലിക്കുന്ന കോർഡിനേറ്റ് സിസ്റ്റം. ചിലപ്പോൾ അവർ പറയും ഐസ്ക്രീം ശരീരത്തിൽ ഉണ്ടെന്ന്. കോണുകളുടെ നിർവചനങ്ങൾ നൽകുന്നതിന് മുമ്പ്, നമുക്ക് ഒരു കാര്യം കൂടി ആവശ്യമാണ്. നോഡുകളുടെ ലൈൻ ഓൺ - ഓക്സി, ഓക്സി പ്ലെയിനുകളുടെ കവലയുടെ വരി
α (അല്ലെങ്കിൽ φ) ഓക്സ് അക്ഷത്തിനും ഓൺ അക്ഷത്തിനും ഇടയിലുള്ള കോണാണ്. മൂല്യങ്ങളുടെ ശ്രേണി)