वर्ग से षट्भुज तक निर्बाध रूपांतरण


23

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

हालांकि , मैं अपने बुढ़ापे में आलसी हो गया हूं। एक छोटी स्क्रिप्ट के साथ प्रक्रिया को स्वचालित करना आसान होना चाहिए।

हालांकि , मैं अपने बुढ़ापे में आलसी हो गया हूं। तो मैं इसे आपके लिए आउटसोर्सिंग कर रहा हूं, और इसे कोड गोल्फ चुनौती 1 के रूप में प्रच्छन्न कर रहा हूं ।


इनपुट

इनपुट 24-बिट आरजीबी रंग में सक्षम किसी भी सामान्य छवि प्रारूप में एक वर्ग छवि है। आप छवि डेटा के बजाय इनपुट के रूप में फ़ाइल नाम भी ले सकते हैं।

आप मान सकते हैं कि छवि वर्गाकार है, और यह कि साइड की लंबाई चार से अधिक है।

उत्पादन

आउटपुट इनपुट टाइल है, लेकिन एक षट्भुज में परिवर्तित हो जाता है (छवि स्वयं ही चौकोर होगी, पारदर्शी क्षेत्रों के साथ)। आप इसे फ़ाइल या स्क्रीन पर प्रदर्शित करने के लिए सहेज सकते हैं।

फिर से, कोई भी सामान्य छवि प्रारूप करेगा। यदि आप जिस प्रारूप का उपयोग कर रहे हैं, वह पारदर्शिता का समर्थन करता है, तो पृष्ठभूमि क्षेत्र पारदर्शी होना चाहिए। यदि ऐसा नहीं होता है, तो आप स्टैंड-इन के रूप में रंग # FF00FF (वह भयानक फ्यूशिया एक) का उपयोग कर सकते हैं।

तरीका

तो हम ऐसा कैसे करें? मैं जिस विधि का उपयोग करता हूं वह 2 वर्गाकार छवि को थोड़ा लंबवत खड़ी करती है, लेकिन कुल मिलाकर यह ज्यादातर चीजों के लिए बहुत अच्छी लगती है। हम इस इनपुट छवि के साथ एक उदाहरण देंगे:

इनपुट

  • स्केल: छवि को ३: २ के अनुपात में स्केल करें। चूंकि हमारी छवियां चौकोर होंगी, इसका मतलब है कि आप उन्हें 75% चौड़ाई और 50% ऊँचाई पर मापेंगे। हमारा उदाहरण इनपुट 200x200 है, इसलिए हम इस 150x100 चित्र को समाप्त करते हैं:

कुचल

  • टाइल: 2x2 ग्रिड में अपनी स्केल की गई छवि की प्रतियां नीचे रखें:

ग्रिड

  • फसल: इस 2x2 ग्रिड में कहीं से भी उचित आकार के षट्भुज को पकड़ो। अब, आसानी से टाइलिंग के लिए, यह षट्भुज बिल्कुल नियमित नहीं है। मूल आकार (यहां 200x200) के एक वर्ग को काटकर, आप फिर कोनों को काटते हैं। फसल की रेखाएं ऊपरी (नीचे) किनारे से एक चौथाई तक प्रत्येक बाईं / दाईं ओर के केंद्र से (लगभग) चलना चाहिए:

हेक्स

और वह आपका आउटपुट है!

यहाँ पर इसका उदाहरण दिया जा सकता है कि यह कैसा दिख सकता है जब टाइल किया जाता है (यहाँ से ज़ूम आउट किया गया है):

टाइलों

यह कोड गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा कोड है। मानक खामियों लागू होते हैं, आदि और इतने पर।


1 इस पर विश्वास करें या न करें।
2 इस उपयोगी साइट से एक विधि


13
यह सवाल हेक्सागोनी जवाब के लिए भीख माँग रहा है।
Sanchises

22
@ खुशकिस्मती।
मार्टिन एंडर

17
यही वह जगह है जहां हेक्स एगोनी का दूसरा भाग महत्वपूर्ण हो जाता है।
दोष

