मक्खी पर चरना


10

क्या किसी को कोई भी एल्गोरिथ्म पता है जो कि ग्लिफ़ शेप्स के आधार पर कैरेक्टरों की कर्निंग की गणना तब करेगा जब यूजर टाइप करेंगे?

मैं अग्रिम चौड़ाई या इसी तरह की तुच्छ गणना का मतलब नहीं है, मेरा मतलब है कि वर्णों के लिए नेत्रहीन इष्टतम दूरी का अनुमान लगाने के लिए ग्लिफ़ के आकार का विश्लेषण करना। उदाहरण के लिए यदि हम तीन वर्णों को क्रम से एक पंक्ति में रखते हैं, तो मध्य वर्ण को वर्ण के आकृतियों के बावजूद रेखा के केंद्र में होना चाहिए। एक उदाहरण kern-on-the-fly कार्यक्षमता को प्रबुद्ध करता है:

कर्नन-ऑन-द-फ्लाई का एक उदाहरण:

स्क्रीनशॉट

ऊपर की छवि में aभी सही लगता है। इसे एक निश्चित राशि की ओर स्थानांतरित किया जाना चाहिए Tताकि यह Tऔर के बीच में हो g। एल्गोरिथ्म के आकार जांच करनी चाहिए Tऔर a(और संभवतः अन्य पत्र भी) और फैसला कितना aबाईं ओर स्थानांतरित कर दिया जाना है। यह निश्चित राशि वह चीज़ है जिसे एल्गोरिथ्म को गणना करना चाहिए - फॉंट की स्थिति के बारे में सोचने के बिना।

मैं एक जावास्क्रिप्ट (+ svg + html) प्रोग्राम को कोड करने के बारे में सोच रहा हूं जो हाथ से तैयार फोंट का उपयोग करता है और उनमें से कई में कर्लिंग जोड़े का अभाव है। Textfields संपादन योग्य होगा और इसमें कई फोंट का पाठ शामिल हो सकता है। मुझे लगता है कि इस मामले में औसत पाठ प्रवाह सुनिश्चित करने के लिए कर्न-ऑन-द-फ्लाई एक तरीका हो सकता है।

संपादित करें: इसके लिए एक प्रारंभिक बिंदु svg फ़ॉन्ट का उपयोग किया जा सकता है, इसलिए पथ मान प्राप्त करना आसान है। Svg फ़ॉन्ट में पथ को इस प्रकार परिभाषित किया गया है:

<glyph glyph-name="T" unicode="T" horiz-adv-x="1251" d="M531 0v1293h
-483v173h1162v-173h-485v-1293h-194z"/>

<glyph glyph-name="a" unicode="a" horiz-adv-x="1139" d="M828 131q-100 -85
-192.5 -120t-198.5 -35q-175 0 -269 85.5t-94 218.5q0 78 35.5 142.5t93
103.5t129.5 59q53 14 160 27q218 26 321 62q1 37 1 47q0 110 -51 155q-69 61
-205 61q-127 0 -187.5 -44.5t-89.5 -157.5l-176 24q24 113 79 182.5t159
107t241 37.5 q136 0 221 -32t125 -80.5t56 -122.5q9 -46 9 -166v-240q0
-251 11.5 -317.5t45.5 -127.5h-188q-28 56 -36 131zM813 533q-98 -40 -294
-68q-111 -16 -157 -36t-71 -58.5t-25 -85.5q0 -72 54.5 -120t159.5 -48q104
0 185 45.5t119 124.5q29 61 29 180v66z"/>

एल्गोरिथ्म (या जावास्क्रिप्ट कोड) को उन रास्तों की किसी तरह जांच करनी चाहिए और उनके बीच की अधिकतम दूरी को निर्धारित करना चाहिए।


1
यदि आप एक कोडिंग समाधान की तलाश में हैं, तो यह SO पर बेहतर होगा। कि तुम क्या देख रहे हो? यदि हां, तो मैं इस सवाल का जवाब दूंगा।
एलन गिल्बर्टसन

2
मैं मानता हूं कि यह SO प्रश्न है। मैं एसओ में एक ही सवाल पूछा, लेकिन यह वहाँ में विषय के रूप में बंद कर दिया गया था। फिर math.stackexchange पर पूछा गया, लेकिन वही समापन हुआ। यह तीसरा स्थान है, यह सही जगह हो सकता है, जो कोई भी जानता है।
टिमो किन्कोनन

