Toán học, 193 183 177 173 169 166 byte
Yay, toán học! Tôi đang vẽ khu vực thỏa mãn một tập hợp bất đẳng thức (khá phức tạp) nhất định:
e=RegionPlot[(1<Abs@y<3||c)&&{x,y+12}.(d=2{-5Sin@40°-6,m=5Cos@40°})*{x+15,y+1-2Sign@y}.d<0||c&&x<2m/.c->100<x^2+y^2<144,{x,-15,9},{y,-12,12},Frame->0>1,ImageSize->#]&
Cách sử dụng là e[height]
, vd e[100]
:
Hoặc e[200]
:
Bạn có thể nhận thấy rằng các cạnh sắc nét hơn được làm tròn một chút. Đó là bởi vì khu vực chỉ có thể được vẽ bằng cách lấy mẫu các điểm trong không gian và Mathicala không lấy mẫu từng pixel theo mặc định. Độ phân giải lấy mẫu có thể được tăng lên bằng cách thêm tùy chọn khác PlotPoints->#
(sử dụng một mẫu trên mỗi pixel), thêm 14 ký tự . Tôi không khuyên bạn nên chạy nó với tùy chọn đó, vì nó làm tăng đáng kể thời gian chạy và hầu như không làm tăng sự hấp dẫn trực quan hơn #/4
hoặc hơn thế. Do đó, (sau khi được OP phê duyệt), nó không được tính vào điểm số.
Đây là một phiên bản hơi vô căn cứ:
e[height_] := (
angle = 40°;
d = {-5 Sin[angle] - 6, 5 Cos[angle]};
RegionPlot[
(Abs[y] > .5 && Abs[y] < 1.5
||
r > 25 && r < 36)
&&
{x, y + 6}.d > 0
&&
{x + 7.5, y + .5 - Sign[y]}.d < 0
||
r > 25 && r < 36 && x < 5 Cos[angle]
/. r -> x^2 + y^2
,
{x, -7.5, 4.5},
{y, -6, 6},
Frame -> False,
ImageSize -> height
]
);
Lưu ý rằng trong phiên bản chơi gôn, tôi đã điều chỉnh hệ tọa độ theo hệ số 2 để tránh .5
s, nhưng hóa ra số lượng ký tự thực sự giống hệt nhau.
Đây là một lời giải thích cho cách tôi làm việc ra công thức. Tôi chia hình thành hai vùng. Một cái chứa vòng và các sọc và được cắt ở bên phải với BCDE
độ dốc và bên trái với các sườn IJ
và GH
(nhiều hơn về sau). Cái kia chứa cùng một vòng, nhưng đơn giản là bị cắt ở tọa độ x của điểm D
. Các điều kiện cho hai khu vực được kết hợp với ||
, hoạt động như một liên minh tập hợp ở đây.
Vòng chỉ được định nghĩa là 5 < r < 6
, r
khoảng cách từ điểm gốc. r²
dễ dàng hơn để làm việc mặc dù ( x²+y²
), vì vậy tôi đang sử dụng 25 < x² + y² < 36
để có được tất cả các điểm trong vòng.
Các sọc nằm giữa ±.5
và ±1.5
. Chúng ta có thể xử lý cả hai sọc cùng một lúc, bằng cách lấy mô đun của y , vì vậy các sọc (có độ dài vô hạn) chỉ cần thực hiện .5 < |y| < 1.5
. Một lần nữa, để kết hợp các sọc và vòng, tôi chỉ sử dụng ||
.
Điều thú vị có lẽ là làm thế nào để có được "mặt nạ". Điểm D
có tọa độ x5 cos 40°
, vì vậy mặt nạ chăm sóc cạnh dưới (chỉ kết hợp với vòng) là vừa x < 5 cos 40°
. Điều này có thể được áp dụng thông qua giao điểm thiết lập chuyển thành &&
logic.
Các mặt nạ khác là phần thực sự khó khăn. Đầu tiên, hãy để độ dốc của BCDE
. Chúng ta có thể dễ dàng xây dựng các điểm C
và D
, (0, -6)
và 5 (cos 40°, sin 40°)
, tương ứng. Các vector chỉ dọc theo dòng là chỉ D - C = (5 cos 40°, 5 sin 40° + 6)
. Để áp dụng mặt nạ ở bên phải, tôi chỉ cần tìm ra nếu một điểm nằm ở bên trái hoặc bên phải của dòng đó (hãy gọi vectơ dòng p
). Tôi có thể tìm ra điều này bằng cách lấy vectơ từ C
điểm quan tâm của tôi và chiếu nó lên một vectơ vuông góc với p
. Dấu hiệu của hình chiếu sẽ cho tôi biết phía bên là điểm. Lấy vectơ vuông góc khá đơn giản trong 2D: lật tọa độ và đảo ngược dấu hiệu của một trong số chúng. Đó là biến d
trong mã của tôi:(-5 sin 40° - 6, 5 cos 40°)
. Các vectơ từ C
đến một điểm quan tâm q = (x, y)
là q - C = (x, y + 6)
. Hình chiếu chỉ là sản phẩm vô hướng (hoặc sản phẩm chấm) giữa q
và d
. Cách tôi chọn d
nó xảy ra để chỉ về bên trái, vì vậy tôi muốn d.(q-C) > 0
. Điều kiện này áp dụng mặt nạ bên tay phải.
Đối với mặt nạ bên trái, tôi có thể sử dụng cùng một ý tưởng. Độ dốc là như nhau và do đó là như vậy d
. Tôi chỉ cần bù điểm của tôi từ các góc dưới bên trái của sọc thay vì từ C
. Những người có tọa độ (-7.5, 0.5)
(sọc trên) và (-7.5, -1.5)
(sọc dưới). Vì vậy, điều đó sẽ kêu gọi hai quy tắc độc lập cho hai sọc. Tuy nhiên, lưu ý rằng tất cả các điểm bị ảnh hưởng bởi mặt nạ dưới nằm ở dải dưới và do đó có y âm . Và tất cả các điểm bị ảnh hưởng bởi mặt nạ trên có y dương . Vì vậy, tôi chỉ có thể chuyển tôi bù đắp sử dụng Sign[y]
đó là 1
cho dương và -1
cho tiêu cực y
. Vì vậy, điểm bù của tôi trở thành(-7.5, -0.5 + Sign[y])
. Nếu không, mặt nạ hoạt động giống như mặt nạ bên tay phải. Tất nhiên, lần này chiếu cần phải âm. Vì vậy, ngây thơ đó sẽ là một cái gì đó giống như RH-projection > 0 && LH-projection < 0
(đó cũng là những gì tôi ban đầu có trong mã). Nhưng chúng ta có thể rút ngắn điều này, bởi vì nhân một số dương và một số âm phải đưa ra một số âm, vì vậy nó chỉ là RH * LH < 0
( các phép chiếu tương ứng ở đâu RH
và LH
là gì).
Đó là nó. Đặt tất cả lại với nhau dẫn đến cấu trúc logic sau:
(
(is_in_circle || is_in_stripe)
&&
is_between_left_and_right_mask
)
||
(
is_in_circle && left_of_edge
)
Để rõ ràng, tọa độ trong lời giải thích của tôi đề cập đến sơ đồ xây dựng được đưa ra trong thử thách. Như đã đề cập ở trên, mã của tôi thực sự nhân tất cả chúng bằng cách 2
- tôi đã thay đổi nó để lưu byte, nhưng số byte thực sự giống hệt nhau và tôi không thể bận tâm để hoàn nguyên thay đổi một lần nữa. Ngoài ra số nguyên trông đẹp hơn.