एक हाइपरबोलिक प्लेन टेसलेशन को प्लॉट करें


10

हाइपरबोलिक प्लेन पर टेसलेशन का प्लॉट (पोइनकेयर डिस्क) बनाएं, जैसे:

यहाँ छवि विवरण दर्ज करें

कार्यक्रम में चार इनपुट हैं:

1) कितने किनारों / बहुभुज (इस उदाहरण में तीन)।

2) प्रत्येक शीर्ष पर कितने प्रतिच्छेद (सात उदाहरण में)।

3) रेंडर करने के लिए केंद्र शीर्ष से कितने कदम दूर (इस उदाहरण में 5, यदि आप बारीकी से देखते हैं)। इसका मतलब यह है कि एक शीर्ष को शामिल किया गया है अगर इसे 5 या उससे कम चरणों में केंद्र तक पहुंचाया जा सकता है। किनारों को प्रदान किया जाता है यदि उनके दोनों शीर्ष शामिल हैं।

4) छवि का रिज़ॉल्यूशन (पिक्सेल की एक संख्या, छवि चौकोर है)।

आउटपुट एक छवि होना चाहिए। किनारों को सर्कल-आर्क्स के रूप में प्रस्तुत किया जाना चाहिए, न कि रेखाएं (पॉइनेरे डिस्क प्रोजेक्शन लाइनों को सर्कल में बदल देती हैं)। अंक प्रदान करने की आवश्यकता नहीं है। वह यह है कि कुछ में उपयोगकर्ता डालता है जब नहीं अतिशयोक्तिपूर्ण (प्रत्येक शिखर पर बैठक यानी 5 त्रिकोण), कार्यक्रम ठीक से काम करने के लिए नहीं है। यह कोड-गोल्फ है, इसलिए सबसे छोटा उत्तर जीतता है।


अधिक स्पष्ट किया।
केविन कोस्टलन

अभी बहुत स्पष्ट है :)
ट्राइकोप्लेक्स

यह निहित है, लेकिन यह स्पष्ट करने के लिए बेहतर हो सकता है कि ए) पोनकारे डिस्क मॉडल का उपयोग किया जाना चाहिए (जब तक कि आप आधे-प्लेन मॉडल उत्तर के लिए भी खुले हों); बी) एक शीर्ष डिस्क के केंद्र में गाया जाना चाहिए, न कि बहुभुज के केंद्र में।
पीटर टेलर

डिस्क के केंद्र में एक शीर्ष झूठ होना चाहिए? या डिस्क का केंद्र बहुभुज का केंद्र हो सकता है?
डेविड सीपी

1
यह वास्तव में अधिक पृष्ठभूमि जानकारी की जरूरत है। मैंने कुछ साइटों को देखा है (प्रश्न में कोई उल्लेख नहीं किया गया है) और मैं उदाहरण के आंकड़े को चित्रित करने के लिए सटीक विनिर्देश का पता नहीं लगा सकता हूं, अकेले सामान्य मामले को चलो। यदि यह निर्दिष्ट नहीं किया गया है तो आपको अमान्य उत्तर मिल सकते हैं, जिन पर लोगों ने कड़ी मेहनत की है (उदाहरण के लिए मैं समझता हूं कि गैर-रेडियल रेखाओं को वृत्त के चाप के रूप में दर्शाया गया है, लेकिन कोई व्यक्ति शॉर्टकट ले सकता है और सीधी रेखाएं कर सकता है।) इसके अलावा, ऐसा लगता है। केंद्र के शीर्ष से लाइनों की edGLength (सर्कल त्रिज्या के प्रतिशत के रूप में) को निर्दिष्ट करने की आवश्यकता है।
स्तर नदी सेंट

जवाबों:


2

गणितज्ञ, 2535 बाइट्स

यहाँ से लिया गया है (इसलिए यह सामुदायिक विकि क्यों है)। वास्तव में नहीं है कि गोल्फ। लेखक की उसके कोड की व्याख्या के लिए दिए गए लिंक को देखें।

इसके अलावा, मैं कोई गणितज्ञ विशेषज्ञ नहीं हूं, लेकिन मुझे यकीन है कि मार्टिन कोड की लंबाई पर चमत्कार कर सकता है। मैं इसके पीछे के गणित को भी नहीं समझता।

मैंने इसे पठनीय छोड़ दिया है, लेकिन यदि प्रश्न बंद नहीं होता है, तो मैं इसे पठनीयता से जोड़ दूंगा और कॉलर फ़ंक्शन के अंदर 2 अन्य मापदंडों को स्थानांतरित करूंगा।

वर्तमान में अमान्य है , इसे सुधारने में मदद करने के लिए स्वतंत्र महसूस करें:

  • मुझे लगता है कि यह आर्क्स के बजाय लाइनों का उपयोग करता है।

  • एक चेहरे पर केंद्रित है, बजाय एक शीर्ष पर।

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]

जैसे कहा जाता है:

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

खपरैल का छत


1
यह पाठ की परम दीवार जैसा दिखता है। +1
kirbyfan64sos

@ kirbyfan64sos हाँ, यह एक जानवर है। मुझे पूरा यकीन है कि हाइपरबोलिक लाइनों के बजाय इसे आर्क बनाने के लिए केवल कुछ बदलाव आवश्यक हैं। इसके अलावा, फ़ंक्शन / मापदंडों को एकल-चार नामों में बदलने से आकार बहुत कम हो जाएगा।
mbomb007 21

1
@steveverrill यह आर्क्स के बजाय लाइनें भी है, जो गलत भी है। मुझे यकीन नहीं है कि किसी भी समस्या को ठीक करने के लिए इसे कैसे संशोधित किया जाए। यह सीडब्ल्यू है, इसलिए कोई भी इसे सुधारने में मदद करने के लिए स्वतंत्र महसूस कर सकता है।
mbomb007 21

1
मैं सोच रहा था कि यह लाइनों या आर्क्स था। यह कम रिज़ॉल्यूशन पर बताना मुश्किल है, लेकिन वे वास्तव में आर्क्स हो सकते हैं, बस बहुत नहीं ... आर्सी। उदाहरण के लिए, ऐसा लगता है कि केंद्रीय बहुभुज के दाईं ओर की रेखा अंदर की तरफ थोड़ी मुड़ी हुई है।
रेटो कोराडी

1
मेरे पास एक और दृष्टिकोण है, जो किसी अन्य व्यक्ति के कोड के आधार पर है, कि मैं 1100 बाइट्स को समाप्त करने में सक्षम हूं। लेकिन, एक बार गोल्फ होने के बाद, कोड अनिर्णायक हो जाता है। मेरा मानना ​​है कि यदि हम आपकी अधीनता को पूरा करते हैं तो वही होगा। फिलहाल, मैं यह समझने की कोशिश कर रहा हूं कि वे क्रिया प्रारूप में कैसे काम करते हैं।
डेविड सीपी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.