Vòng tròn chồng hai màu


22

Viết chương trình hoặc chức năng nhận đầu vào sau theo định dạng hợp lý theo lựa chọn của bạn:

  • Hai số nguyên dương W và H xác định chiều rộng và chiều cao của hình ảnh bạn sẽ tạo.

  • Hai màu RGB C1 và C2 sẽ được sử dụng để tô màu cho hình ảnh.

  • Một danh sách gồm 3 bộ dữ liệu có dạng (r, x, y)xác định các vòng tròn có bán kính rvà tâm x, ytrong mặt phẳng của hình ảnh. rlà một số nguyên dương xylà bất kỳ số nguyên nào. Pixel trên cùng bên trái của hình ảnh là 0, 0và trục x tăng sang phải và trục y tăng xuống.

Xuất ra một hình ảnh có kích thước W by H được tô màu bằng C1 và C2 sao cho không có hai vùng lân cận được xác định bởi tất cả các vòng tròn chồng chéo có cùng màu.

Ví dụ: Nếu đầu vào là

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)

sau đó các ranh giới vòng tròn trông như thế này:

ví dụ 1 ranh giới đường tròn

Có sáu vùng riêng biệt, tiếp giáp trong hình ảnh được tạo bởi các vòng tròn. Mỗi vùng phải được tô màu bằng C1 (màu vàng) hoặc C2 (màu tím) sao cho không có hai vùng lân cận nào có cùng màu.

Có hai cách để làm điều này, sự khác biệt duy nhất của chúng là màu sắc được hoán đổi:

ví dụ 1 đầu ra 1 ví dụ 1 đầu ra 2

Do đó, một trong hai hình ảnh này sẽ là đầu ra hợp lệ cho đầu vào ví dụ.

Một cái gì đó như thế này sẽ là đầu ra không hợp lệ vì hai vùng màu vàng lân cận nhau.

Hình ảnh đầu ra của bạn nên tuân theo các nguyên tắc sau:

  • Ngoài C1 và C2, màu thứ ba, màu trung tính như đen hoặc trắng có thể được sử dụng cho các ranh giới vòng tròn miễn là chúng có độ dày không quá 5 pixel. (Đường viền màu đen, dày 1 pixel có trong ví dụ trên.)

  • Tuy nhiên, ranh giới không được yêu cầu. Các khu vực có thể lân cận trực tiếp với nhau:

    ví dụ 1 đầu ra 3 ví dụ 1 đầu ra 4

    Cả hai đều là một đầu ra hợp lệ cho ví dụ trên.

  • Các vòng kết nối phải chính xác nhất có thể, sử dụng thuật toán vẽ vòng tròn hoặc bất cứ điều gì thư viện đồ họa của bạn cung cấp.

  • Nói chung, không cần phải hoàn thiện pixel, nhưng nếu các tham số đầu vào được chia tỷ lệ lớn hơn và lớn hơn, hình ảnh thu được sẽ ngày càng chính xác hơn.

  • Khử răng cưa được cho phép nhưng không bắt buộc.

  • Đường lưới hoặc nhãn trục, vv trong nền không được phép.

Mã ngắn nhất tính bằng byte thắng.

Thêm ví dụ

Tất cả sử dụng các đầu vào này với các nhóm vòng tròn khác nhau:

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

Trong mọi ví dụ, màu sắc có thể được hoán đổi và vẫn còn hiệu lực.

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. cũ A B. cũ B C. cũ C D. cũ D
E. cũ E F. cũ F G. cũ G H. cũ H
I. tôi cũ J. cũ J K. cũ K L. cũ L

Hãy chắc chắn rằng đầu ra của bạn hoạt động tương tự như tất cả các ví dụ này.


Có vẻ tốt, chúng ta có thể xuất ra ascii không, ví dụ C1 là 1 và C2 là 0?
Matthew Roh

@MatthewRoh Không. Tôi biết điều đó sẽ thuận tiện nhưng hình ảnh là bắt buộc.
Sở thích của Calvin

1
Được rồi, tôi đoán tôi có thể tính ratikz
Wheat Wizard

1
@MatthewRoh , netpbm là định dạng hình ảnh thường được sử dụng trên trang web này.
Peter Taylor

