বর্গক্ষেত্র থেকে ষড়ভুজকে নির্বিঘ্ন রূপান্তর


23

একটি গ্রিডে খেলা অনেক গেমের জন্য, ষড়জাগুলি হ'ল স্পষ্টতই উচ্চতর পছন্দ ™ ™ দুর্ভাগ্যক্রমে, অনেক ফ্রি গেম আর্ট সাইটের বর্গাকার মানচিত্রের জন্য কেবল বিরামবিহীন টাইল সেট রয়েছে। একটি অতীত প্রকল্পে, আমি এর কয়েকটি ব্যবহার করেছি এবং ম্যানুয়ালি এগুলি হেক্সাগনগুলিতে রূপান্তর করেছি।

তবে , আমি আমার বৃদ্ধ বয়সে অলস হয়ে পড়েছি। একটি ছোট স্ক্রিপ্ট দিয়ে প্রক্রিয়াটি স্বয়ংক্রিয় করা সহজ হওয়া উচিত।

তবে , আমি আমার বৃদ্ধ বয়সে অলস হয়ে পড়েছি। সুতরাং আমি এটি আপনার কাছে আউটসোর্স করছি এবং এটি একটি কোড গল্ফ চ্যালেঞ্জ 1 হিসাবে ছদ্মবেশ করছি ।


ইনপুট

ইনপুটটি 24-বিট আরজিবি রঙের জন্য সক্ষম যে কোনও সাধারণ চিত্র বিন্যাসে বর্গাকার চিত্র। আপনি নিজেরাই চিত্রের ডেটার পরিবর্তে ইনপুট হিসাবে কোনও ফাইলের নাম নিতে পারেন।

আপনি ধরে নিতে পারেন যে চিত্রটি বর্গক্ষেত্র এবং পাশের দৈর্ঘ্য চারটির একাধিক।

আউটপুট

আউটপুট হ'ল ইনপুট টাইল, তবে একটি ষড়ভুজ রূপান্তরিত (স্বচ্ছ অঞ্চল সহ চিত্রটি নিজেই বর্গক্ষেত্র হবে)। আপনি এটি কোনও ফাইলে সংরক্ষণ করতে পারেন বা স্ক্রিনে প্রদর্শন করতে পারেন।

আবার যে কোনও সাধারণ চিত্র বিন্যাসটি করবে। আপনি যে ফর্ম্যাটটি ব্যবহার করছেন তা যদি স্বচ্ছতা সমর্থন করে তবে পটভূমি অঞ্চলগুলি অবশ্যই স্বচ্ছ হতে হবে। যদি এটি না হয়, আপনি স্ট্যান্ড-ইন হিসাবে রঙ # FF00FF (সেই ভয়ঙ্কর ফুচিয়া একটি) ব্যবহার করতে পারেন।

পদ্ধতি

সুতরাং আমরা এটা কিভাবে করব? আমি যে পদ্ধতিতে 2 স্কোয়াশ ব্যবহার করি তা চিত্রটিকে কিছুটা উল্লম্বভাবে ব্যবহার করা হয় তবে সামগ্রিকভাবে এটি বেশিরভাগ জিনিসের জন্য বেশ সুন্দর দেখাচ্ছে good আমরা এই ইনপুট চিত্র সহ একটি উদাহরণ করব:

ইনপুট

  • স্কেল: চিত্রটিকে একটি 3: 2 অনুপাতের আকারে স্কেল করুন। যেহেতু আমাদের চিত্রগুলি বর্গক্ষেত্র হবে, এর অর্থ হল আপনি এগুলি কেবল 75% প্রস্থ এবং 50% উচ্চতায় স্কেল করুন। আমাদের উদাহরণ ইনপুট 200x200, সুতরাং আমরা এই 150x100 চিত্রটি দিয়ে শেষ করব:

squashed উপরে

  • টাইল: আপনার স্কেল করা চিত্রের কপিগুলি 2x2 গ্রিডে রাখুন:

গ্রিড

  • শস্য: এই 2x2 গ্রিডের যে কোনও জায়গা থেকে যথাযথ আকারের ষড়ভুজটি ধরুন। এখন, টাইলিংয়ের স্বাচ্ছন্দ্যের জন্য, এই ষড়ভুজটি ঠিক নিয়মিত নয়। মূল আকারের একটি বর্গক্ষেত্র কাটানোর পরে (এখানে 200x200), আপনি তারপরে কোণগুলি কেটে ফেলুন। শস্যের লাইনগুলি উপরের / নীচে প্রান্ত থেকে প্রতিটি বাম / ডান পাশের মাঝামাঝি (মোটামুটি) থেকে চলতে হবে:

সম্মোহন

এবং এটি আপনার আউটপুট!

এখানে টাইল লাগলে এটি দেখতে কেমন লাগবে তার একটি উদাহরণ এখানে রয়েছে (এখানে জুম আউট):

টালিকৃত