2
मुझे नहीं पता कि एल्गोरिथ्म कैसे काम करता है, लेकिन इनडिजाइन यह कर सकता है: "ऑप्टिकल कर्निंग अपने आकृतियों के आधार पर आसन्न वर्णों के बीच रिक्ति को समायोजित करता है। कुछ फोंट में मजबूत केर्न-जोड़ी विनिर्देश शामिल हैं। हालांकि, जब एक फॉन्ट में केवल न्यूनतम अंतर्निर्मित शामिल होते हैं। कर्निंग या कोई नहीं, या यदि आप एक पंक्ति में एक या अधिक शब्दों में दो अलग-अलग टाइपफेस या आकारों का उपयोग करते हैं, तो आप ऑप्टिकल कर्निंग विकल्प का उपयोग करना चाह सकते हैं। " help.adobe.com/en_US/indesign/cs/use/…
e100

2
मुझे लगता है कि यह संभवत: दायरे में है जहां तक ​​एक सामान्य एल्गोरिदम जाता है - एक समस्या को हल करने के लिए किए जाने वाले चरणों का एक क्रम। लेकिन मुझे नहीं लगता कि जेएस या अन्य भाषा में कार्यान्वयन की बारीकियां हैं, और केवल जेएस को पृष्ठभूमि उपयोग के मामले के रूप में उल्लेख करने के लिए संपादन कर रहा हूं।
e100

1
मुझे लगता है कि व्यापार का पहला क्रम "इष्टतम" को इस तरह से परिभाषित करना है जो मशीन एल्गोरिथ्म के लिए उपयोगी है।
क्षितिज 15

जवाबों:


4

मुझे पता है यह पुराना है। मैं अभी इस पर काम कर रहा हूँ wobbly पाठ (जो भी) के एक WebGL कार्यान्वयन में। मैं जिस समाधान पर काम कर रहा हूं वह इस प्रकार है:

  1. ग्लिफ़ जोड़ी का एक बिटमैपित संस्करण प्राप्त करें (या यदि आप चाहें तो इसे वैक्टर के साथ करें)
  2. पिक्सल की प्रत्येक पंक्ति के लिए (या यदि आप वैक्टर के साथ जाते हैं, तो ऊर्ध्वाधर इकाई), जांचें कि दोनों ग्लिफ़ में कम से कम एक पिक्सेल मौजूद है
  3. चरण 2 से गुजरने वाली प्रत्येक पंक्ति के लिए, पहले ग्लिफ़ के सबसे दाहिने पिक्सेल के बीच की दूरी और दूसरे पाँच ग्लिफ़ के बाएँ पिक्सेल की गणना करें
  4. दूसरे ग्लिफ़ को जहाँ तक छोड़ा जा सकता है, ले जाएँ, जबकि वह इन मानदंडों को पूरा करता है:
    • पिक्सेल की उस पंक्ति में अंतराल आपके द्वारा निर्दिष्ट कुछ न्यूनतम अंतर से अधिक है
    • कुल क्षेत्र (एक ग्लिफ़ में कोई पिक्सेल के साथ पंक्तियों को अनदेखा करना) आपके द्वारा निर्दिष्ट कुछ न्यूनतम क्षेत्र से अधिक है

इस तरह, अक्षरों के बीच के खाली 'क्षेत्र' को काफी सामान्य औसत में निचोड़ लिया जाना चाहिए। परीक्षण और त्रुटि और अपने स्वयं के स्वाद का उपयोग करके न्यूनतम अंतराल और न्यूनतम क्षेत्र को निर्दिष्ट करें, और शायद उन मापदंडों को किसी अन्य एजेंट द्वारा समायोजित किया जा सकता है ... जैसे मैनुअल कर्नेल मूल्य।

वाह :)

संपादित करें: मैंने इसे अब सफलतापूर्वक पूरा कर लिया है और यह वास्तव में अच्छी तरह से काम करता है :)


अच्छा उत्तर! GD.SE :)
Yisela

