एक अनिवार्य प्रतिपादन इंजन की कल्पना करें जो बिट्स को बिटमैप पर स्पिट करता है जो बाद में प्रदर्शित होता है। यह भारी बिटमैप में व्यक्तिगत पिक्सल को कुशलता से बदलने की क्षमता पर भारी निर्भर करता है। साइड इफेक्ट्स के बिना मैं ऐसी भाषा कैसे करूँगा? मुझे लगता है कि एक पूरी तरह से अलग डेटा संरचना के लिए बुलाया जाता है?मुझे हास्केल में पिक्सेल-आधारित प्रतिपादन की कल्पना कैसे करनी पड़ेगी?
उत्तर
आप किसी भी एल्गोरिदम को परिवर्तित कर सकते हैं जो उत्परिवर्तनीय स्थिति को एल्गोरिदम में उपयोग करता है जो इसके साथ राज्य को "स्ट्रिंग" करता है। हास्केल ऐसा करने का एक तरीका प्रदान करता है कि यह अभी भी राज्य मोनाड के साथ अनिवार्य प्रोग्रामिंग की तरह लगता है।
हालांकि, मुझे लगता है कि मूल ब्लिट ऑपरेशन को और अधिक कार्यात्मक शैली में किया जा सकता है। आप पिक्सेल ऑपरेशन द्वारा पिक्सेल के माध्यम से एक नया बिटमैप बनाने के लिए मूल रूप से दो बिटमैप्स का संयोजन कर रहे हैं। यह मेरे लिए बहुत कार्यात्मक लगता है।
उच्च गुणवत्ता जरूरी कोड अक्सर अच्छा कार्यात्मक कोड की तुलना में तेजी है, लेकिन यदि आप एक छोटे से गति आप सामान्य रूप से एक शुद्ध कार्यात्मक शैली में बहुत अच्छा आर्किटेक्चर बना सकते हैं देने के लिए तैयार हैं
हास्केल साइड इफेक्ट है, और आप जब भी वे उचित हों, उनका उपयोग करना चाहिए। एक उच्च स्पीड ब्लिट रूटीन जो आपके भीतर के पाश में होने जा रही है (और इसलिए प्रदर्शन-महत्वपूर्ण है) निश्चित रूप से एक जगह है कि उत्परिवर्तन उचित है, इसलिए इसका उपयोग करें! आपके पास कुछ विकल्प हैं:
- एसटी (यू) ऐरे या आईओ (यू) ऐरे का उपयोग करके हास्केल में अपना खुद का रोल करें। सिफारिश नहीं की गई।
- सी में अपना खुद का रोल करें, और इसे एफएफआई के साथ कॉल करें। सिफारिश नहीं की गई।
- कई ग्राफिक्स टूलकिट्स में से एक का उपयोग करें जो इस तरह के ऑपरेशन को पहले से ही प्रदान करता है, और इसमें सैकड़ों प्रोग्रामर घंटे उच्च प्रदर्शन, जैसे जीटीके या ओपनजीएल के साथ एक अच्छा इंटरफ़ेस बनाने पर खर्च किए गए हैं। अत्यधिक सिफारिशित।
आनंद लें! इस प्रतिनिधित्व के साथ
Image :: (Int,Int) -> Color
, एक से दूसरे छवि से एक क्षेत्र blitting
blit area a b = \(x,y) -> if (x,y) `isInsideOf` area then a (x,y) else b (x,y)
हैं के साथ प्राप्त किया जाएगा:
एक छवि का प्रतिनिधित्व करने का एक प्राकृतिक कार्यात्मक तरीका सूचकांक समारोह का उपयोग करना है अनुवाद या एक अन्य परिवर्तन की आवश्यकता है, इसे सीधे निर्देशांक पर लागू किया जा सकता है:
translate (dx,dy) image = \(x,y) -> b (x+dx,y+dy)
यह प्रतिनिधित्व आपको छवि बिंदुओं के साथ काम करने का प्राकृतिक तरीका देता है। उदाहरण के लिए, आसानी से गैर आयताकार क्षेत्रों के साथ काम करते हैं, और इसके बजाय अपने सामान्य छवि स्केलिंग एल्गोरिदम का हिस्सा होने के अलग-अलग समारोह के रूप में छवि प्रक्षेप बनाने की तरह चालें कर सकते हैं:
quadraticInterpolation :: ((Int,Int) -> Color) -> ((Double,Double) -> Color)
प्रदर्शन कुछ मामलों में पीड़ित हो सकता है, जैसे कि जब आप एक से अधिक छवियों को एक में दबाते हैं और फिर परिणाम के साथ गणना करते हैं। इसके परिणामस्वरूप प्रत्येक क्रमिक गणना के लिए प्रत्येक पिक्सेल के परीक्षणों की एक श्रृंखला होती है। हालांकि, ज्ञापन को लागू करके, हम अस्थायी रूप से कार्यात्मक प्रतिनिधित्व को सरणी में प्रस्तुत कर सकते हैं और इसे वापस अपने सूचकांक फ़ंक्शन में बदल सकते हैं, इस प्रकार लगातार संचालन के लिए प्रदर्शन हिट को समाप्त कर सकते हैं।
ध्यान दें कि प्रक्रिया के समानांतरता को पेश करने के लिए ज्ञापन का भी उपयोग किया जा सकता है।