Vẽ một tessname máy bay hyperbol


10

Tạo một âm mưu (đĩa Poincare) của một phần tử trên mặt phẳng hyperbol, chẳng hạn như:

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

Chương trình có bốn đầu vào:

1) Có bao nhiêu cạnh / đa giác (ba trong ví dụ này).

2) Có bao nhiêu giao điểm tại mỗi đỉnh (bảy trong ví dụ này).

3) Có bao nhiêu bước từ đỉnh trung tâm để kết xuất (5 trong ví dụ này, nếu bạn nhìn kỹ). Điều này có nghĩa là một đỉnh được bao gồm nếu nó có thể đạt được trong 5 bước hoặc ít hơn tạo thành trung tâm. Các cạnh được hiển thị iff cả hai đỉnh của chúng được bao gồm.

4) Độ phân giải của hình ảnh (một số pixel, hình ảnh là hình vuông).

Đầu ra phải là một hình ảnh. Các cạnh phải được hiển thị dưới dạng vòng cung, không phải đường (phép chiếu đĩa Poincaré biến đường thành vòng tròn). Điểm không cần phải được kết xuất. Khi người dùng đặt vào thứ gì đó không phải là hyperbolic (tức là 5 tam giác gặp nhau ở mỗi đỉnh), chương trình không phải hoạt động chính xác. Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất sẽ thắng.


Làm rõ hơn.
Kevin Kostlan

Bây giờ rõ ràng hơn nhiều :)
trichoplax

Nó ẩn, nhưng có thể tốt hơn để làm rõ rằng a) nên sử dụng mô hình đĩa Poincaré (trừ khi bạn cũng mở các câu trả lời mô hình nửa mặt phẳng); b) một đỉnh phải được hiển thị ở giữa đĩa chứ không phải trung tâm của đa giác.
Peter Taylor

Phải một đỉnh nằm ở trung tâm của đĩa? Hoặc trung tâm của đĩa có thể là trung tâm của một đa giác?
DavidC

1
Điều này thực sự cần thêm thông tin cơ bản. Tôi đã xem xét một vài trang web (không có trang nào được đề cập trong câu hỏi) và tôi không thể tìm ra thông số kỹ thuật chính xác để vẽ hình mẫu, chứ đừng nói đến trường hợp chung. Nếu không được chỉ định, bạn có thể nhận được câu trả lời không hợp lệ mà mọi người đã làm việc chăm chỉ (ví dụ: tôi hiểu các đường không xuyên tâm được biểu diễn dưới dạng vòng cung, nhưng ai đó có thể đi đường tắt và thực hiện các đường thẳng.) Ngoài ra, có vẻ như độ dài của các đường từ đỉnh trung tâm (tính theo phần trăm bán kính vòng tròn) cần được chỉ định.
Cấp sông St

Câu trả lời:


2

Toán học, 2535 byte

Lấy từ đây (vì sao nó là cộng đồng wiki). Không thực sự mà chơi golf. Xem liên kết được cung cấp cho lời giải thích của tác giả về mã của mình.

Ngoài ra, tôi không phải là chuyên gia Mathicala, nhưng tôi cá rằng Martin có thể làm được điều kỳ diệu về độ dài mã. Tôi thậm chí không hiểu toán học đằng sau nó.

Tôi để nó có thể đọc được, nhưng nếu câu hỏi không bị đóng, tôi sẽ đánh golf qua khả năng đọc và di chuyển 2 tham số khác bên trong chức năng của người gọi.

Hiện tại không hợp lệ , vui lòng giúp cải thiện nó:

  • Tôi nghĩ rằng điều này sử dụng các dòng hơn là vòng cung.

  • Trung tâm trên một khuôn mặt, chứ không phải là một đỉnh.

HyperbolicLine[{{Px_, Py_}, {Qx_, Qy_}}] := 
 If[N[Chop[Px Qy - Py Qx]] =!= 0., 
  Circle[OrthoCentre[{{Px, Py}, {Qx, Qy}}], 
   OrthoRadius[{{Px, Py}, {Qx, Qy}}], 
   OrthoAngles[{{Px, Py}, {Qx, Qy}}]], Line[{{Px, Py}, {Qx, Qy}}]]

OrthoCentre[{{Px_, Py_}, {Qx_, Qy_}}] := 
 With[{d = 2 Px Qy - 2 Py Qx, p = 1 + Px^2, q = 1 + Qx^2 + Qy^2}, 
  If[N[d] =!= 0., {p Qy + Py^2 Qy - Py q, -p Qx - Py^2 Qx + Px q}/d, 
   ComplexInfinity]]

OrthoRadius[{{Px_, Py_}, {Qx_, Qy_}}] := 
 If[N[Chop[Px Qy - Py Qx]] =!= 0., 
  Sqrt[Total[OrthoCentre[{{Px, Py}, {Qx, Qy}}]^2] - 1], Infinity]

OrthoAngles[{{Px_, Py_}, {Qx_, Qy_}}] := 
 Block[{a, b, c = OrthoCentre[{{Px, Py}, {Qx, Qy}}]}, 
  If[(a = N[Apply[ArcTan, {Px, Py} - c]]) < 0., a = a + 2 \[Pi]];
  If[(b = N[Apply[ArcTan, {Qx, Qy} - c]]) < 0., 
   b = b + 2 \[Pi]]; {a, b} = Sort[{a, b}];
  If[b - a > \[Pi], {b, a + 2 \[Pi]}, {a, b}]]

