この修正された円で平面を並べます


22

原点を中心とした単位円を取ります。隣接する2つの四分円で、円のx切片とy切片を結ぶ線に沿って円の曲線をミラーリングします。

結果の形状を使用して、平面をタイル表示できます。

サークルテッセレーション

この画像は、素晴らしい2D物理サンドボックスAlgodooで作成しました

一般的な可逆画像ファイル形式で、これに似た画像を出力するプログラムを作成します。選択した名前のファイルとして画像を保存することも、単に表示することもできます。何も入力しないでください。

ルール:

  • 全体画像は、任意の2つの視覚的に別個のRGBカラーを使用して変更円タイルでモザイク状にされなければならない:垂直ポインティングタイル、水平方向を向いタイルのための1つのための1つ。

  • 円形タイルの半径は、少なくとも32ピクセルにする必要があります。(上の画像の半径は約110ピクセルです。)

  • 画像は、少なくとも幅4タイル、高さ4タイルでなければなりません。上記のルールと組み合わせると、画像の最小サイズは256×256ピクセルになります。(上の画像は4タイルx 4タイルです。)

  • テッセレーションは、任意の量で翻訳できます。たとえば、画像の左上隅は、タイルが交わる頂点である必要はありません。(ただし、テッセレーションは回転させないでください。)

  • 円を描いたり、画像などを出力するためのコマンドを備えた外部グラフィックライブラリを使用できます。

  • 曲線は、ほとんどのグラフィックスライブラリが実行する中点円アルゴリズムで実行できるように、実際に円に近似する必要があります。

  • タイルの端の周りのアンチエイリアスは許可されますが、必須ではありません。

バイト単位の最短提出が勝ちです。

回答:


4

gs2、49バイト

50 31 05 0d 1f 2a 48 0a 1e 2e 40 83 2c e8 64 2d
1e 73 ed 1e 33 40 20 30 9a a2 22 e8 e9 40 20 30
9a 30 40 20 30 ee 40 20 30 12 32 e9 12 32 55 e8
2b

PBMイメージを生成します。

output

ニーモニック:

# Print header
"P1" space 256 double
2dup new-line

# Make 1/4 circle
64 range dup cartesian-product
square m1 sum sqrt 64 >= m6
64 /

# Make tile
dup reverse + transpose
@2 not m1 m2
dup reverse + transpose
+

# Make quarter of image
dup reverse + z1
dup reverse +

# Loop
2 * m2
2 *

# Format
show-words m1
unlines

36

POV-Ray、199 163

Old version
camera{location -9*z}light_source{-9*z}#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{X*x+x+Y*y,<.001*pow(-1,(X+Y)/2),0,.1>+X*x+x+Y*y,1}#end#end}object{L pigment{color x}}object{L rotate z*90}

Same output, but golfed down further by using default light/camera, so I dont even need to specify them
#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{<X+1,Y,9>,<.001*pow(-1,(X+Y)/2),0,.1>+<X+1,Y,9>,1}#end#end}object{L pigment{color rgb x}rotate z*90}object{L}

ここに画像の説明を入力してください
カメラと光源にできるだけ多くのデフォルトパラメータを使用しているため、少し暗いです。最初にそれをアンゴルフすることができます

camera{location 9*z look_at 0}
light_source{9*z color 1} 
#declare L=union{
    #for(X,-9,9,2)
        #for(Y,-9,9,2)
            cylinder{<1+X,Y,0>,                                 //central axis, start
                     <1+X,Y,0> + <.001*pow(-1,(X+Y)/2), 0, .1>, //central axis, end
                      1}                                        //radius
        #end         
    #end
}                         
object{L pigment{color x}} // x is the <1,0,0> vector, here interpreted as RGB
object{L rotate<0,0,90>}

シリンダー軸のオフセットを増やして視点を変更すると、何が起こっているかは明らかです

ここに画像の説明を入力してください


1
3D遠近法のおかげで、エッジがわずかに歪むことはありませんか?
-orlp

