İki Renkli Örtüşen Daireler


22

Aşağıdaki girişi alan bir programı veya işlevi, istediğiniz makul bir biçimde yazın:

  • Üreteceğiniz görüntünün genişliğini ve yüksekliğini tanımlayan iki pozitif tam sayı W ve H.

  • Görüntüyü renklendirmek için kullanılacak iki RGB renk C1 ve C2.

  • Görüntünün düzleminde (r, x, y)yarıçapı rve ortası x, yolan daireleri tanımlayan formun 3 tuplesinin bir listesi . rpozitif bir tamsayı ve bir xve yherhangi tamsayı. Resmin sol üst pikseli 0, 0ve x ekseni sağa doğru, y ekseni aşağı doğru artar.

Örtüşen dairelerin tanımladığı iki komşu bölge aynı renk olmayacak şekilde C1 ve C2 ile renkli olan ve H boyutlarında bir görüntü çıktı .

Örneğin: Giriş ise

W = 300
H = 200
C1 = (255, 200, 0)
C2 = (128, 0, 255)
Circles = (25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)

o zaman daire sınırları şöyle görünür:

örnek 1 daire sınırları

Çevrelerin yarattığı görüntüde altı ayrı, bitişik bölge var. Her bölge, iki komşu bölgenin aynı renkte olmayacağı şekilde C1 (sarı) veya C2 (mor) ile renklendirilmelidir.

Bunu yapmanın iki yolu vardır, tek farkı renklerin değişmesidir:

örnek 1 çıktı 1 örnek 1 çıktı 2

Böylece, bu iki görüntünün herhangi biri örnek girdi için geçerli çıktı olacaktır.

Böyle bir şey bu birbirini iki sarı bölgeler komşu beri geçersiz çıktı olurdu.

Çıktı resimleriniz şu yönergelere uymalıdır:

  • C1 ve C2’nin yanı sıra, siyah ve beyaz gibi üçüncü bir nötr renk, 5 piksel kalınlıktan daha uzun olmadığı sürece daire sınırları için kullanılabilir. (Yukarıdaki örnekte siyah, 1 piksel kalınlığında sınırlar vardır.)

  • Bununla birlikte, daire sınırları gerekli değildir. Bölgeler doğrudan birbirine komşu olabilir:

    örnek 1 çıktı 3 örnek 1 çıktı 4

    Bunların her ikisi de yukarıdaki örneğe uygulanan başka bir geçerli çıktıdır.

  • Daireler, daire çizme algoritmaları veya grafik kitaplığınız ne sağlarsa onu kullanarak olabildiğince doğru olmalıdır .

  • Genel olarak, piksel mükemmelliği gerekli değildir, ancak giriş parametreleri eşit ölçüde daha büyük ve daha büyükse, elde edilen görüntü giderek daha doğru hale gelmelidir.

  • Kenar yumuşatma izin verilir, ancak gerekli değildir.

  • Arka planda kılavuz çizgileri veya eksen etiketleri vb. Yasaktır.

Bayt cinsinden en kısa kod kazanır.

Daha fazla örnek

Tüm bu girişleri farklı dairelerle birlikte kullanarak:

W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)

Herhangi bir örnekte, renkler değiştirilebilir ve geçerli kalabilir.

Circles =
A. empty list
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80) 

A. eskiden B. eski B C. eski C D. eski D
E. exe F. eski F G. eski G H. eski H
I. eski ben J. eski J K. eski K L. ex L

Çıktınızın tüm bu örneklere benzer şekilde davrandığından emin olun.


Güzel görünüyor, ascii olarak çıktı alabilir miyiz, örneğin C1, 1 ve C2, 0 mı?
Matthew Roh

@MatthewRoh Hayır. Bunun uygun olacağını biliyorum, ancak görüntüler gerekli.
Calvin'in Hobileri

1
Tamam sonra sanırım sayabilirimtikz
Buğday Sihirbazı