2
@ mbomb007 शायद, हालांकि # 00FF00 हरे रंग का है जो कभी-कभी उपयोग किया जाता है, लगभग इतना बुरा नहीं है। फिर भी, मुझे ऐसा लगता है कि वे फ़ुचिया का उपयोग अधिक बार करते हैं क्योंकि उनके दाहिने दिमाग में कोई नहीं चाहेगा कि उनके स्प्राइट में सटीक रंग हो , इसलिए यह बहुत सार्वभौमिक है: पी
जियोबिट्स

3
# 3 - मैं इस धैर्य से इंतजार करता हूं कि शांत एल्गोरिदम उत्पन्न हुआ है ... फिर धीरे से और प्यार से "उधार" उन्हें मेरे उपयोग के लिए
;;

जवाबों:


10

मतलाब, 223 215 209 184 163 बाइट्स

रिस्कलिंग काफी सीधा है। कोनों को क्रॉप करने के लिए, मैं पिक्सल पर एक समन्वय प्रणाली को ओवरले करता हूं, और चार रैखिक असमानताओं के माध्यम से एक मुखौटा बनाता हूं, जो हेक्सागोन के क्षेत्र को निर्धारित करता है।

​l=imread(input(''));
u=size(l,1);
L=imresize(l,u*[2 3]/4);
L=[L,L;L,L];L=L(1:u,1:u,:);
[x,y]=meshgrid(1:u);
r=u/2;x=x*2;
set(imshow(L),'Al',y<x+r&y+x>r&y+x<5*r&y>x-3*r)

यहाँ छवि विवरण दर्ज करें

PS: यह @ मार्टिनबटनर के प्रस्तुतिकरण के साथ एक कोडगैम निम गेम में बदल गया : आपको बारी-बारी से अपना कोड छोटा करना होगा (उसी कार्यक्षमता प्रदान करते हुए) - वह जो अंतिम 'शॉर्टिंग' जीतता है =)


आप आकार परिवर्तन की गणना में बदलकर 5 बाइट्स बचा सकते हैं [k.*[2 3]/4]
बीकर

4
क्या पृष्ठभूमि क्षेत्रों को काले रंग का नहीं होना चाहिए?
ब्लैकहोल

@ ब्लेकहोल मुझे बताने के लिए धन्यवाद, मैंने इसे अभी ठीक कर दिया है, यहां तक ​​कि मुझे बाइट्स का एक गुच्छा भी = =)
बचाया

12

गणितज्ञ, 231 211 209 208 201 188 173 बाइट्स