6
ディスクの高さ0.1とオフセットを0.001$ \ phi = \ arctan(0.01)= 0.57°$だけ傾けると、上から見ると、ディスクは$ \ cos(\ phi)= 0.99995 $の係数で絞り込まれたように見えます。それはピクセルよりもはるかに少ないです。
-DenDenDo

@DenDenDoは、pov-rayがカメラを無限遠に置くことができないのですか?
Random832

@ Random832で、できcamera{orthographic location -9z}ます。ただし、シーンは基本的に2Dであるため違いはないためangle 170、結果にフィッシュアイディストーションを発生させずに表示することもできます。
-DenDenDo

11

Gnuplot、182

セル間の境界が非常に正弦波に見えることに気づいたので、非常に単純なコア方程式を使用した分析ソリューションを探しました
ここに画像の説明を入力してください

set view map
set isosamples 900
f(x,y)=.3*sin(x*3.14)+y
splot(ceil(f(x,y))+ceil(f(y,x)))%2?1:NaN   #can only modulo integers

ここに画像の説明を入力してください
見た目は似ていますが、円は四角すぎます。同じ考え方で、sin連結された四分円円弧から作成された曲線に置き換えxyx+yを置き換えて45°回転させます。x-y

set view map
set samples 800
set isosamples 800
d=.5**.5
c(x,k)=(-1)**k*sqrt(1-(x-d*(1+2*k))**2)-(-1)**k*d  # k-th circle arc
# s(x)=c(x,floor(x/d/2))                           # circlified sinus
# f(x,y)=d*s(x/d)+y
f(x,y)=d*c(x/d,floor(x))+y                         # combined commented functions
splot(ceil(f(x+y,x-y))+ceil(f(x-y,x+y)))%2?1:NaN

ここに画像の説明を入力してください



7

HTML + JavaScript、277

<canvas id=C></canvas><script>r=50,C.width=C.height=9*r,T=C.getContext('2d');
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)x=2*r*(i%8-2),y=2*r*(i>>3),T.moveTo(x,y+f*r),
T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),T.arc(x,y,r,0,P,f>0),T.arc(x-r,y+f*r,r,-f*P/2,0,f<0);
T.fill()</script>

テストするには、htmlファイルとして保存し、ブラウザーで開きます。または、スニペットを実行します

r=50,C.width=C.height=9*r,T=C.getContext('2d')
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)
  x=2*r*(i%8-2),y=2*r*(i>>3),
  T.moveTo(x,y+f*r),
  T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),
  T.arc(x,y,r,0,P,f>0),
  T.arc(x-r,y+f*r,r,-f*P/2,0,f<0)
T.fill()
<canvas id=C></canvas>

一般的な需要により、出力画像は次のとおりです。結局それほどエキサイティングではありません...

タイル


1
誰かが出力を見たいと思うたびにコードを実行する必要がないように、画像を投稿したいかもしれません。
カルバンの趣味

@ Calvin'sHobbiesまあそれは十分に高速であり、すべての最新のブラウザで実行されます。代わりに画像を大きくします
-edc65

それは本当だ。私はそれ=>があなたの投稿の多くのように使用され、Firefoxでのみ機能すると思った。しかし、心配はありません。
カルバンの趣味