এটি কোড গল্ফ, তাই বাইট জেতে সংক্ষিপ্ততম কোড। স্ট্যান্ডার্ড লুফোলগুলি প্রযোজ্য ইত্যাদি ইত্যাদি।


1 নির্দ্বিধায় এটি বিশ্বাস করুন বা না করুন।
2 এই সহায়ক সাইট থেকে একটি পদ্ধতি


13
এই প্রশ্নটি হেক্সাগনির উত্তরের জন্য ভিক্ষা করছে
সান্চাইজস

22
নিবন্ধন করুন
মার্টিন এন্ডার

17
সেখানেই হেক্স অগ্নির দ্বিতীয় অংশটি গুরুত্বপূর্ণ হয়ে ওঠে।
flawr

2
@ mbomb007 সম্ভবত, যদিও # 00FF00 সবুজ যা এর পরিবর্তে মাঝে মাঝে ব্যবহৃত হয় তা প্রায় খুব খারাপ হয় না। তবুও আমি মনে তারা fuchsia আরো প্রায়ই ব্যবহার করি কারণ তাদের অধিকার মনে কেউ কিছু যে সঠিক রঙ চাইবেন মধ্যে পি: তাদের sprites, তাই এটি প্রশংসনীয় সার্বজনীন এর
Geobits

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)

এখানে চিত্র বর্ণনা লিখুন

পিএস: এটি @ মার্টিনব্যাটনার জমা দেওয়ার সাথে একটি কোডগল্ফ নিম গেম হিসাবে রূপান্তরিত হয়েছে: আপনাকে পর্যায়ক্রমে আপনার কোডটি আরও ছোট করতে হবে (একই কার্যকারিতা সরবরাহ করার সময়) - এটিই শেষ 'সংক্ষিপ্তকরণ' জিত করতে পারে =)


আপনি পুনরায় আকার স্কেল গণনা পরিবর্তন করে 5 বাইট সংরক্ষণ করতে পারেন [k.*[2 3]/4]
বেকার

4
পটভূমি অঞ্চলগুলি কি ফুশিয়া হওয়া উচিত নয়, কালো নয়?
ব্ল্যাকহোল 13

@ ব্ল্যাকহোল আমাকে জানানোর জন্য ধন্যবাদ, আমি এখনই এটি ঠিক করে দিয়েছি, এমনকি আমাকে বেশ কিছুটা
বাইটসও বাঁচিয়েছে

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এটি প্রয়োজনীয় হিসাবে প্রসারিত করার জন্য একটি অনুপাতের প্রয়োগ করুন enforce দুর্ভাগ্যক্রমে, Graphicsপ্যাডিং এবং এ জাতীয় এড়ানোর জন্য বেশ কয়েকটি দামী বিকল্পের প্রয়োজন এবং এটি বিপরীতে পরিবর্তে সাদা রঙে কালো করে তোলে। ফলাফলটি স্থির হয় ColorNegateএবং তার সাথে চিত্রের মূল চ্যানেলগুলির সাথে সংযুক্ত করা হয় SetAlphaChannel
  • Graphicsষড়ভুজের চারপাশে অল্প পরিমাণে প্যাডিং রাখে, তবে আমরা আলফা হেক্সাগনটি কাটআউটটির পুরো আকারটি coverাকতে চাই। তবে SetAlphaChannelএকে অপরের উপরে কেন্দ্র করে এবং ক্ষুদ্রতম আকারে ক্রপ করে বিভিন্ন আকারের চিত্রগুলি একত্রিত করতে পারেন। তার মানে হ'ল ম্যানুয়ালি সেটিংয়ের পরিবর্তে PlotRangePadding->0আমরা হেক্সাগন চিত্রটি কিছুটা দিয়ে স্কেল করতে ImageSize->1.05eপারি (এবং আমাদের যেভাবেই `ইমেজসাইজ বিকল্পটি প্রয়োজন) need

5

এইচটিএমএল 5 + জাভাস্ক্রিপ্ট, 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;। (ফায়ারফক্স ৪১ এ কাজ করে; এটি নিশ্চিত নয় যে অন্যান্য ব্রাউজারগুলি এটি সমর্থন করে)) এছাড়াও, আমি বিশ্বাস করি যে ডান কোঁকড়ানো বন্ধনীগুলির পরে কয়েকটি অপ্রয়োজনীয় অর্ধপরিসর এবং কয়েকটি অতিরিক্ত স্পেস রয়েছে।
ইটিএইচ প্রডাকশনস

আরো তথ্য: আমি আপনাকে যোগ করতে পারিনি বিশ্বাস 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
ইটিএইচ প্রডাকশন

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চেষ্টা করার মতো কাজে লাগেনি এবং আমি এটি সম্পর্কে যথেষ্ট ভাবিনি। যদিও আমি এখনও আমার নতুন লাইনের বিবৃতিতে দাঁড়িয়ে আছি: পি
ফ্রাইআম দ্য এজম্যান

2

পিএইচপি, 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;}

নিখরচায় সংস্করণটি এখানে:

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