1
@MatthewRoh, netpbm bu sitede yaygın olarak kullanılan bir görüntü formatıdır.
Peter Taylor

2
@Luis Tamam. Bunun gibi küçük girdi değişimleri veya y ekseninin yukarı çıkması tamamdır.
Calvin'in Hobileri

Yanıtlar:


14

Mathematica, 165 bayt

ContourPlot[Cos@Tr[Boole[Norm[{x,y}-#2]<#]Pi&@@@#4],{x,0,#},{y,0,#2},PlotPoints->5!,AspectRatio->Automatic,Frame->False,ContourShading->RGBColor@@@#3,Contours->{0}]&

Dört argüman alarak saf fonksiyon: genişlik, yükseklik (her iki tam sayı), 0 ile 1 arasında (bir iki RGB rengini temsil eden) bir sıralı üçlü çift çifti {r, {x, y}}ve yarıçapları ve merkezlerini kaydetmek için formun bir öğe listesi çevreler. Örneğin, OP'deki ilk örnek argümanlarla çağrılacaktı [300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]. Pozitif y ekseni, Mathematica'da yukarıyı gösterir.

Norm[{x,y}-#2]<#bir noktanın verilen bir dairenin içinde olup olmadığını tespit eder; Boole[...]Pidönüştürür olduğunu Trueveya Falsehiç πya 0. Tüm giriş çevrelerinde bu ss / 0'ları hesapladıktan sonra Trbunları ekler ve Cosπ ila 1 katlarını bile dönüştürür, π ila –1 katları. ContourPlot[...,Contours->{0}]sonra düzlemin uygun bölgesini, değerin büyük veya küçük olmasına bağlı olarak iki renkle renklendirir 0. AspectRatio->Automaticçevrelerin çevrelere benzemesini sağlar; PlotPoints->5!iyi bir doğruluk verir ( 9!gelecekte çok şaşırtıcı bir fotoğraf çekmek istiyorsanız, onu güçlendirin !); Frame->Falseeksenlerden kurtulur; ve ContourShading->RGBColor@@@#3konturlar için giriş renklerini kullanır.

İlk renk çifti (iyi olduklarından beri) ancak son daire grubuyla birlikte örnek çıktı:

örnek çıktı


11

JavaScript / SVG / HTML5, 219 bayt

f=// for demo
(w,h,b,f,a)=>`<svg width=${w} height=${h}><rect width=${w} height=${h} fill=rgb(${b}) /><path fill=rgb(${f}) fill-rule=evenodd d=${a.map(([r,x,y])=>[`M`+x,y-r+`a`+r,r,0,0,0,0,r+r+`a`+r,r,0,0,0,0,-r-r]).join``} /></svg>`
;//demo
[[`A`, []],
 [`B`, [[13, 16, 20]]],
 [`C`, [[30, 16, 20]]],
 [`D`, [[200, 16, 20]]],
 [`E`, [[42, 50, 20]]],
 [`F`, [[42, 50, 20], [17, 40, 30]]],
 [`G`, [[42, 50, 20], [17, 20, 30]]],
 [`H`, [[42, 50, 20], [17, 10, 30], [10, 50, 30]]],
 [`I`, [[42, 50, 20], [17, 10, 30], [35, 50, 20]]],
 [`J`, [[18, 36, 40], [18, 63, 40], [18, 50, 20]]],
 [`K`, [[100, -10, -20], [60, 50, -10]]],
 [`L`, [[18, 36, 40], [18, 63, 40], [18, 50, 20], [14, 50, 20], [5, 50, 18], [20, 0, 0], [70, 22, 0], [10000, -9970, 0], [135, 100, -80]]]
 ].forEach(([c, a])=>document.write(`<nobr><tt>&nbsp;${c}.&nbsp;</tt>${f(100, 60, [255, 0, 0], [0, 0, 255], a)}</nobr><wbr>`));


10

BBC Basic, 120 117 bayt

Tercümanı http://www.bbcbasic.co.uk/bbcwin/bbcwin.html adresinden indirin.

I.w,h,R,G,B,r,g,b:V.22,4,19;16,r,g,b,275;16,R EORr,G EORg,B EORb,24,0;0;w;h;16
5I.r,x,y:V.25,4,x;h-y;25,154,r;0;:G.5

BBC Basic, raster grafikleri temel mantık işlemlerine göre çizmenize izin veren çeşitli renk modlarına sahiptir: OR, AND, XOR vb.

Aynı zamanda, palet yeniden programlamayı da destekler, yani burada 2 renkli bir görüntünün renklerinin 4096 renkten birine yeniden programlanabilmesi anlamına gelir. Burada kullanılan uygulama, EOR operatörlerinin gerekli olmayacağı orijinal BBC uygulamasından bazı (belgelenmemiş) farklılıklar göstermektedir.

Ungolfed

  INPUTw,h,R,G,B,r,g,b:                           :REM Input size and colours
  VDU22,4                                         :REM Change to MODE 4 (2 colours) as the default mode gives odd behaviour
  VDU19,0,16,r,g,b,19,1,16,R EORr,G EORg,B EORb   :REM Reprogram the colours to R,G,B and R^r,G^g,B^b
  VDU24,0;0;w;h;16                                :REM Setup a graphics viewport of the right size, and "clear" it to change background colour
5 INPUTr,x,y                                      :REM take input coordinates
  VDU25,4,x;h-y;                                  :REM move to x,y (h-y required as BBC BASIC y axis increases upward, reverse of spec)
  VDU25,154,r;0;                                  :REM draw circle in "logical inverse colour" of existing pixels (this implementation seems however to XOR with colour 1 instead)
  GOTO5                                           :REM repeat infinitely until user presses escape

Tipik çıkış ekranı

Örnek görüntü birim cinsinden 10 faktör / ölçek cinsinden 5 piksel cinsinden ölçeklendirilir (BBC basic 1 piksel = 2 birim kullanır.)

görüntü tanımını buraya girin


10

Matl , 30 29 25 bayt

2ZG:i:!J*+2&!-|i<so2&!1YG

Giriş formatı:

  • Her satırın bir renk tanımladığı 0 ile 255 arasındaki değerlerin matrisi olarak Colormap
  • W
  • 'H
  • 1 tabanlı merkezin sütun vektörü, karmaşık değerler olarak koordinatlar ( x , gerçek bölüm, y , hayali bölümdür)
  • Radii'nin sütun vektörü.

MATL Online'da deneyin ! Veya son test durumunu doğrulayın . (Tercüman hala deneyseldir. Sayfayı yenilemeniz ve çalışmazsa tekrar denemeniz gerekebilir).

açıklama

Kod, noktaların ızgarasını tanımlamak ve mesafeleri hesaplamak için karmaşık sayılar kullanır ve dizi işlemlerini yayınla birlikte yoğun şekilde kullanır .

2ZG    % Implicitly input matrix of colors. Set as colormap
:      % Implicitly input W. Push [1 2 ... W]
i:     % Input H. Push [1 2 ... H]
!J*    % Transpose, multiply by 1i
+      % Add element-wise with broadcast. Gives H×W grid of points as
       % complex numbers, 1-based 
2&!    % Permute first dimension with the third. Gives a 1×W×H array
-|     % Implicitly input center coordinates. Subtract grid from them,
       % element-wise with broadcast. Gives a C×H×W array, where C is the
       % number of circles
i      % Input column vector of circle radii
<      % Less than, element-wise with broadcast
so     % Sum along first dimension, modulo 2. Gives a 1×W×H array
2&!    % Permute first dimension with the third. Gives a a H×W array
1YG    % Display as scaled image

2
Bence bu baytları kurtar! : D
Greg Martin

1
@GregMartin Haklısın. 4 byte kurtarılabildiğinde zarafeti önemseyen! :-) Bitti
Luis Mendo

1
@LuisMendo Ne kadar çirkin olursa olsun, codegolf ile ne kadar kısa olursa o kadar iyidir. ;)
Kevin Cruijssen

6

Pypng kullanarak Python , 140 138 bayt

import png
f=lambda W,H,c,d,C:png.from_array([[[c,d][sum(abs(x-X+1j*(y-Y))<r for r,x,y in C)%2]for X in range(W)]for Y in range(H)],'RGB')

Örnek kullanım:

W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
Circles = (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
f(W, H, C1, C2, Circles).save('test.png')

2 bayt kaydettiğiniz için xnor sayesinde.


Golf koduna hoş geldiniz! Bir daire içinde bir nokta yalanlar olmadığını kontrol için, bir hüner karmaşık normunu kullanmaktır: abs(x-X+1j*(y-Y))<r.
xnor

3

Matematik (rekabet etmeyen)

(idk, PPCG'de LaTeX'in nasıl yapıldığını, png aracında LaTeX kullandım)

açıklama

Çoklu daire denklemlerinin ( (x-a)^2+(y-b)^2-r^2)> = 0 çarpımı, bu sorunun ihtiyaç duyduğu bir grafiği yapacaktır. Denklemde, ndizinin büyüklüğü (x, y or r)_kve kth (x, y, or r)elemanıdır.

Örnek

(0,0,2),(2,2,2)

(Teşekkürler WolframAlpha)

(WolframAlpha tarafından eşitsizlik arsa)

WolframAlpha için Get / Run denklemi

Komut dosyası alma: Tamamlandı

Çalışan komut dosyası: Henüz bitmedi

Şimdi Mathematica ile çalışmasını sağla ...


Bunun geçerli olup olmadığını merak ediyorum?
Matthew Roh

Çıktıyı istediğiniz girdiyi istediğiniz biçimde çizecek önceden var olan bir tercümanı listelemeniz gerekir. Bu, içindeki baytları saymayı mümkün kılar. Şu anda mesele şu ki, bir tercümana bağlı olmadığından, denklemi temsil etmek için belirli bir formata bağlı değildir ve bu nedenle gösterimin nesnel olarak sayılması gayrı resmi ve imkansızdır. Etrafında denklem grafiklerini çizmek için pek çok program var, bu yüzden kısa ve öz giriş biçiminde bir tane bulmaya çalışmak faydalı olabilir.

@ ais523 Ohh. WolframAlpha ile çalışmasını sağlamaya çalışacağım.
Matthew Roh

1

Python 2.x, 166 158

import re;def f(W,H,c,d,C):print'P3',W,H,255,re.sub('[^0-9]',' ',repr([[d,c][sum([abs(x-X+1j*(y-Y))<r for r,x,y in C])%2]for Y in range(H)for X in range(W)]))

İşlev standart çıktıda bir PPM dosyası oluşturur.

örnek:

W = 300
H = 200
C1 = (255, 200, 0)
C2 = (128, 0, 255)
Circles = [(25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)]

f(W, H, C1, C2, Circles)

örnek


1

Yaygın Lisp + Quicklisp + ZPNG 260 + 20 = 280 karakter

Bu, CL’de yazdığım en geniş kodlardan bazıları ve bir kod golfü yapmasaydım, okumayı daha kolay hale getirmek için bunu yeniden yapılandırdım ...

Başlangıç ​​(20 karakter)

(ql:quickload 'zpng)

Golf (260 karakter)

(lambda(w h g b c)(make-instance'zpng:png :image-data(coerce(loop :for j :below h :nconc(loop :for i :below w :append(if(evenp(count t(mapcar(lambda(c)(<(abs(complex(-(cadr c)i)(-(caddr c)j)))(car c)))c)))g b)))'(array(unsigned-byte 8)(*))):width w :height h))

Ungolfed:

(Test ve izin verilen okunabilirlik için daha uzun değişken isimleri izin vermek için defun kullanır)

(defun mk-png (width height color1 color2 circles)
  (make-instance 'zpng:png
                 :image-data (coerce (loop :for j :below height
                                           :nconc (loop :for i :below width
                                                        :append (if (evenp (count t (mapcar (lambda (circ)
                                                                                              (< (abs (complex (- (cadr circ) i) (- (caddr circ) j)))
                                                                                                 (car circ)))
                                                                                            circles)))
                                                                    color1 color2)))
                                     '(array (unsigned-byte 8) (*)))
                 :width width
                 :height height))

Örnek Kullanım:

(let ((png (mk-png 300 200 '(255 200 0) '(128 0 255) '((25 50 80) (40 80 120) (300 -100 6) (17 253 162)))))
  (zpng:write-png png #p"path/to/file.png"))

Açıklama

(lambda (circ)
   (< (abs (complex (- (cadr circ) i) (- (caddr circ) j)))
      (car circ)))

(İ, j) noktası verilen daireye çevrilirse true değerini döndürür. Öklid mesafesi, vektörü temsil eden karmaşık sayının mutlak değeri (i, j) 'den sirklerin merkezine alınarak hesaplanır.

(evenp (count t (mapcar ___
                         circles)))

Bu işlevi daireler listesinde eşleştirin ve verilen noktanın (i, j) eşit sayıda daire içine girip girmediğini kontrol edin.

(if ____
     color1 color2)

Bu teste göre renk seçin.

(loop :for j :below height
       :nconc (loop :for i :below width
                    :append ____))

Görüntüdeki her bir i (i, j) üzerine dolayarak ve elde edilen listeleri birlikte ekleyerek tüm rgb baytlarının düz bir listesini toplayın.

(coerce ____
         '(array (unsigned-byte 8) (*)))

Bu bayt listesini uygun bir bayt dizisine dönüştürün, böylece zpng onu doğru bir şekilde alabilir.

(make-instance 'zpng:png
                :image-data ____
                :width width
                :height height)

Png nesnesini oluşturun.

(defun mk-png (width height color1 color2 circles)
   ___)

Genişliği, yüksekliği, iki rengi ve çevrelerin listesini alıp oluşturulan png nesnesini döndürmek için işlevi oluşturun.


0

JavaScript (ES6), 224 bayt

JS + SVG çözümünü gördüm, ancak sadece tuval tabanlı bir çözüm oluşturmak zorunda kaldım ;-) Bu, tuval öğesi döndüren bir işlevdir. Mevcut bir tuval öğesi sağlanabilirse, 40 baytı çıkarın.

Gibi çağrı f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])

let f =
(w,h,a,c,O=document.createElement`canvas`)=>{O.width=w;O.height=h;C=O.getContext`2d`;for(y=0;y<h;y++)for(x=0;x<w;x++)C.fillStyle=`rgb(${a[c.filter(([R,X,Y])=>(X-x)**2+(Y-y)**2<R**2).length%2]})`,C.fillRect(x,y,1,1);return O}

let tests = A.innerHTML.match(/.+/g);
A.innerHTML = "";
for (let i of tests) {
  let p = document.createElement("span");
  p.innerHTML = "<br>" + i.slice(0, 3);
  p.style["font-family"] = "monospace";
  A.append(p);
  A.append(f(100, 60, [[255,0,0], [0,0,255]],
    eval(`[${ i.slice(3).replace(/\(/g, "[").replace(/\)/g, "]") }]`)
  ));
}
<div id=A>
A. 
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
</div>

Örnek çıktı:

iki renkli daireler


0

Löve2D , 353 Bayt.

o=love.graphics
a=arg
w,h,r,g,b,R,G,B=...c={}for i=9,#a,3 do
c[#c+1]={a[i],a[i+1],a[i+2]}end
C=o.newCanvas(w,h)o.setCanvas(C)o.clear(R,G,B)for k,v in pairs(c)do
o.stencil(function()o.circle("fill",v[2],v[3],v[1],9^3)end,"invert",1,true)end
o.setStencilTest("greater",0)o.setColor(r,g,b)o.rectangle("fill",0,0,w,h)local
C:newImageData():encode("png","c")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.