2
@Luis Ok. Các biến thể đầu vào nhỏ như vậy hoặc có trục y đi lên đều ổn.
Sở thích của Calvin

Câu trả lời:


14

Toán học, 165 byte

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}]&

Hàm thuần túy có bốn đối số: chiều rộng, chiều cao (cả hai số nguyên), một cặp ba số có thứ tự từ 0 đến 1 (đại diện cho hai màu RGB) và danh sách các mục có dạng {r, {x, y}}để ghi lại bán kính và tâm của các vòng tròn. Ví dụ, ví dụ đầu tiên trong OP sẽ được gọi với các đối số [300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]. Trục y dương hướng lên trên trong Mathicala.

Norm[{x,y}-#2]<#phát hiện xem một điểm có nằm trong một vòng tròn đã cho hay không; Boole[...]Pichuyển đổi rằng Truehoặc Falsethành πhoặc 0. Sau khi tính toán các số π / 0 đó trên tất cả các vòng tròn đầu vào, cộng Trchúng lại và Coschuyển đổi các số chẵn của số 1 thành số 1, bội số lẻ của số π thành số1. ContourPlot[...,Contours->{0}]sau đó tô màu vùng thích hợp của mặt phẳng bằng hai màu tùy thuộc vào giá trị lớn hơn hay nhỏ hơn 0. AspectRatio->Automaticlàm cho các vòng tròn trông giống như các vòng tròn; PlotPoints->5!cung cấp một độ chính xác khá (tăng nó lên 9!nếu bạn thực sự muốn một bức tranh tuyệt vời, trong tương lai xa!); Frame->Falsethoát khỏi các trục; và ContourShading->RGBColor@@@#3sử dụng màu sắc đầu vào cho các đường viền.

Đầu ra mẫu, với cặp màu đầu tiên (vì chúng đẹp) nhưng bộ vòng tròn cuối cùng:

đầu ra mẫu


11

JavaScript / SVG / HTML5, 219 byte

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 cơ bản, 120 117 byte

Tải xuống thông dịch viên tại http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

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 có một loạt các chế độ màu cho phép bạn vẽ đồ họa raster theo các hoạt động logic cơ bản: OR, AND, XOR, v.v.

Nó cũng hỗ trợ lập trình lại pallete, có nghĩa là ví dụ ở đây, hình ảnh 2 màu có thể được lập trình lại thành bất kỳ màu nào trong số 4096 màu. Việc triển khai được sử dụng ở đây có một số khác biệt (không có giấy tờ) so với triển khai ban đầu của BBC, trong đó các toán tử EOR sẽ không cần thiết.

Bị đánh cắp

  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

Màn hình đầu ra điển hình

Hình ảnh ví dụ được tăng lên theo hệ số 10 đơn vị / hệ số 5 pixel (cơ bản BBC sử dụng 1 pixel = 2 đơn vị.)

nhập mô tả hình ảnh ở đây


10

MATL , 30 29 25 byte

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

Định dạng đầu vào:

  • Colormap dưới dạng ma trận các giá trị trong khoảng từ 0 đến 255, trong đó mỗi hàng xác định một màu
  • W
  • H
  • Vectơ cột của tọa độ trung tâm dựa trên 1 là giá trị phức ( x là phần thực, y là phần ảo)
  • Cột vector của bán kính.

Hãy thử tại MATL Online! Hoặc xác minh trường hợp thử nghiệm cuối cùng . (Trình thông dịch vẫn đang thử nghiệm. Bạn có thể cần làm mới trang và thử lại nếu nó không hoạt động).

Giải trình

Mã này sử dụng các số phức để xác định lưới các điểm và để tính toán khoảng cách và sử dụng nhiều hoạt động của mảng với phát sóng .

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
Tôi nói Save the Byte! : D
Greg Martin

1
@GregMartin Bạn nói đúng. Ai quan tâm đến sự thanh lịch khi 4 byte có thể được lưu! :-) Xong
Luis Mendo

1
@LuisMendo Càng ngắn càng tốt với codegolf, bất kể nó xấu đến mức nào. ;)
Kevin Cruijssen

6

Python sử dụng pypng , 140 138 byte

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')

Ví dụ sử dụng:

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')

Cảm ơn xnor vì đã lưu 2 byte.