स्वागत के लिए धन्यवाद: D !! मुझे यह जोड़ना चाहिए कि क्षेत्र को वास्तव में परीक्षण की जा रही पंक्तियों की संख्या से विभाजित किया जाना चाहिए (जो वास्तव में सिर्फ इसे एक औसत अंतर बनाता है और वास्तव में एक क्षेत्र नहीं है)। और यह भी परीक्षण करना अच्छा होगा यदि किसी पंक्ति का अंतर एक सांख्यिकीय रूपरेखा है और यदि यह है तो उस पंक्ति को अनदेखा करें। जब 'जी' में एक बड़ा उद्घाटन होता है, तब भी नज़दीकी अक्षरों से बचने में मदद मिलेगी
जया

कुछ समस्याएँ यहाँ-वहाँ देखने को मिलती हैं, जैसे कुछ फॉन्ट-स्टाइल में टी-या-ओ ’। टी- हाइफ़न को टी के बहुत करीब जाने का रास्ता दें, और ओ 'ने एक ही पंक्ति में किसी भी पिक्सेल को साझा नहीं किया, इसलिए मैंने ऐसा होने पर प्रत्येक पिक्सेल के साथ निकटतम पंक्तियों का उपयोग करने के लिए एक वापसी की। उपरोक्त एल्गोरिथ्म को अधिक मजबूत बनाने के लिए, आपको इस प्रकार की समस्याओं के लिए किसी न किसी तरह से जांच करनी होगी। मेरे उद्देश्यों के लिए, यह आवश्यक नहीं था।
जया

3

यह एक काफी सरल एल्गोरिथ्म है जिसे मैंने एक बार आजमाया था, और यह काफी अच्छा हो सकता है।

अक्षरों को कम रिज़ॉल्यूशन में रेंडर करें - समान क्षैतिज के बारे में छह या सात पिक्सेल लंबा (विशिष्ट पूंजी की ऊंचाई) कहें। आप एक साधारण बाइनरी मैप चाहते हैं, जहां एक साधारण लो-रेस ग्रिड पर पत्र के कुछ हिस्सों बनाम खाली जगह हो।

"Fatten" इन पत्र नक्शे। यही है, प्रत्येक खाली सेल को भरें जो एक भरे हुए सेल के निकट है। यह खाली किनारों को अक्षर किनारों के सबसे करीब होने का दावा करना है, इसलिए पड़ोसी पत्र बहुत करीब नहीं पहुंचता है।

जिसके परिणामस्वरूप पत्र के नक्शे के साथ "क्षैतिज टेट्रिस" खेलें। गुरुत्वाकर्षण को बाईं ओर कार्य करने दें। "टी" के ओवरबार के नीचे गुहा में बाएं हाथ के "पेट" को "ए" "गिर" जाएगा। "A" चाल कितनी कोशिकाओं में थी? अक्षरों के वास्तविक आकार के अनुपात में स्केल और यह कि वास्तविक उच्च-रिज़ॉल्यूशन को "बायीं ओर" कर्नेल करने के लिए कितनी दूर है।


1
धन्यवाद! अपने एल्गोरिथ्म की कल्पना करने के लिए आप एरियल का उपयोग करते हुए जोड़े "डीबी", "एए", "टा" और "सी-" का उपयोग करके कुछ कम रेज छवि उदाहरण प्रदान कर सकते हैं।
तिमो Kähkönen

अच्छी शुरुआत, लेकिन मैं सोच रहा हूं कि यह सीमित हो सकता है जहां प्रोट्रूबेंट पात्रों के जोड़े एक साथ "टेट्रिस" नहीं करते हैं, उदाहरण के लिए "बीडी", "टीटी", "पीके", "जीजे"
e100

@ e100: पहली नज़र में उन विशिष्ट युग्मन में बाउंडिंग बक्सों को ओवरलैपिंग नहीं होगा ...
20

लेकिन आम तौर पर बोलते हुए, उन्हें "एमएम", "एनएन" आदि की तुलना में सख्त होना चाहिए
e100

2

ऑटो-कर्निंग के लिए एल्गोरिदम पहले से मौजूद हैं। कोई भी मूर्ख-प्रूफ नहीं होता है और उन्हें कुछ खास पहलुओं पर हाथ पकड़ने और मैनुअल सुधार की आवश्यकता होती है, खासकर यदि आपकी ट्रैकिंग अपेक्षाकृत तंग हो।