ImageCrop[ImageCollage@{#,#,#,#},e,Left]~SetAlphaChannel~ColorNegate@Graphics[RegularPolygon@6,ImageSize->1.05e,AspectRatio->1]&@ImageResize[#,{3,2}(e=ImageDimensions@#)/4]&

यह एक अनाम फ़ंक्शन है जो एक इमेज ऑब्जेक्ट लेता है और एक इमेज ऑब्जेक्ट लौटाता है:

यहाँ छवि विवरण दर्ज करें

मुझे नहीं लगता कि यहां समझाने के लिए बहुत कुछ है, लेकिन कुछ विवरण जो नोट के हैं:

  • आम तौर पर, एक छवि 2x2 को टाइल करने के लिए, आप उपयोग करेंगे ImageAssemble[{{#,#},{#,#}}], अर्थात आप ImageAssembleछवि की प्रतियों के साथ 2x2 मैट्रिक्स को हाथ करेंगे । हालांकि, ImageCollageकुछ प्रकार के जादू फ़ंक्शन हैं जो चित्रों के एक गुच्छा को "अच्छी तरह से" संभव के रूप में व्यवस्थित करने की कोशिश करता है (जो भी इसका मतलब है ... आप व्यक्तिगत छवियों को भार और सामान भी दे सकते हैं)। वैसे भी, आप इसे समान आकार के चार चित्र देते हैं और समान (या नहीं) भार के साथ, यह उन्हें 2x2 ग्रिड में भी व्यवस्थित करेगा। यह मुझे मैट्रिक्स के नेस्टिंग के लिए कुछ बाइट्स को बचाने की अनुमति देता है, साथ ही फ़ंक्शन का नाम भी।
  • षट्कोण के माध्यम से एक बहुभुज के रूप में गाया जाता है Graphics। मैं बिल्ट-इन का उपयोग कर रहा हूं RegularPolygon@6, लेकिन 1आवश्यक रूप से इसे फैलाने के लिए एक पहलू अनुपात लागू करता हूं । दुर्भाग्य से, Graphicsपैडिंग और इस तरह से बचने के लिए कुछ महंगे विकल्पों की आवश्यकता है, और यह विपरीत के बजाय सफेद पर काला भी प्रदान करता है। परिणाम के साथ तय किया गया है ColorNegateऔर फिर छवि के मूल चैनलों के साथ संलग्न किया गया है SetAlphaChannel
  • Graphicsषट्भुज के चारों ओर थोड़ी सी पैडिंग लगाता है, लेकिन हम चाहते हैं कि अल्फा षट्भुज कटआउट के पूर्ण आकार को कवर करे। हालांकि, SetAlphaChannelविभिन्न आकारों की छवियों को जोड़ सकते हैं, उन्हें एक दूसरे के शीर्ष पर केंद्रित करके और सबसे छोटे आकार के लिए क्रॉप कर सकते हैं। इसका मतलब है, मैन्युअल रूप से सेटिंग के बजाय PlotRangePadding->0, हम केवल षट्भुज छवि को थोड़ा बढ़ा सकते हैं ImageSize->1.05e(और हमें वैसे भी `ImageSize की आवश्यकता है)।

5

HTML5 + जावास्क्रिप्ट, 562 बाइट्स

<html><form><input type=text></form><canvas><script>l=document.body.children;l[0].addEventListener("submit",e=>{e.preventDefault();c=l[1].getContext("2d");i=new Image();i.onload=q=>{l[1].width=l[1].height=d=i.width;c.scale(0.75,0.5);c.drawImage(i,0,0);c.drawImage(i,d,0);c.drawImage(i,0,d);c.drawImage(i,d,d);c.globalCompositeOperation="destination-in";c.scale(1/0.75,2);c.beginPath();c.moveTo(d/4,0);c.lineTo(d/4+d/2,0);c.lineTo(d, d/2);c.lineTo(d/4+d/2, d);c.lineTo(d/4, d);c.lineTo(0, d/2);c.closePath();c.fill();};i.src=e.target.children[0].value;})</script>

टेक्स्ट बॉक्स के माध्यम से एक छवि URL के रूप में इनपुट लेता है (URL उम्मीद है कि फ़ाइल नाम के रूप में गिना जाता है)। डेटा को कैनवास में आउटपुट करता है।

संस्करण जो सभी ब्राउज़रों में काम करता है (580 बाइट्स):

<html><form><input type=text></form><canvas><script>l=document.body.children;l[0].addEventListener("submit",function(e){e.preventDefault();c=l[1].getContext("2d");i=new Image();i.onload=function(){l[1].width=l[1].height=d=i.width;c.scale(0.75,0.5);c.drawImage(i,0,0);c.drawImage(i,d,0);c.drawImage(i,0,d);c.drawImage(i,d,d);c.globalCompositeOperation = "destination-in";c.scale(1/0.75,2);c.beginPath();c.moveTo(d/4, 0);c.lineTo(d/4+d/2,0);c.lineTo(d, d/2);c.lineTo(d/4+d/2, d);c.lineTo(d/4, d);c.lineTo(0, d/2);c.closePath();c.fill();};i.src=e.target.children[0].value;})</script>

इस URL के माध्यम से पहले "ब्लॉक" छवि के साथ इसका परीक्षण करें: http://i.stack.imgur.com/gQAZh.png


अच्छा काम! आप जोड़कर काफी कुछ बाइट्स बचा सकता है id=Aकरने के लिए <form>और id=Bकरने के लिए <canvas>है, तो जगह l[0]के साथ Aऔर l[1]साथ B, और हटाने l=document.body.children;। (फ़ायरफ़ॉक्स 41 में काम करता है; सुनिश्चित नहीं है कि कौन से अन्य ब्राउज़र इसका समर्थन करते हैं।) इसके अलावा, मेरा मानना ​​है कि दाएं घुंघराले कोष्ठक के बगल में अनावश्यक अर्धविराम के कुछ जोड़े हैं, और कुछ अतिरिक्त स्थान हैं।
ETHproductions

और टिप्स: मैं आप जोड़ सकते मानना है कि id=Cकरने के लिए <input>है, तो बदलने के e.target.children[0]साथ C0.75के बराबर है 3/4, 1/0.75के बराबर है 4/3, d/4+d/2के बराबर है d*3/4और अन्य दशमलव पर अग्रणी शून्य आवश्यक नहीं है। मैं भी आप पहली बार बदल सकते मानना है कि c.drawImageसाथ c[p="drawImage"]के साथ है, तो बाद के हर एक c[p]; आप भी ऐसा ही कर सकते हैं c.lineTo
ETHproductions

4

पायथन 2 + पीआईएल, 320

स्टड से छवि फ़ाइल का नाम पढ़ता है।

from PIL import ImageDraw as D,Image as I
i=I.open(raw_input())
C=A,B=i.size
i,j=i.resize((int(.75*A),B/2)),I.new('RGBA',C)
W,H=i.size
for a,b in[(0,0),(0,H),(W,0),(W,H)]:j.paste(i,(a,b,a+W,b+H))
p,d=[(0,0),(A/4,0),(0,B/2),(A/4,B),(0,B)],lambda p:D.Draw(j).polygon(p,fill=(0,)*4)
d(p)
d([(A-x,B-y)for x,y in p])
j.show()

सच है, इस बारे में खेद है, PILकोशिश करने के लिए आसान नहीं था और मैंने इसके बारे में पर्याप्त नहीं सोचा था। मैं अभी भी अपने नए स्टेटमेंट के साथ खड़ा हूं: P
FryAmTheEggman

2

PHP, 293 बाइट्स

मैंने पठनीयता के लिए कुछ नए समाचार जोड़े हैं:

function($t){$s=imagesx($t);imagesettile($i=imagecreatetruecolor($s,$s),$t=imagescale
($t,$a=$s*3/4,$b=$s/2));imagefill($i,0,0,IMG_COLOR_TILED);$z=imagefilledpolygon;$z($i,
[0,0,$s/4,0,0,$b,$s/4,$s,0,$s],5,$f=imagecolorallocate($i,255,0,255));$z($i,[$s,0,$a,
0,$s,$b,$a,$s,$s,$s],5,$f);return$i;}

यहाँ ungolfed संस्करण है:

function squareToHexagon($squareImage)
{
    $size = imagesx($squareImage);
    $tileImage = imagescale($squareImage, $size * 3/4, $size/2);

    $hexagonImage = imagecreatetruecolor($size, $size);
    imagesettile($hexagonImage, $tileImage);
    imagefill($hexagonImage, 0, 0, IMG_COLOR_TILED);

    $fuchsia = imagecolorallocate($hexagonImage, 255, 0, 255);
    imagefilledpolygon(
        $hexagonImage,
        [
            0,       0,
            $size/4, 0,
            0,       $size/2,
            $size/4, $size,
            0,       $size,
        ],
        5,
        $fuchsia
    );
    imagefilledpolygon(
        $hexagonImage,
        [
            $size,       0,
            $size * 3/4, 0,
            $size,       $size/2,
            $size * 3/4, $size,
            $size,       $size,
        ],
        5,
        $fuchsia
    );

    return $hexagonImage;
}

header('Content-type: image/gif');
$squareImage = imagecreatefrompng('squareImage.png');
$hexagonImage = squareToHexagon($squareImage);
imagegif($hexagonImage);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.