Chào mừng bạn đến với mã golf! Để kiểm tra xem một điểm có nằm trong một vòng tròn hay không, một mẹo nhỏ là sử dụng định mức phức tạp : abs(x-X+1j*(y-Y))<r.
xnor

3

Toán (không thi đấu)

(idk làm thế nào để làm LaTeX trong PPCG, vì vậy tôi đã sử dụng công cụ LaTeX để png)

Giải trình

Tích của nhiều phương trình đường tròn ( (x-a)^2+(y-b)^2-r^2)> = 0 sẽ tạo ra một biểu đồ mà câu hỏi này cần. Trong phương trình, nlà kích thước của mảng và (x, y or r)_klà phần tử kthứ (x, y, or r).

Thí dụ

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

(Cảm ơn bạn WolframAlpha)

(Âm mưu bất bình đẳng của WolframAlpha)

Nhận / Chạy phương trình cho WolframAlpha

Lấy kịch bản: Hoàn thành

Chạy script: Chưa hoàn thành

Bây giờ làm cho nó hoạt động với Mathicala ...


Tôi tự hỏi nếu điều này là hợp lệ?
Matthew Roh

Bạn cần liệt kê một trình thông dịch có sẵn cụ thể sẽ vẽ sơ đồ đầu ra theo dạng bạn muốn cho đầu vào đó. Điều đó sẽ làm cho nó có thể đếm các byte trong đó. Hiện tại, vấn đề là bởi vì nó không được gắn với một trình thông dịch, nên nó không được gắn với một định dạng cụ thể để biểu diễn phương trình, và do đó ký hiệu là không chính thức và không thể đếm khách quan. Có rất nhiều chương trình để vẽ đồ thị của các phương trình xung quanh, vì vậy có thể đáng để thử tìm một biểu đồ có định dạng đầu vào ngắn gọn.

@ ais523 ơi. Tôi sẽ cố gắng làm cho nó hoạt động với WolframAlpha.
Matthew Roh

1

Trăn 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)]))

Hàm tạo tệp PPM trên đầu ra tiêu chuẩn.

thí dụ:

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)

thí dụ


1

Lisp thường gặp + Quicklisp + ZPNG 260 + 20 = 280 ký tự

Đây là một số mã rộng nhất tôi từng viết trong CL và nếu tôi không chơi golf mã, tôi sẽ cấu trúc lại mã này để dễ đọc hơn ...

Mở đầu (20 ký tự)

(ql:quickload 'zpng)

Chơi gôn (260 ký tự)

(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))

Ung dung:

(Sử dụng defun để cho phép thử nghiệm và các tên biến dài hơn để dễ đọc)

(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))

Cách sử dụng ví dụ:

(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"))

Giải thích

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

Trả về true nếu điểm (i, j) nằm trong vòng tròn đã cho. Khoảng cách Euclide được tính bằng cách lấy giá trị tuyệt đối của số phức đại diện cho vectơ từ (i, j) đến tâm của vòng tròn.

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

Ánh xạ chức năng qua danh sách vòng tròn và kiểm tra xem điểm đã cho (i, j) có nằm trong số vòng tròn chẵn không.

(if ____
     color1 color2)

Chọn màu dựa trên bài kiểm tra đó.

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

Thu thập cùng một danh sách phẳng tất cả các byte rgb bằng cách lặp qua từng (i, j) trong hình ảnh và nối các danh sách kết quả lại với nhau.

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

Chuyển đổi danh sách byte đó thành một mảng byte thích hợp, vì vậy zpng có thể nhập nó đúng cách.

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

Tạo đối tượng png.

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

Tạo hàm để lấy chiều rộng, chiều cao, hai màu và danh sách các vòng tròn và trả về đối tượng png đã tạo.


0

JavaScript (ES6), 224 byte

Tôi đã thấy giải pháp JS + SVG, nhưng tôi chỉ phải tạo một giải pháp dựa trên canvas ;-) Đây là một hàm trả về một phần tử canvas. Nếu một phần tử canvas hiện có có thể được cung cấp, hãy xóa 40 byte.

Gọi như 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>

Ví dụ đầu ra:

vòng tròn hai màu


0

Löve2D , 353 byte.

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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.