Inversion[Circle[{Cx_, Cy_}, r_], {Px_, Py_}] := {Cx, Cy} + 
  r^2 {Px - Cx, Py - Cy}/((Cx - Px)^2 + (Cy - Py)^2)
Inversion[Circle[{Cx_, Cy_}, r_, {a_, b_}], {Px_, Py_}] := {Cx, Cy} + 
  r^2 {Px - Cx, Py - Cy}/((Cx - Px)^2 + (Cy - Py)^2)

Inversion[Circle[{Cx_, Cy_}, r_, {a_, b_}], p_Line] := 
 Map[Inversion[Circle[{Cx, Cy}, r], #] &, p, {2}]

Inversion[Circle[{Cx_, Cy_}, r_, {a_, b_}], p_Polygon] := 
 Map[Inversion[Circle[{Cx, Cy}, r], #] &, p, {2}]

Inversion[Line[{{Px_, Py_}, {Qx_, Qy_}}], {Ux_, Uy_}] := 
 With[{u = Px - Qx, 
   v = Qy - Py}, {-Ux (v^2 - u^2) - 2 u v Uy, 
    Uy (v^2 - u^2) - 2 u v Ux}/(u^2 + v^2)]
Inversion[Line[{{Px_, Py_}, {Qx_, Qy_}}], p_Polygon] := 
 Map[Inversion[Line[{{Px, Py}, {Qx, Qy}}], #] &, p, {2}]

Inversion[Circle[{Cx_, Cy_}, r_], c_List] := 
 Map[Inversion[Circle[{Cx, Cy}, r], #] &, c]


PolygonInvert[p_Polygon] := 
 Map[Inversion[HyperbolicLine[#], p] &, 
  Partition[Join[p[[1]], {p[[1, 1]]}], 2, 1]]
PolygonInvert[p_List] := Flatten[Map[PolygonInvert[#] &, p]]

LineRule = Polygon[x_] :> Line[Join[x, {x[[1]]}]];
HyperbolicLineRule = 
  Polygon[x_] :> 
   Map[HyperbolicLine, Partition[Join[x, {x[[1]]}], 2, 1]];

CentralPolygon[p_Integer, q_Integer, \[Phi]_: 0] := 
 With[{r = (Cot[\[Pi]/p] Cot[\[Pi]/q] - 1)/
     Sqrt[Cot[\[Pi]/p]^2 Cot[\[Pi]/q]^2 - 1], \[Theta] = \[Pi] Range[
       1, 2 p - 1, 2]/p}, 
  r Map[{{Cos[\[Phi]], -Sin[\[Phi]]}, {Sin[\[Phi]], Cos[\[Phi]]}}.# &,
     Transpose[{Cos[\[Theta]], Sin[\[Theta]]}]]]

PolygonUnion[p_Polygon, tol_: 10.^-10] := p
PolygonUnion[p_List, tol_: 10.^-10] := 
 With[{q = p /. Polygon[x_] :> N[Polygon[Round[x, 10.^-10]]]}, 
  DeleteDuplicates[q]]
HyperbolicTessellation[p_Integer, q_Integer, \[Phi]_, k_Integer, 
  t_: 10.^-10] := 
 Map[PolygonUnion[#, t] &, 
   NestList[PolygonInvert, Polygon[CentralPolygon[p, q, \[Phi]]], 
     k][[{-2, -1}]]] /; k > 0

HyperbolicTessellation[p_Integer, q_Integer, \[Phi]_, k_Integer, 
  t_: 10.^-10] := Polygon[CentralPolygon[p, q, \[Phi]]] /; k == 0
HyperbolicTessellationGraphics[p_Integer, q_Integer, \[Phi]_, 
  k_Integer, rule_RuleDelayed, opts___] := 
 Graphics[{Circle[{0, 0}, 1], 
   HyperbolicTessellation[p, q, \[Phi], k, 10.^-10] /. rule}, opts]

Được gọi là:

HyperbolicTessellationGraphics[3, 7, 0., 7, HyperbolicLineRule, ImageSize -> 300, PlotLabel -> "{7,7}"]

ốp lát


1
Điều này trông giống như bức tường cuối cùng của văn bản. +1
kirbyfan64sos

@ kirbyfan64sos Vâng, giải mã đây là một con thú. Tôi khá chắc chắn rằng chỉ có một vài thay đổi cần thiết để làm cho nó vòng cung thay vì các đường hyperbol. Ngoài ra, việc thay đổi các chức năng / tham số thành tên char đơn sẽ giảm kích thước đi rất nhiều.
mbomb007

1
@steveverrill Đó cũng là dòng thay vì vòng cung, điều này cũng sai. Tôi không chắc chắn làm thế nào để sửa đổi nó để khắc phục một trong hai vấn đề. Đó là CW, vì vậy bất cứ ai cũng có thể cảm thấy thoải mái để giúp cải thiện nó.
mbomb007

1
Tôi đã tự hỏi nếu nó là dòng hoặc vòng cung. Thật khó để nói ở độ phân giải thấp này, nhưng chúng thực sự có thể là các cung, chỉ là không ... rất phức tạp. Ví dụ, có vẻ như đường bên phải của đa giác trung tâm hơi cong vào bên trong.
Reto Koradi

1
Tôi có một cách tiếp cận khác, dựa trên mã của người khác, rằng tôi đã có thể giảm xuống còn 1100 byte. Nhưng, một khi đã chơi golf, mã trở nên không thể giải mã được. Tôi tin điều tương tự sẽ xảy ra nếu chúng tôi chơi bài của bạn. Hiện tại, tôi đang cố gắng hiểu cách chúng hoạt động ở định dạng dài dòng.
DavidC
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.