1
画像を投稿するより良い理由:これらのスニペットは、モバイルではあまりうまく機能しません:(
Sp3000

6

IDL 8.3、201の 193 183バイト

イメージはIDLグラフィックスウィンドウに出力されます。下のスクリーンショットを撮りました。

編集:@AlexAに感謝します。いくつかのバイトを削るのを手伝ってくれた@ Sp3000

p=!pi/99*[0:99]
q=p[49:0:-1]
o=p[99:50:-1]
window,xs=(ys=400)
for i=0,24 do cgpolygon,i mod 5*100+50*[cos(p),cos(q)-1,cos(o)+1],i/5*100+(-1)^i*50*[sin(p),sin(q)-1,sin(o)-1],/d,/fi
end

ここに画像の説明を入力してください


6

Mathematica:86バイト(または82バイト)

賢い配列ベースのメソッドの無限の@alephalphaに感謝します。

Image@ArrayFlatten@Array[DiskMatrix@32~RotateLeft~32/.a_/;OddQ@+##:>1-Thread@a&,{5,5}]

配列内には匿名関数があり、巧妙なトリックを使用して引数(+##)を追加し、合計が奇数かどうかを判断します。このブール値は、「白」タイル全体を変換された「黒」タイルで置き換えるパターンの条件として使用されます。そこからArrayFlatten、タイルを結合してImage表示します。

Threadを置き換えるために短い方の使用に注意してくださいTranspose。代わりに転置記号を使用することで、4バイトを節約できます。

前:97バイト(または90バイト)

Image@ArrayFlatten@Partition[
 Join@@Table[{#,1-Transpose@#}&@RotateLeft[DiskMatrix@32,32],{13}],5]

Transpose@#上付きのt記号(コードポイントU + F3C7、ショートカットESCtrESC)に置き換えることにより、バイト数を減らすことができます。UTF-8では、合計で88文字で90バイトになります

ここに画像の説明を入力してください

から始まりDiskMatrix、バイナリマトリックスを生成します。

DiskMatrix@32 // Image

ここに画像の説明を入力してください

次に、マトリックスの行を循環シフトして、タイルの単位セルを生成します。

RotateLeft[DiskMatrix@32, 32] // Image

ここに画像の説明を入力してください

飛行機がチェス盤の場合、これらは「白い」正方形です。「黒い」正方形の場合、色を反転し、90度回転する必要があります。1(1 - 1 -> 0および1 - 0 -> 1)から減算することで反転し、転置を取ることで回転できます。

Image /@ {#, 1 - Transpose@#} &@RotateLeft[DiskMatrix@32, 32]

ここに画像の説明を入力してください

画像のサイズが偶数の場合(最小サイズ4など)、右端のタイルは左端の次のタイルと同じになります。ただし、1つのタイルを追加して奇数サイズ(5)を取得し、行を連結すると、規則的な交互パターンが生成されます。

これは、交互のタイルの単一の行をでラップすることにより、完全な画像を取得できることを示唆していますPartition。黒/白のタイルペアのリストを作成し、ペアのリストを26タイルのリストにフラット化Tableするために使用します。次に、リストをタイルのby マトリックスに入れます(末尾の26 番目のタイルを破棄します)。13JoinPartition55Partition

Map[Image] /@ 
  Partition[
   Join @@ Table[{#, 1 - #\[Transpose]} &@
      RotateLeft[DiskMatrix@32, 32], {13}], 5] // MatrixForm

ここに画像の説明を入力してください

最後ArrayFlattenに、タイルマトリックスのマトリックスをフラットマトリックスに変換しImage、結果を表示します。

前:111バイト

Image[ArrayFlatten[{{#, #}, {#, #}}] &[
  Join[#, Reverse@#, 2] &[
   Join[1 - Transpose@#, #] &@RotateLeft[DiskMatrix[32], 32]]]]

ここに画像の説明を入力してください


Image@ArrayFlatten@Array[RotateLeft[DiskMatrix@32,32]/.a_/;OddQ[+##]:>1-Thread@a&,{5,5}]
alephalpha

4

Java、550 540 508 504バイト

これはJavaアプレットです。

import java.awt.*;public class T extends java.applet.Applet{int a=98,b=49,x,y;public void paint(Graphics g){for(x=0;x<5;x++)for(y=0;y<5;y++)a(g.create(x*a,y*a,a,a),x%2^y%2);}void a(Graphics g,int c){if(c>0){g.translate(a,0);((Graphics2D)g).scale(-1,1);}g.setColor(Color.red);g.fillRect(0,0,b,b);g.fillRect(b,b,b,b);g.setColor(Color.blue);g.fillRect(b,0,b,b);g.fillRect(0,b,b,b);g.fillArc(0,-b,a,a,180,90);g.fillArc(0,b,a,a,0,90);g.setColor(Color.red);g.fillArc(-b,0,a,a,0,-90);g.fillArc(b,0,a,a,90,90);}}

定型文で拡張:

import java.awt.*;
public class T extends java.applet.Applet{
    int a = 98, b = 49, x, y; //Make these larger for better quality pictures. a = b * 2
    public void paint(Graphics g) {
        for (x=0; x < 5; x++)      //Make these larger for more tiles.
            for (y=0; y < 5; y++)  //
                a(g.create(x * a, y * a, a, a), x % 2 ^ y % 2);
    }

    void a(Graphics g, int c) {
        if (c > 0) {
            g.translate(a, 0);
            ((Graphics2D) g).scale(-1, 1);
        }
        g.setColor(Color.red);            //Change colors for nicer looking colors.
        g.fillRect(0, 0, b, b);
        g.fillRect(b, b, b, b);
        g.setColor(Color.blue);
        g.fillRect(b, 0, b, b);
        g.fillRect(0, b, b, b);
        g.fillArc(0, -b, a, a, 180, 90);
        g.fillArc(0, b, a, a, 0, 90);
        g.setColor(Color.red);
        g.fillArc(-b, 0, a, a, 0, -90);
        g.fillArc(b, 0, a, a, 90, 90);
    }
}

アプレット:別のアプリケーションで作業中に使用するために呼び出すことができる小さなアプリケーションプログラム。

サンプル画像:

ここに画像の説明を入力してください

説明:

これは、各タイルを印刷する方法を使用して機能します。メソッドが作成される前に、各タイルの左上隅を中心とした座標系を使用するグラフィックスオブジェクトが与えられます。

タイルを作成するには、次の方法を使用します。

void a(Graphics g, int c) {
    g.setColor(Color.red);
    g.fillRect(0, 0, b, b);
    g.fillRect(b, b, b, b);
    g.setColor(Color.blue);
    g.fillRect(b, 0, b, b);
    g.fillRect(0, b, b, b);
    g.fillArc(0, -b, a, a, 180, 90);
    g.fillArc(0, b, a, a, 0, 90);
    g.setColor(Color.red);
    g.fillArc(-b, 0, a, a, 270, 90);
    g.fillArc(b, 0, a, a, 90, 90);
}

ただし、正しい画像を生成するには、タイルを1つおきに水平に反射する必要があります。

タイルを反映するには、提供されたgraphicsオブジェクトを次のコードで変更します。

g.translate(a, 0);
((Graphics2D) g).scale(-1, 1);

4バイトありがとう@CoolGuy。


1
あなたはそれ以上宣言することでゴルフをすることができますxし、yクラスのフィールドとして:int a = 98, b = 49,x,y;
Spikatrix

4

Mathematica 299 256

言葉は通じますが、理解できて良かったです。

基本タイルはr(下図を参照)です。これは、RegionPlotによって表示される領域です。タイルの左右の反射が作成され、rで結合されます。次に、2つのタイルを組み立てた図を繰り返してスペースを並べます。

r

a_~f~b_ := (x + a)^2 + (y + b)^2 <= 1;
a = ImageAssemble;
r = RegionPlot[(0~f~0 && y <= 0 && ! f[-1, 1]) \[Or] (0~f~2 && 
      y >= -2 && ! f[1, 1]), {x, -1, 1}, {y, -2, 0}, Frame -> False,
    BoundaryStyle -> None];
s = ImageCrop@Rasterize@r;
t = s~ImageReflect~Right;
i = a@{s, t};
j = a@{t, s};
a@{k = {i, i, i, i}, m = {j, j, j, j}, k, m, k, m}

タイル


1

C、237の 209 180バイト

180バイト。このバージョンには、edc65によって提案された変更がコメントに含まれています。clangおよびデフォルトオプションを使用してMacでビルドすると、9つのコンパイラ警告が表示されます。

a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}

209バイト、Martinのコメントからの提案を使用。clangで警告なしにコンパイルします。

#include <stdio.h>
int a,b,c,d,x,y;int main(){puts("P1 256 256");for(;b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c<256;++c)putchar(48+(x*x+y*y<962^b==d));puts("");}}

元のバージョン、237バイト:

#include <stdio.h>
int main(){puts("P1 256 256");for(int a=0;a<256;++a){int b=a+32&64;for(int c=0;c<256;++c){int d=c+32&64;int x=(a&64)-d?31-a&31:a&31;int y=(c&64)-b?c&31:31-c&31;putchar(48+(x*x+y*y<962^b==d));}puts("");}}

結果(256x256):

ここに画像の説明を入力してください

読みやすくするための空白を含む元のコード:

#include <stdio.h>
int main()
{
    puts("P1 256 256");
    for (int a = 0; a < 256; ++a)
    {
        int b = a + 32 & 64;
        for (int c = 0; c < 256; ++c)
        {
            int d = c + 32 & 64;
            int x = (a & 64) - d ? 31 - a & 31 : a & 31;
            int y = (c & 64) - b ? c & 31 : 31 - c & 31;
            putchar(48 + (x * x + y * y < 962 ^ b == d));
        }
        puts("");
    }
}

これはグラフィックライブラリを使用せず、レンダリングはコードに完全に含まれています。

基本的な考え方は、すべての256x256ピクセルを単純にループし、32x32サブスクエアの円弧の内側/外側にあるかどうかを確認することです。ピクセル座標全体の下位5ビットは、内部のピクセルの相対座標を定義しますサブスクエア。(x, y)半径のある円弧の内側にあることの内側/外側のテストがr標準です。

x * x + y * y < r * r

ロジックのほとんどは、円弧の中心をサブ正方形の正しいコーナーに配置し、どの色が内側/外側であるかを決定するためのものです。

ソリューションに関するコメント:

  • コードは、PBM ASCII形式で画像を生成します。結果をGIMPにロードし、ここに投稿した実際のファイルを生成するために、ペイントにコピー&ペーストしました。したがって、形式は変換されましたが、コンテンツは元の出力とまったく同じです。
  • よく見ると、品質が良くないことに気付くかもしれません。これは、ピクセルの中心ではなく、ピクセルの角に対して内側/外側の計算が行われ、全体が1/2ピクセルずれているためです。改善することは非常に難しいとは思いませんが、コードが多少長くなります。そして、特定の品質要件がなかったので、これで十分だと思います。
  • コードはMacでclangを使用してコンパイルされました。最新バージョンでは警告が表示されますが、初期バージョンでは表示されませんでした。
  • これらのいずれかを試みたのはこれが初めてなので、おそらく最後のバイトを保存するためのいくつかのトリックを逃しました。

3
PPCGへようこそ!私はCの大物ゴルファーではありませんが、いくつかの改善が見られると思います。宣言を次のようにグループ化してください。デフォルトの型がintであることを覚えているint a,b,c,d,x,y;かもしれません main(a,b,c,d,x,y)それを削除したら、d、x、yへの割り当てを次のforような内部のインクリメントステートメントにd=c+32&64,...,++c移動できます(おそらく、++言及しcた他の場所に移動することもできます)。その後、中かっこを省略できます。インナーfor。いい仕事だ、ところで!:)
マーティンエンダー

ありがとう!ヒントのリストに型のない引数を宣言するトリックを見ましたが、とても汚く見えたのでそこに行くことができませんでした。;)非標準の引数を持つことmain()は標準に準拠しているとは思わない。宣言を確実にグループ化する必要があります。また、増分を移動すると、数バイトも節約されます。puts()改行のためには、外側のループであるので、私は、中括弧を取り除くことができれば、私はよく分かりません。
レトコラディ

一般的なコンパイラでコンパイルする限り、通常は問題ありません(したがって、完全に標準のCである必要はありません)。また、外側のブレースを取り除くことはできないと思いますが、内側のブレースを取り除くことができるはずです。
マーティンエンダー

210バイトになりました。アイデアをありがとう。
レトコラディ

1
ヒント:stdio不要、デフォルトの関数宣言を使用します。intグローバルのデフォルトであり、省略可能です(変数とメイン)。まずはputs中に入ってください。c varは内部ループ内では使用されないため、条件が増加します。180:(a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}多くの警告でコンパイルしますが、実行します)
-edc65
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.