लेकिन वे एल्गोरिदम फ़ॉन्ट फ़ाइल में कर्निंग को लागू करने के लिए हैं, अक्षरों के लिए नहीं, क्योंकि वे फ़ॉन्ट फ़ाइल से उत्पन्न होते हैं।

क्या आपने फ़ॉन्ट फ़ाइल में ऑटो-कर्निंग लगाने पर विचार किया है?

Fontforge (खुला स्रोत) और Fontlab (वाणिज्यिक) में ऑटो-कर्निंग एल्गोरिदम शामिल हैं। उनके पास अपेक्षाकृत कठिन सीखने की अवस्था होती है - आपको तकनीकी पहलुओं से परिचित होना होगा कि फोंट कैसे काम करते हैं।

वहाँ iKern भी है जो कि एक लड़का है जो एक वाणिज्यिक फ़ॉन्ट-कर्निंग सेवा प्रदान करता है जिसके द्वारा वह आपके लिए आपके फ़ॉन्ट को कर्नेल करता है और एक उत्कृष्ट कार्य करता है। मुझे नहीं पता कि इसकी लागत कितनी होगी।


लेकिन सवाल वास्तव में "इस तरह के एक एल्गोरिथ्म कैसे काम करेगा?" - क्या आप FontForge के कार्यों पर कोई विवरण जोड़ सकते हैं?
e100


0

मुझे यह पूरी तरह से सोचने, या चित्र बनाने के लिए समय नहीं मिला है, लेकिन मेरे पास एक आधा विचार था, जो प्रत्येक ग्लिफ़ को पहले खड़ी करने के लिए आधारित था।

फिर प्रत्येक आधे के लिए, दो ऊर्ध्वाधर कुल्हाड़ियों को निर्धारित करें: - द्विभाजक - बाएं और दाएं चरम के बीच बिल्कुल आधा - "वजन" अक्ष - प्रत्येक पक्ष पर बिल्कुल आधा स्याही

फिर आसन्न पड़ोसी ग्लिफ़ को दो अक्षों के सापेक्ष पदों के आधार पर परीक्षण आधा-ग्लिफ़ से दूर या दूर ले जाएँ।

इसलिए, उदाहरण के लिए, "एवी" जोड़ी में, ए का दाहिना आधा बाएं-भारी है और "वी" को आकर्षित करता है; V का बायां आधा दायां-भारी है, जो "A" को आकर्षित करता है, इस प्रकार वे एक साथ काफी कर्नेल कर लेते हैं।

हालाँकि, मुझे यकीन है कि इसमें एक दोष है कि "एए" को "एवी" के समान ही एक साथ जोड़ दिया जाएगा।


0

ऊपरी मामले और छोटे मामले को ध्यान में रखते हुए, 56X55=2652फ़ॉन्ट-जोड़ी स्थितियां हैं जिन्हें आपको चिंता करनी चाहिए, सभी समाधान आसानी से टूट सकते हैं यदि आप फ़ॉन्ट शैली को बदलते हैं, तो सभी नियम चले गए हैं।

सबसे अच्छा तरीका मशीन सीखने की तकनीक का उपयोग करना है, तंत्रिका नेटवर्क अध्ययन मॉडल को स्थापित करने की कोशिश करना है, और इस तरह के कई कर्नड टेक्स्ट छवि या वेक्टर या चीजों को आयात करना है, उस मॉडल को प्रशिक्षित करना और किसी भी प्रकार के फ़ॉन्ट को बुद्धिमानी से समायोजित करने के लिए उस प्रशिक्षित मॉडल का उपयोग करना है।

कारण फ़ॉन्ट को रूट में पूरी तरह से समायोजित करने के लिए कोई स्थिर एल्गोरिथ्म नहीं है, मशीन सीखना इस तरह की समस्या का एक अच्छा समाधान होगा!


नहीं तो केवल व्यक्तिपरक मापदंड हैं। "क्या यह कुत्ता या बिल्ली है?", चाहे कितना भी अजीब लग रहा हो, फिर भी इसका सटीक उत्तर है। (भले ही यह सत्यापित करने के लिए पशु चिकित्सक लेता हो।)
usr2564301
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.