Schläfli উত্তল নিয়মিত পলিটপ দোভাষী


15

পটভূমি

Schläfli সাংকেতিক ফর্ম {পি, কুই, R, ...} নিয়মিত polytopes এবং tessellations সংজ্ঞায়িত একটি স্বরলিপি হয়।

Schläfli প্রতীক একটি পুনরাবৃত্ত বিবরণ, একটি পি-পার্শ্বযুক্ত নিয়মিত বহুভুজ দিয়ে {p starting হিসাবে শুরু হয়} উদাহরণস্বরূপ, {3 একটি সমবাহু ত্রিভুজ, {4 a একটি বর্গ এবং আরও অনেক কিছু and

প্রতিটি ভার্টেক্সের চারপাশে নিয়মিত পি-পার্শ্বযুক্ত বহুভুজ মুখের একটি নিয়মিত পলিহেডন {p, q by দ্বারা প্রতিনিধিত্ব করা হয়} উদাহরণস্বরূপ, কিউবটির প্রতিটি ভার্টেক্সের চারপাশে 3 স্কোয়ার থাকে এবং এটি {4,3 by দ্বারা প্রতিনিধিত্ব করে}

আর {পি, কিউ poly সহ একটি নিয়মিত 4-মাত্রিক বহুভুজ প্রতিটি প্রান্তের চারপাশে নিয়মিত পলিহাইডাল কোষগুলি {পি, কিউ, আর by দ্বারা প্রতিনিধিত্ব করে} উদাহরণস্বরূপ একটি পরীক্ষক, {4,3,3।, এর একটি প্রান্তের চারদিকে 3 কিউব, {4,3। রয়েছে।

সাধারণভাবে একটি নিয়মিত পলিটোপ {পি, কিউ, আর, ..., ওয়াই, জেড z এর প্রতিটি শিখরের চারপাশে z {p, q, r, ..., y} দিক রয়েছে, যেখানে একটি শিখর একটি পলিহাইড্রনের একটি শীর্ষবিন্দু, একটি 4-পলিটোপে একটি প্রান্ত, 5-পলিটোপে একটি মুখ, 6-পলিটোপে একটি সেল এবং একটি এন-পলিটপের একটি (এন -3)-পৃষ্ঠ

একটি নিয়মিত পলিটোপের একটি নিয়মিত ভার্টেক্স চিত্র থাকে। একটি নিয়মিত পলিটোপ {পি, কিউ, আর, ... y, z} এর শীর্ষবিন্দুটি হ'ল {কিউ, আর, ... ওয়াই, জেড}}

নিয়মিত পলিটোপগুলিতে পেন্টাগ্রামের মতো স্টার বহুভুজ উপাদান থাকতে পারে, symbol 5/2 symbol চিহ্ন সহ, পেন্টাগনের উল্লম্ব দ্বারা উপস্থাপিত হয় তবে পর্যায়ক্রমে সংযুক্ত থাকে।

Schläfli প্রতীক নির্মাণের কোণ ত্রুটির উপর নির্ভর করে একটি সীমাবদ্ধ উত্তল পলিহাইড্রন, ইউক্লিডিয়ান স্থানের একটি অসীম টেসেললেশন বা হাইপারবোলিক স্পেসের একটি অসীম নিখরচায় প্রতিনিধিত্ব করতে পারে। একটি ধনাত্মক কোণ ত্রুটিটি ভার্টেক্স চিত্রটি একটি উচ্চ মাত্রায় ভাঁজ করতে দেয় এবং একটি বহুভুজ হিসাবে ফিরে আসে। একটি শূন্য কোণ ত্রুটিযুক্ত দিকগুলির একই মাত্রার স্পেস টেস্টলেটগুলি। একটি নেতিবাচক কোণ ত্রুটি সাধারণ স্থানে থাকতে পারে না, তবে হাইপারবোলিক স্পেসে নির্মিত যেতে পারে।

প্রতিযোগিতা

আপনার লক্ষ্যটি এমন একটি প্রোগ্রাম তৈরি করা যা কোনও শ্লাফলি প্রতীক পাস করার পরে উত্তল পলিটপের একটি সম্পূর্ণ বিবরণ ফিরিয়ে আনবে। এটি কেবল শ্লাফলি প্রতীকগুলির একটি উপসেট, তবে এটি সবচেয়ে সহজ, আমি বিশ্বাস করি অন্য সম্ভাবনা ছাড়াই এটি খুব কঠিন কাজ হবে, এবং পলিটোপগুলি টেসলেশনের প্রাথমিক সূচনা হয়। এই প্রশ্নের নিয়মগুলি এই ফলাফলটি একটি এপিআই হওয়ার ধারণা দিয়ে তৈরি করা হয়েছিল এবং আমি ইন্টারনেটে এই জাতীয় কোনও প্রোগ্রাম সনাক্ত করতে সক্ষম হইনি।

আপনার প্রোগ্রামটি নীচের সমস্তটি সম্পাদন করতে হবে।

  • প্রোগ্রামটি অবশ্যই কোনও সীমাবদ্ধ নিয়মিত নিয়মিত উত্তল পলিটোপ তৈরি করতে সক্ষম হবে। 2 মাত্রায় এটিতে এন-গনস অন্তর্ভুক্ত রয়েছে। 3 মাত্রায় এগুলি প্লেটোনিক সলিডস হয়, 4 টি মাত্রায় এটির পরীক্ষক, অর্থোপ্লেক্স এবং আরও কয়েকটি অন্তর্ভুক্ত থাকে)
  • প্রোগ্রামটি হয় হয় (ক) উত্সের উপরে একটি বিন্দু রাখে, বা (খ) নিশ্চিত করে যে সমস্ত পয়েন্টের গড়টি উত্স। ওরিয়েন্টেশন কিছু যায় আসে না। সামগ্রিক আকারে কিছু যায় আসে না।
  • প্রোগ্রামটি অবশ্যই একটি সম্পূর্ণ বিবরণ প্রদান করবে যার অর্থ একটি 4-মাত্রিক অবজেক্টের জন্য, প্রোগ্রামটি শীর্ষে, প্রান্তগুলি, মুখগুলি এবং পলিহেড্রা প্রিন্ট করবে / প্রিন্ট করবে। এগুলি যে আদেশে রিপোর্ট করা হয়েছে তাতে কিছু আসে যায় না। পলিহেড্রার জন্য, অবজেক্টটি রেন্ডার করার জন্য আপনার প্রয়োজনীয় তথ্য এটি।

আপনাকে যা না হ্যান্ডল করা প্রয়োজন:

  • Tesselations
  • হাইপারবোলিক জ্যামিতি
  • ভগ্নাংশ শ্ল্যাফলি প্রতীক (উত্তল নয়)
  • এম্বেডড শ্লাফলি প্রতীক (অ-ইউনিফর্ম টিলিংস)

এগুলির যে কোনও একটি করতে বললে আপনি একটি ত্রুটি ফিরিয়ে দিতে পারেন।

উদাহরণ: কিউব

ইনপুট:

4 3

আউটপুট:

Vertices
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1    

Edges (These are the vertex pairs that make up the edges)
0 1
0 2
0 4
1 3
1 5
2 3
2 6
3 7
4 5
4 6
5 7
6 7

Faces (These are the squares which are the faces of the cube)
0 1 3 2
0 1 5 4
0 2 6 4
6 7 5 4
7 6 2 3
7 5 1 3

এই অ্যালগরিদম কীভাবে কাজ করতে পারে এবং খুব পুনরাবৃত্তিযোগ্য হতে পারে সে সম্পর্কে আমার কিছু ধারণা ছিল, তবে এখন পর্যন্ত আমি ব্যর্থ হয়েছি, তবে আপনি যদি অনুপ্রেরণার সন্ধান করছেন তবে: https://en.wikedia.org/wiki/Euler_characteristic

শীর্ষে, প্রান্ত এবং মুখের সংখ্যা নির্ধারণের উদাহরণ হিসাবে ঘনক্ষেত্রটি বিবেচনা করুন যা {4,3} is আমরা যদি প্রাথমিক 4 টি দেখি তবে এর 4 টি প্রান্ত এবং 4 টি শীর্ষ কোণ রয়েছে। এখন আমরা যদি পরবর্তী 3 টি দেখি তবে আমরা জানি যে প্রতিটি প্রান্তে 3 টি প্রান্ত মিলিত হয়, প্রতিটি প্রান্ত 2 টি শীর্ষকে সংযুক্ত করে, প্রতিটি মুখ দুটি প্রান্তে মিলিত হয়, প্রতিটি মুখ 4 টি প্রান্তে যুক্ত হয় (বর্গাকার দিকের কারণে) এবং আমাদের রয়েছে এলিউর চারিত্রিক সূত্র।

E = 3/2 ভি

ই = 4/2 এফ

ভি - ই + এফ = 2

যা E = 12, V = 8, F = 6 দেয়।

স্কোরিং

প্রশ্নটিকে প্রশ্নে রাখার জন্য এটি কোড গল্ফে সংশোধন করা হয়েছে। সংক্ষিপ্ততম কোড জিতেছে।

এই প্রশ্নের জন্য একটি গিথুব তৈরি করা হয়েছে


1
গুগলিং দেখায় যে নিয়মিত পলিটপের মাত্র 3 টি পরিবার 4 টি মাত্রার ছাড়িয়ে বিস্তৃত: ঘনক, অষ্টাহাড্রন এবং টেট্রহেড্রন অনুসারে alog এই পরিবারগুলির জন্য লেখা এবং বাকীগুলিকে হার্ডকোড করা সহজ বলে মনে হবে (দুটি থ্রিডি পলিটোপস, তিনটি 4 ডি পলিটোপস এবং 2 ডি পলিটোপের অসীম পরিবার)) আমি যতদূর দেখতে পাচ্ছি যে অনুমানটি পূরণ করে তবে সাধারণীকরণযোগ্য হবে না। এটি একটি বৈধ উত্তর হবে? অনুমানের ক্ষেত্রের বাইরে টপোলজিকাল গ্রাফ তৈরি করতে পুনরাবৃত্তির অ্যালগরিদম লিখতে পারা সম্ভব, তবে অনুমানের মধ্যেও সেই পদ্ধতির সাথে ঘাতক স্থানাঙ্কগুলি গণনা করছে।
স্তর নদী সেন্ট

আমরা কীভাবে প্রকৃত শিহরকে জানব, কেবলমাত্র তারা সমতুল্য তা জানতে পেরে?
ম্যাথু রোহ

@ সিআইজিএসইজিভি কেবলমাত্র উল্লেখ করা দরকার যে মূলটি কেন্দ্র বা পয়েন্টগুলির একটির সাথে মিলিত হওয়া উচিত। এটি আপনার দয়া করে আকারটি ঘোরানোর জন্য প্রচুর সুযোগ দেয়। en.wikipedia.org/wiki/Simplex hypertetrahedrons স্থানাঙ্ক গণক জন্য একটি অ্যালগরিদম দেয় (যা সম্ভবত icosahedron এবং তার 4D অ্যানালগ বাড়ানো যেতে পারে আমার প্রশ্ন কিন্তু এমনটি যে খুব আমার জন্য অনেক, অত।) hypercubes এবং hyperoctahedrons আছে সুন্দর পূর্ণসংখ্যার স্থানাঙ্ক (এবং হাইপারট্রেহেড্রনগুলি খুব প্রকৃতপক্ষে, তবে প্রায়শই কেবল আকারের চেয়ে বেশি মাত্রায় থাকে যা অস্বস্তিকর))
লেভেল রিভার সেন্ট

@ লেভেলরিভারস্ট, হ্যাঁ যেহেতু কেবলমাত্র নিয়মিত পলিটোপগুলি উপস্থিত রয়েছে তা আপনার পরামর্শগুলির আওতায় আনা হবে তবে হ্যাঁ আপনি সেগুলি হার্ডকোড করতে পারেন।
টনি রুথ

আমি এই প্রশ্নে সমাপনী ভোটটি ফেলেছি কারণ এটি পশ্চিমের শৈলীতে একটি দ্রুততম বন্দুক , যেখানে প্রথম বৈধ উত্তরটি জয়ী। এটি সাধারণত একটি বৈধ বিজয়ী মানদণ্ড হিসাবে বিবেচিত হয় না। আমি জানি না এতক্ষণ কীভাবে এটি উন্মুক্ত ছিল, এটি বন্ধ করা উচিত ছিল।
পোস্ট রক গার্ফ হান্টার

উত্তর:


2

পাইথন

এখানে কোনও বিশেষ মামলা ছাড়াই একটি পুনরাবৃত্তি প্রোগ্রাম's ফাঁকা লাইন এবং মন্তব্য উপেক্ষা করে, এটি শেষদিকে ইউলারের সূত্রের একটি কৃতজ্ঞ চেক সহ 100 টি 90 লাইনেরও কম । অ্যাড-হক গণিত ফাংশনগুলির সংজ্ঞা (যা সম্ভবত কোনও গ্রন্থাগার দ্বারা সরবরাহ করা যেতে পারে) এবং i / o বাদ দিয়ে পলিটপ প্রজন্মটি কোডের 50 টি লাইন। এমনকি এটি স্টার পলিটোপগুলিও করে!

আউটপুট বহুভুজের প্রান্ত দৈর্ঘ্য 1 হবে এবং নিম্নোক্ত অর্থে প্রমিত অবস্থান এবং অভিযোজনে থাকবে:

  • প্রথম শীর্ষটি মূল,
  • প্রথম প্রান্তটি + এক্স অক্ষের সাথে থাকে,
  • প্রথম মুখটি এক্স ওয়ানের অর্ধ-সমতলে রয়েছে,
  • প্রথম 3-সেলটি জাইজেড স্পেসের + z অর্ধ-স্পেসে থাকে etc.

তা ছাড়া, আউটপুট তালিকার কোনও নির্দিষ্ট ক্রমে নয় order (ভাল, আসলে, এটি সম্পূর্ণ সত্য নয় - তারা আসলে প্রথম উপাদান থেকে শুরু করে বাহ্যিক প্রসারকে মোটামুটিভাবে বেরিয়ে আসবে))

অবৈধ স্কলাফ্লি প্রতীকটির জন্য কোনও পরীক্ষা নেই; আপনি যদি এটি দিয়ে থাকেন তবে প্রোগ্রামটি সম্ভবত রেলগুলি থেকে যাবে (অন্তহীন লুপ, স্ট্যাক ওভারফ্লো বা কেবল আবর্জনা বাইরে)।

আপনি যদি inite 4,4 {বা {3,6} বা, 6,3 as এর মতো অসীম পরিকল্পনাকারী টাইলিংয়ের জন্য জিজ্ঞাসা করেন তবে প্রোগ্রামটি প্রকৃতপক্ষে টাইলিং তৈরি করা শুরু করবে, তবে এটি স্থানটি অদৃশ্য না হওয়া পর্যন্ত চিরতরে চলে যাবে সমাপ্তি না উত্পাদন উত্পাদন। এটি ঠিক করা খুব বেশি কঠিন হবে না (কেবল উত্পন্ন উপাদানগুলির সংখ্যার উপর একটি সীমাবদ্ধতা রাখুন; ফলাফলটি অসীম চিত্রের মোটামুটি সুসংগত অঞ্চল হওয়া উচিত, যেহেতু উপাদানগুলি মোটামুটি প্রস্থ-প্রথম অনুসন্ধানের ক্রমে উত্পন্ন হয়)।

কোড

#!/usr/bin/python3
# (works with python2 or python3)

#
# schlafli_interpreter.py
# Author: Don Hatch
# For: /codegolf/114280/schl%C3%A4fli-convex-regular-polytope-interpreter
#
# Print the vertex coords and per-element (edges, faces, etc.) vertex index
# lists of a regular polytope, given by its schlafli symbol {p,q,r,...}.
# The output polytope will have edge length 1 and will be in canonical position
# and orientation, in the following sense:
#  - the first vertex is the origin,
#  - the first edge lies along the +x axis,
#  - the first face is in the +y half-plane of the xy plane,
#  - the first 3-cell is in the +z half-space of the xyz space, etc.
# Other than that, the output lists are in no particular order.
#

import sys
from math import *

# vector minus vector.
def vmv(a,b): return [x-y for x,y in zip(a,b)]
# matrix minus matrix.
def mmm(m0,m1): return [vmv(row0,row1) for row0,row1 in zip(m0,m1)]
# scalar times vector.
def sxv(s,v): return [s*x for x in v]
# scalar times matrix.
def sxm(s,m): return [sxv(s,row) for row in m]
# vector dot product.
def dot(a,b): return sum(x*y for x,y in zip(a,b))
# matrix outer product of two vectors; that is, if a,b are column vectors: a*b^T
def outer(a,b): return [sxv(x,b) for x in a]
# vector length squared.
def length2(v): return dot(v,v)
# distance between two vectors, squared.
def dist2(a,b): return length2(vmv(a,b))
# matrix times vector, homogeneous (i.e. input vector ends with an implicit 1).
def mxvhomo(m,v): return [dot(row,v+[1]) for row in m]
# Pad a square matrix (rotation/reflection) with an extra column of 0's on the
# right (translation).
def makehomo(m): return [row+[0] for row in m]
# Expand dimensionality of homogeneous transform matrix by 1.
def expandhomo(m): return ([row[:-1]+[0,row[-1]] for row in m]
                         + [[0]*len(m)+[1,0]])
# identity matrix
def identity(dim): return [[(1 if i==j else 0) for j in range(dim)]
                                               for i in range(dim)]
# https://en.wikipedia.org/wiki/Householder_transformation. v must be unit.
# Not homogeneous (makehomo the result if you want that).
def householderReflection(v): return mmm(identity(len(v)), sxm(2, outer(v,v)))

def sinAndCosHalfDihedralAngle(schlafli):
  # note, cos(pi/q)**2 generally has a nicer expression with no trig and often
  # no radicals, see http://www.maths.manchester.ac.uk/~cds/articles/trig.pdf
  ss = 0
  for q in schlafli: ss = cos(pi/q)**2 / (1 - ss)
  if abs(1-ss) < 1e-9: ss = 1  # prevent glitch in planar tiling cases
  return sqrt(ss), sqrt(1 - ss)

# Calculate a set of generators of the symmetry group of a {p,q,r,...} with
# edge length 1.
# Each generator is a dim x (dim+1) matrix where the square part is the initial
# orthogonal rotation/reflection and the final column is the final translation.
def calcSymmetryGenerators(schlafli):
  dim = len(schlafli) + 1
  if dim == 1: return [[[-1,1]]]  # one generator: reflect about x=.5
  facetGenerators = calcSymmetryGenerators(schlafli[:-1])
  # Start with facet generators, expanding each homogeneous matrix to full
  # dimensionality (i.e. from its previous size dim-1 x dim to dim x dim+1).
  generators = [expandhomo(gen) for gen in facetGenerators]
  # Final generator will reflect the first facet across the hyperplane
  # spanned by the first ridge and the entire polytope's center,
  # taking the first facet to a second facet also containing that ridge.
  # v = unit vector normal to that bisecting hyperplane
  #   = [0,...,0,-sin(dihedralAngle/2),cos(dihedralAngle/2)]
  s,c = sinAndCosHalfDihedralAngle(schlafli)
  v = [0]*(dim-2) + [-s,c]
  generators.append(makehomo(householderReflection(v)))
  return generators

# Key for comparing coords with roundoff error.  Makes sure the formatted
# numbers are not very close to 0, to avoid them coming out as "-0" or "1e-16".
# This isn't reliable in general, but it suffices for this application
# (except for very large {p}, no doubt).
def vert2key(vert): return ' '.join(['%.9g'%(x+.123) for x in vert])

# Returns a pair verts,edgesEtc where edgesEtc is [edges,faces,...]
def regular_polytope(schlafli):
  dim = len(schlafli) + 1
  if dim == 1: return [[0],[1]],[]

  gens = calcSymmetryGenerators(schlafli)

  facetVerts,facetEdgesEtc = regular_polytope(schlafli[:-1])

  # First get all the verts, and make a multiplication table.
  # Start with the verts of the first facet (padded to full dimensionality),
  # so indices will match up.
  verts = [facetVert+[0] for facetVert in facetVerts]
  vert2index = dict([[vert2key(vert),i] for i,vert in enumerate(verts)])
  multiplicationTable = []
  iVert = 0
  while iVert < len(verts):  # while verts is growing
    multiplicationTable.append([None] * len(gens))
    for iGen in range(len(gens)):
      newVert = mxvhomo(gens[iGen], verts[iVert])
      newVertKey = vert2key(newVert)
      if newVertKey not in vert2index:
        vert2index[newVertKey] = len(verts)
        verts.append(newVert)
      multiplicationTable[iVert][iGen] = vert2index[newVertKey]
    iVert += 1

  # The higher-level elements of each dimension are found by transforming
  # the facet's elements of that dimension.  Start by augmenting facetEdgesEtc
  # by adding one more list representing the entire facet.
  facetEdgesEtc.append([tuple(range(len(facetVerts)))])
  edgesEtc = []
  for facetElementsOfSomeDimension in facetEdgesEtc:
    elts = facetElementsOfSomeDimension[:]
    elt2index = dict([[elt,i] for i,elt in enumerate(elts)])
    iElt = 0
    while iElt < len(elts):  # while elts is growing
      for iGen in range(len(gens)):
        newElt = tuple(sorted([multiplicationTable[iVert][iGen]
                               for iVert in elts[iElt]]))
        if newElt not in elt2index:
          elt2index[newElt] = len(elts)
          elts.append(newElt)
      iElt += 1
    edgesEtc.append(elts)

  return verts,edgesEtc

# So input numbers can be like any of "8", "2.5", "7/3"
def parseNumberOrFraction(s):
  tokens = s.split('/')
  return float(tokens[0])/float(tokens[1]) if len(tokens)==2 else float(s)

if sys.stdin.isatty():
  sys.stderr.write("Enter schlafli symbol (space-separated numbers or fractions): ")
  sys.stderr.flush()
schlafli = [parseNumberOrFraction(token) for token in sys.stdin.readline().split()]
verts,edgesEtc = regular_polytope(schlafli)

# Hacky polishing of any integers or half-integers give or take rounding error.
def fudge(x): return round(2*x)/2 if abs(2*x-round(2*x))<1e-9 else x

print(repr(len(verts))+' Vertices:')
for v in verts: print(' '.join([repr(fudge(x)) for x in v]))
for eltDim in range(1,len(edgesEtc)+1):
  print("")
  elts = edgesEtc[eltDim-1]
  print(repr(len(elts))+' '+('Edges' if eltDim==1
                        else 'Faces' if eltDim==2
                        else repr(eltDim)+'-cells')+" ("+repr(len(elts[0]))+" vertices each):")
  for elt in elts: print(' '.join([repr(i) for i in elt]))

# Assert the generalization of Euler's formula: N0-N1+N2-... = 1+(-1)**(dim-1).
N = [len(elts) for elts in [verts]+edgesEtc]
eulerCharacteristic = sum((-1)**i * N[i] for i in range(len(N)))
print("Euler characteristic: "+repr(eulerCharacteristic))
if 2.5 not in schlafli: assert eulerCharacteristic == 1 + (-1)**len(schlafli)

কিছু ক্ষেত্রে এটি চেষ্টা করে দেখছি

ইনপুট ( কিউব ):

4 3

আউটপুট:

8 Vertices:
0.0 0.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
1.0 1.0 0.0
0.0 0.0 1.0
1.0 0.0 1.0
0.0 1.0 1.0
1.0 1.0 1.0

12 Edges (2 vertices each):
0 1
0 2
1 3
2 3
0 4
1 5
4 5
2 6
4 6
3 7
5 7
6 7

6 Faces (4 vertices each):
0 1 2 3
0 1 4 5
0 2 4 6
1 3 5 7
2 3 6 7
4 5 6 7

একটি ইউনিক্স কমান্ড শেল ( 120-সেল পলিচোরন ) থেকে ইনপুট :

$ echo "5 3 3" | ./schlafli_interpreter.py | grep ":"

আউটপুট:

600 Vertices:
1200 Edges (2 vertices each):
720 Faces (5 vertices each):
120 3-cells (20 vertices each):

ইনপুট (10-মাত্রিক ক্রস পলিটোপ ):

$ echo "3 3 3 3 3 3 3 3 4" | ./schlafli_interpreter.py | grep ":"

আউটপুট:

20 Vertices:
180 Edges (2 vertices each):
960 Faces (3 vertices each):
3360 3-cells (4 vertices each):
8064 4-cells (5 vertices each):
13440 5-cells (6 vertices each):
15360 6-cells (7 vertices each):
11520 7-cells (8 vertices each):
5120 8-cells (9 vertices each):
1024 9-cells (10 vertices each):

ইনপুট (15-মাত্রিক সিমপ্লেক্স ):

$ echo "3 3 3 3 3 3 3 3 3 3 3 3 3 3" | ./schlafli_interpreter.py | grep ":"

16 Vertices:
120 Edges (2 vertices each):
560 Faces (3 vertices each):
1820 3-cells (4 vertices each):
4368 4-cells (5 vertices each):
8008 5-cells (6 vertices each):
11440 6-cells (7 vertices each):
12870 7-cells (8 vertices each):
11440 8-cells (9 vertices each):
8008 9-cells (10 vertices each):
4368 10-cells (11 vertices each):
1820 11-cells (12 vertices each):
560 12-cells (13 vertices each):
120 13-cells (14 vertices each):
16 14-cells (15 vertices each):

স্টার পলিটপ

হা, এবং এটি কেবল স্বাভাবিকভাবে স্টার পলিটোপগুলিও করে! আমার এমনকি চেষ্টা করার দরকারও ছিল না :-) শেষদিকে এলারের সূত্র সম্পর্কে কিছুটা ব্যর্থ হয়, যেহেতু সূত্রটি পলিটোপগুলির জন্য বৈধ নয়।

ইনপুট ( ছোট স্টল্লেটেড ডোডেকহেড্রন ):

5/2 5

আউটপুট:

12 Vertices:
0.0 0.0 0.0
1.0 0.0 0.0
0.8090169943749473 0.5877852522924732 0.0
0.19098300562505266 0.5877852522924732 0.0
0.5 -0.36327126400268034 0.0
0.8090169943749473 -0.2628655560595667 0.5257311121191336
0.19098300562505266 -0.2628655560595667 0.5257311121191336
0.5 0.162459848116453 -0.3249196962329062
0.5 0.6881909602355867 0.5257311121191336
0.0 0.32491969623290623 0.5257311121191336
0.5 0.1624598481164533 0.8506508083520398
1.0 0.32491969623290623 0.5257311121191336

30 Edges (2 vertices each):
0 1
0 2
1 3
2 4
3 4
0 5
1 6
5 7
6 7
0 8
2 9
7 8
7 9
1 8
0 10
3 11
5 9
4 10
7 11
4 9
2 5
1 10
4 11
6 11
6 8
3 10
3 6
2 10
9 11
5 8

12 Faces (5 vertices each):
0 1 2 3 4
0 1 5 6 7
0 2 7 8 9
1 3 7 8 11
0 4 5 9 10
2 4 5 7 11
1 4 6 10 11
0 3 6 8 10
3 4 6 7 9
2 3 9 10 11
1 2 5 8 10
5 6 8 9 11
Traceback (most recent call last):
  File "./schlafli_interpreter.py", line 185, in <module>
    assert sum((-1)**i * N[i] for i in range(len(N))) == 1 + (-1)**len(schlafli)
AssertionError

ইনপুট ( দুর্দান্ত স্টেলিলেটেড 120-সেল ):

$ echo "5/2 3 5" | ./schlafli_interpreter.py | grep ":"

আউটপুট:

120 Vertices:
720 Edges (2 vertices each):
720 Faces (5 vertices each):
120 3-cells (20 vertices each):

এই প্রশ্নটি পুনরুদ্ধার করার জন্য ধন্যবাদ, এবং আপনার উত্তরটি বেশ চিত্তাকর্ষক দেখাচ্ছে। আমি পুনরাবৃত্ত প্রকৃতি এবং তারার চিত্রগুলি পছন্দ করি। পলিটোপগুলি আঁকার জন্য আমি আপনার কোডটি কিছু ওপেনগ্লের সাথে সংযুক্ত করেছি (উপরে গিথুব লিঙ্কটি দেখুন)।
টনি রুথ

14

চুনি

পটভূমি

নিয়মিত পলিটপের তিনটি পরিবার অসীম মাত্রায় বিস্তৃত:

  • সিমপ্লেক্সগুলি, যার মধ্যে টেট্রহেড্রন একটি সদস্য (আমি প্রায়শই তাদের এখানে হাইপারট্রেথিড্রা হিসাবে উল্লেখ করব, যদিও সিম্প্লেক্স শব্দটি আরও সঠিক।) তাদের স্ক্লাফি প্রতীকগুলি ফর্মের {3,3,...,3,3}

  • এন-কিউব, যার মধ্যে কিউব একটি সদস্য। তাদের স্কলাফি প্রতীকগুলি ফর্মের{4,3,...,3,3}

  • অরথোপ্লেক্সগুলি, যার মধ্যে অষ্টাড্রোনের সদস্য (আমি প্রায়শই তাদের এখানে হাইপারোকাথেড্রা হিসাবে উল্লেখ করব) তাদের স্ক্লাফি প্রতীকগুলি ফর্মের {3,3,...,3,4}

নিয়মিত পলিটোপগুলির একটি আরও অসীম পরিবার রয়েছে, প্রতীক {m}, এটি 2 টি মাত্রিক বহুভুজগুলির, যার কোনও প্রান্তের এম হতে পারে m

এগুলি ছাড়াও নিয়মিত পলিটোপের আরও পাঁচটি বিশেষ কেস রয়েছে: ত্রিমাত্রিক আইকোসেহেড্রন {3,5}এবং ডডকেহেড্রন {5,3}; তাদের 4-মাত্রিক এনালগগুলি 600-সেল {3,3,5}এবং 120-সেল {5,3,3}; এবং অন্য 4 টি মাত্রিক পলিটোপ, 24-সেল {3,4,3}(যার 3 টি মাত্রার নিকটতম এনালগগুলি হ'ল কিউবোকাথেড্রন এবং এর দ্বৈত রম্বিক ডোডেকহেড্রন))

প্রধান ফাংশন

নীচে মূল polytopeফাংশন যা স্ক্লাফি প্রতীকটিকে ব্যাখ্যা করে। এটি সংখ্যার একটি অ্যারের প্রত্যাশা করে এবং নীচে নীচে গুচ্ছ অ্যারে সমন্বিত একটি অ্যারে প্রদান করে:

  • সমস্ত উল্লম্বের একটি অ্যারে, প্রত্যেকটি স্থানাঙ্কের এন-এলিমেন্ট অ্যারে হিসাবে প্রকাশিত হয় (যেখানে এন মাত্রাগুলির সংখ্যা)

  • সমস্ত প্রান্তের একটি অ্যারে, প্রতিটি ভার্টেক্স সূচকগুলির 2-উপাদান হিসাবে প্রকাশিত

  • সমস্ত মুখের একটি অ্যারে, প্রত্যেকে ভার্টেক্স সূচকগুলির একটি মি-উপাদান হিসাবে প্রকাশ করা হয়েছে (যেখানে এম প্রতি মুখের শীর্ষে অবস্থিত সংখ্যা)

এবং তাই মাত্রা সংখ্যার জন্য উপযুক্ত।

এটি নিজেই 2 ডি পলিটোপগুলি গণনা করে, 3 অসীম মাত্রিক পরিবারের জন্য ফাংশনগুলিকে কল করে এবং পাঁচটি বিশেষ কেসগুলির জন্য অনুসন্ধান সারণী ব্যবহার করে। এটি এর উপরে ঘোষিত ফাংশন এবং সারণীগুলি সন্ধান করার প্রত্যাশা করে।

include Math

#code in subsequent sections of this answer should be inserted here 

polytope=->schl{
  if schl.size==1                                #if a single digit calculate and return a polygon
    return [(1..schl[0]).map{|i|[sin(PI*2*i/schl[0]),cos(PI*2*i/schl[0])]},(1..schl[0]).map{|i|[i%schl[0],(i+1)%schl[0]]}]  
  elsif  i=[[3,5],[5,3]].index(schl)             #if a 3d special, lookup from tables
    return [[vv,ee,ff],[uu,aa,bb]][i]
  elsif i=[[3,3,5],[5,3,3],[3,4,3]].index(schl)  #if a 4d special. lookup fromm tables
    return [[v,e,f,g],[u,x,y,z],[o,p,q,r]][i]
  elsif schl.size==schl.count(3)                 #if all threes, call tetr for a hypertetrahedron
    return tetr[schl.size+1]
  elsif schl.size-1==schl.count(3)               #if all except one number 3
    return cube[schl.size+1] if schl[0]==4       #and the 1st digit is 4, call cube for a hypercube
    return octa[schl.size+1] if schl[-1]==4      #and the last digit is 4, call octa for a hyperoctahedron
  end
  return "error"                                 #in any other case return an error
}

টেট্রহেড্রন, কিউব এবং অষ্টাহাড্রোন পরিবারের জন্য কাজ

https://en.wikipedia.org/wiki/Simplex

https://en.wikedia.org/wiki/5- सेल (4 ডি সিমপ্লেক্স)

http://mathworld.wolfram.com/Simplex.html

টেট্রহেড্রন পরিবারের ব্যাখ্যা - সমন্বয়

একটি এন-ডাইমেনশনাল সিমপ্লেক্স / হাইপারট্রেহেড্রনের n + 1 পয়েন্ট রয়েছে। এন + ডাইমেনশনাল সিমপ্লেক্সের এন + 1 মাত্রায় শীর্ষে দেওয়া খুব সহজ।

সুতরাং (1,0,0),(0,1,0),(0,0,1)3 টি মাত্রায় এমবেড করা একটি 2 ডি ত্রিভুজ (1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)বর্ণনা করে এবং 4 টি মাত্রায় এমবেডড 3 ডি টেট্রহেড্রন বর্ণনা করে। শীর্ষস্থানগুলির মধ্যে সমস্ত দূরত্ব বর্গক্ষেত্র (2) হয় তা নিশ্চিত করে এটি সহজেই যাচাই করা হয়।

এন-ডাইমেনশনাল স্পেসে এন-ডাইমেনশনাল সিমপ্লেক্সের জন্য শীর্ষ শিখরগুলি অনুসন্ধানের জন্য ইন্টারনেটে বিভিন্ন জটিল অ্যালগরিদম দেওয়া হয়। এই জবাবটি /mathpro//a/38725 - এ উইল জাগির মন্তব্যে আমি একটি অসাধারণ সাধারণ পেয়েছি । শেষ পয়েন্টটি p=q=...=x=y=zঅন্যের থেকে স্কয়ার্ট (2) এর দূরত্বে রেখার উপর অবস্থিত । সুতরাং উপরের ত্রিভুজটি একটি (-1/3,-1/3,-1/3)বা দুটি বিন্দুর যোগ করে একটি তেত্রহেড্রনে রূপান্তরিত হতে পারে(1,1,1) । শেষ পয়েন্টের জন্য স্থানাঙ্কগুলির এই 2 সম্ভাব্য মানগুলি (1-(1+n)**0.5)/nএবং দ্বারা প্রদত্ত(1+(1+n)**0.5)/n

প্রশ্ন বলেছেন এন-বৌদ্ধস্তূপ আকার ব্যাপার না, আমি n দ্বারা মাধ্যমে সংখ্যাবৃদ্ধি করতে পছন্দ এবং স্থানাঙ্ক ব্যবহার (n,0,0..0)পর্যন্ত (0..0,0,n)অনুষ্ঠিত ফাইনালে বিন্দু দিয়ে (t,t,..,t,t)যেখানে T =1-(1+n)**0.5 সরলীকরণের জন্য।

যেহেতু এই টিট্রাহেড্রনটির কেন্দ্রটি উত্সে নেই, তাই সমস্ত স্থানাঙ্কের একটি সংশোধন অবশ্যই লাইন দ্বারা করা উচিত s.map!{|j|j-((1-(1+n)**0.5)+n)/(1+n)}যা কেন্দ্রটি উত্স থেকে কতটা দূরে রয়েছে তা খুঁজে বের করে এবং এটি বিয়োগ করে। আমি এটি একটি পৃথক অপারেশন হিসাবে রেখেছি। যাইহোক আমি s[i]+=nযেখানে করতাম তা ব্যবহার করেছিলাম s[i]=n, অ্যারে যখন আরম্ভ করা হয় তখন এই বিষয়টি বোঝাতেs=[0]*n আমরা এখানে সঠিক অফসেটটি এখানে রেখে দিতে পারি এবং শেষের চেয়ে শুরুতে কেন্দ্রীকরণ সংশোধন করতে পারি।

টেট্রহেড্রন পরিবারের ব্যাখ্যা - গ্রাফ টপোলজি

সিমপ্লেক্সের গ্রাফটি সম্পূর্ণ গ্রাফ: প্রতিটি শীর্ষবিন্দুর সাথে প্রতিটি ভার্টেক্স ঠিক একবার সংযুক্ত থাকে। আমাদের যদি একটি এন সিমপ্লেক্স থাকে তবে আমরা একটি এন -1 সিম্পলেক্স দেওয়ার জন্য যে কোনও প্রান্তকে মুছে ফেলতে পারি, যেখানে আমাদের ত্রিভুজ বা একটি কিনারা রয়েছে to

সুতরাং ক্যাটালগের জন্য আমাদের কাছে মোট 2 ** (n + 1) আইটেম রয়েছে, প্রত্যেকটি বাইনারি সংখ্যার দ্বারা প্রতিনিধিত্ব করে। এটি সমস্ত কিছু থেকে কোনও কিছুর জন্য বিস্তৃত নয় 0, একের এক 1শীর্ষবিন্দু এবং দুটি 1প্রান্তের জন্য, সর্বোপরি1 সম্পূর্ণ polytope জন্য গুলি।

আমরা প্রতিটি আকারের উপাদানগুলি সংরক্ষণ করতে খালি অ্যারেগুলির একটি অ্যারে সেট করি। তারপরে আমরা শূন্য থেকে লুপ (2 ** এন + 1) প্রতিটি শীর্ষোক্তের প্রতিটি সাবসেট তৈরি করতে এবং প্রতিটি উপসেটের আকার অনুযায়ী এ্যারে সংরক্ষণ করি।

আমরা প্রান্তের চেয়ে ছোট কিছুতে (একটি শীর্ষবিন্দু বা শূন্য) বা সম্পূর্ণ পলিটোপে (যেমন পুরো ঘনকটি প্রশ্নের উদাহরণে দেওয়া হয় না) তে আগ্রহী নই, তাই আমরা ফিরে আসি tg[2..n] এই অযাচিত উপাদানগুলি সরিয়ে ফেরাতে আসি। ফিরে আসার আগে, আমরা শুরুতে ভার্টেক্সের স্থানাঙ্কযুক্ত [টিভি] ট্যাক করি।

কোড

tetr=->n{

  #Tetrahedron Family Vertices
  tv=(0..n).map{|i|
    s=[0]*n
    if i==n
      s.map!{(1-(1+n)**0.5)}
    else
      s[i]+=n
    end
    s.map!{|j|j-((1-(1+n)**0.5)+n)/(1+n)}
  s}

  #Tetrahedron Family Graph
  tg=(0..n+1).map{[]}
  (2**(n+1)).times{|i|
    s=[]
    (n+1).times{|j|s<<j if i>>j&1==1}
    tg[s.size]<<s
  }

return [tv]+tg[2..n]}

cube=->n{

  #Cube Family Vertices
  cv=(0..2**n-1).map{|i|s=[];n.times{|j|s<<(i>>j&1)*2-1};s}

  #Cube Family Graph
  cg=(0..n+1).map{[]}
  (3**n).times{|i|                         #for each point
    s=[]
    cv.size.times{|j|                      #and each vertex
      t=true                               #assume vertex goes with point
      n.times{|k|                          #and each pair of opposite sides
        t&&= (i/(3**k)%3-1)*cv[j][k]!=-1   #if the vertex has kingsmove distance >1 from point it does not belong      
      }
      s<<j if t                            #add the vertex if it belongs
    }
    cg[log2(s.size)+1]<<s if s.size > 0
  } 

return [cv]+cg[2..n]}

octa=->n{

  #Octahedron Family Vertices
  ov=(0..n*2-1).map{|i|s=[0]*n;s[i/2]=(-1)**i;s}

  #Octahedron Family Graph
  og=(0..n).map{[]}
  (3**n).times{|i|                         #for each point
    s=[]
    ov.size.times{|j|                      #and each vertex
      n.times{|k|                          #and each pair of opposite sides
        s<<j if (i/(3**k)%3-1)*ov[j][k]==1 #if the vertex is located in the side corresponding to the point, add the vertex to the list      
      }    
    }
    og[s.size]<<s
  } 

return [ov]+og[2..n]}

কিউব এবং অষ্টাহাড্রন পরিবারের ব্যাখ্যা - স্থানাঙ্ক

এন-ঘনক্ষেত্র হয়েছে 2**nছেদচিহ্ন, প্রতিটি n এর একটি অ্যারের দ্বারা প্রতিনিধিত্ব 1s এবং -1(সমস্ত সম্ভাবনার অনুমতি দেওয়া হয়।) আমরা বারবার ইনডেক্স s থেকে 0থেকে 2**n-1সব ছেদচিহ্ন তালিকায়, এবং বিট মাধ্যমে iterating দ্বারা প্রতিটি প্রান্তবিন্দু জন্য একটি অ্যারের গড়ে তুলতে সূচক এবং যোগ -1বা 1অ্যারে (অন্তত উল্লেখযোগ্য বিট সবচেয়ে গুরুত্বপূর্ণ বিট।) সুতরাং বাইনারি 11014 ডি পয়েন্ট হয়ে যায় [1,-1,1,1]

এন-অকটাহেড্রন বা এন-অরথোপ্লেক্সের একটি 2nসূচি ব্যতীত সমস্ত স্থানাঙ্ক শূন্য সহ একটি সূচক রয়েছে, যা একটি 1বা -1। উত্পাদিত অ্যারেতে উল্লম্ব ক্রম হয় [[1,0,0..],[-1,0,0..],[0,1,0..],[0,-1,0..],[0,0,1..],[0,0,-1..]...]। নোট করুন যেহেতু অষ্টাড্রনটি কিউবের দ্বৈত, তাই চারপাশে ঘনক্ষেত্রের মুখগুলির কেন্দ্রগুলি দ্বারা অষ্টাহের্ডের শীর্ষগুলি সংজ্ঞায়িত করা হয়।

কিউব এবং অষ্টাহাড্রন পরিবারের ব্যাখ্যা - গ্রাফ টপোলজি

হাইপারকিউবের পক্ষ থেকে কিছু অনুপ্রেরণা নেওয়া হয়েছিল এবং এই হাইপারোকটিহেড্রন হাইপারকিউবের দ্বৈত is

এন-কিউবের 3**nজন্য ক্যাটালগের আইটেম রয়েছে । উদাহরণস্বরূপ, 3 কিউব আছে3**3 = 27 টি উপাদান রয়েছে। এটি একটি রুবিকের ঘনক্ষেত্র অধ্যয়ন করে দেখা যায়, যার 1 টি কেন্দ্র, 6 টি মুখ, 12 টি প্রান্ত এবং মোট 27 টির জন্য 8 টি উল্লম্ব রয়েছে We .. এবং ঘনক্ষেত্রের বিপরীত দিকে নয় এমন সমস্ত শীর্ষকে ফিরিয়ে দিন। এইভাবে কিউবের কেন্দ্রবিন্দুতে সমস্ত 2 ** n টি উল্লম্ব ফিরে আসে, এবং কোনও একক বরাবর কেন্দ্র থেকে এক ইউনিট সরে যাওয়ার ফলে উল্লম্বের সংখ্যা অর্ধেক কমে যায়।

টেট্রহেড্রন পরিবারের মতো, আমরা খালি অ্যারে তৈরি করে শুরু করি এবং উপাদান হিসাবে প্রতি শীর্ষে অবস্থিত সংখ্যা অনুসারে এটি তৈরি করি। দ্রষ্টব্য যেহেতু প্রান্ত, মুখ, কিউব ইত্যাদির মধ্য দিয়ে যাওয়ার সময় আমরা উল্টোর সংখ্যা 2 ** এন হিসাবে পরিবর্তিত হয়, আমরা log2(s.size)+1কেবল পরিবর্তে ব্যবহার করি s.size। আবার, ফাংশন থেকে ফিরে আসার আগে আমাদের হাইপারকিউব নিজেই এবং 2 টিরও কম শীর্ষে থাকা সমস্ত উপাদানগুলি সরিয়ে ফেলতে হবে।

অষ্টাহাড্রন / অরথোপ্লেক্স পরিবার কিউব পরিবারের ডুয়াল, তাই আবার 3**nক্যাটালগের আইটেম রয়েছে । এখানে আমরা -1,0,1সমস্ত মাত্রার জন্য পুনরাবৃত্তি করি এবং যদি একটি শীর্ষবিন্দুর ননজারো স্থানাঙ্কটি বিন্দুর সাথে সম্পর্কিত স্থানাঙ্কের সমান হয় তবে সেই বিন্দুটির সাথে তালিকায় ভার্টেক্স যুক্ত হবে। সুতরাং একটি প্রান্ত দুটি নোনজারো স্থানাঙ্কের সাথে বিন্দুর সাথে মিলিত হয়, 3 নোনজারো স্থানাঙ্কের সাথে একটি বিন্দুর সাথে একটি ত্রিভুজ এবং 4 টি নঞ্জেরো পরিচিতিযুক্ত একটি বিন্দুতে একটি টেট্রহেড্রন (4 ডি স্পেসে।)

প্রতিটি পয়েন্টের জন্য ভার্টেক্সের ফলে প্রাপ্ত অ্যারেগুলি অন্যান্য ক্ষেত্রে হিসাবে একটি বড় অ্যারেতে সংরক্ষণ করা হয় এবং ফিরে আসার আগে আমাদের 2 টিরও কম উল্লম্ব সহ কোনও উপাদান সরিয়ে ফেলতে হয়। তবে এক্ষেত্রে আমাদের সম্পূর্ণ প্যারেন্ট এন-টোপ সরিয়ে ফেলতে হবে না কারণ অ্যালগরিদম এটি রেকর্ড করে না।

কিউবের জন্য কোডটির প্রয়োগগুলি যথাসম্ভব অনুরূপভাবে নকশাকৃত করা হয়েছিল। যদিও এটির একটি নির্দিষ্ট কমনীয়তা রয়েছে, সম্ভবত এটি একই নীতির উপর ভিত্তি করে আরও দক্ষ অ্যালগরিদমগুলি রচনা করা যেতে পারে।

https://en.wikipedia.org/wiki/Hypercube

http://mathworld.wolfram.com/Hypercube.html

https://en.wikipedia.org/wiki/Cross-polytope

http://mathworld.wolfram.com/CrossPolytope.html

3 ডি বিশেষ ক্ষেত্রে সারণী উত্পন্ন করার কোড

শেষ মাত্রার সাথে সমান্তরাল পঞ্চভুজ প্রতিসাম অক্ষের সাহায্যে আইকোসহেড্রন / ডডেকএহেড্রনযুক্ত একটি প্রাচীর ব্যবহার করা হয়েছিল, কারণ এটি অংশগুলির সবচেয়ে ধারাবাহিক লেবেলিংয়ের জন্য তৈরি হয়েছিল। আইকোসেহেড্রনের জন্য শীর্ষে এবং মুখগুলির সংখ্যা কোড মন্তব্যে ডায়াগ্রাম অনুযায়ী হয় এবং ডডকেহেড্রনের বিপরীতে থাকে।

Https://en.wikedia.org/wiki/Regular_icosahedron অনুসারে আইকোসহেড্রনের 10 নন-পোলার উল্লম্বের অক্ষাংশটি +/- আর্টিকান (1/2) আইকোসহেড্রনের প্রথম 10 টি উলম্বের স্থানাঙ্কগুলি গণনা করা হয় এটি, এক্সওয়ান বিমান থেকে দূরত্বের 2 / 2- এর ব্যাসার্ধের দুটি বৃত্তে। এটি পরিধি বর্গক্ষেত্রের সামগ্রিক ব্যাসার্ধটি তৈরি করে (5) সুতরাং সর্বশেষ 2 টি শীর্ষ কোণটি (0,0, + / - স্কয়ার্ট (2)) এ রয়েছে।

ডোডেকেহেড্রনটির উল্লম্বের স্থানাঙ্কগুলি চারপাশের তিনটি আইকোস্যাড্রন উল্লম্বের স্থানাঙ্কগুলি যোগ করে গণনা করা হয়।

=begin
TABLE NAMES      vertices     edges      faces
icosahedron      vv           ee         ff
dodecahedron     uu           aa         bb 

    10
    / \   / \   / \   / \   / \
   /10 \ /12 \ /14 \ /16 \ /18 \
   -----1-----3-----5-----7-----9
   \ 0 / \ 2 / \ 4 / \ 6 / \ 8 / \
    \ / 1 \ / 3 \ / 5 \ / 7 \ / 9 \
     0-----2-----4-----6-----8-----
      \11 / \13 / \15 / \17 / \19 /
       \ /   \ /   \ /   \ /   \ / 
       11
=end

vv=[];ee=[];ff=[]
10.times{|i|
  vv[i]=[2*sin(PI/5*i),2*cos(PI/5*i),(-1)**i]
  ee[i]=[i,(i+1)%10];ee[i+10]=[i,(i+2)%10];ee[i+20]=[i,11-i%2]
  ff[i]=[(i-1)%10,i,(i+1)%10];ff[i+10]=[(i-1)%10,10+i%2,(i+1)%10]

}
vv+=[[0,0,-5**0.5],[0,0,5**0.5]]

uu=[];aa=[];bb=[]
10.times{|i|
  uu[i]=(0..2).map{|j|vv[ff[i][0]][j]+vv[ff[i][1]][j]+vv[ff[i][2]][j]}
  uu[i+10]=(0..2).map{|j|vv[ff[i+10][0]][j]+vv[ff[i+10][1]][j]+vv[ff[i+10][2]][j]}
  aa[i]=[i,(i+1)%10];aa[i+10]=[i,(i+10)%10];aa[i+20]=[(i-1)%10+10,(i+1)%10+10]
  bb[i]=[(i-1)%10+10,(i-1)%10,i,(i+1)%10,(i+1)%10+10] 
}
bb+=[[10,12,14,16,18],[11,13,15,17,19]]

4 ডি বিশেষ ক্ষেত্রে সারণী তৈরির কোড

এটি হ্যাক একটি বিট। এই কোডটি চালাতে কয়েক সেকেন্ড সময় নেয়। আউটপুট কোনও ফাইলে সংরক্ষণ করা এবং প্রয়োজনীয় হিসাবে এটি লোড করা ভাল।

Cell০০ সেলের জন্য ১২ টি ভার্টেক্স স্থানাঙ্কের তালিকাটি হ'ল http://mathworld.wolfram.com/600-Cllll.html থেকে । 24 টি ভার্টেক্স স্থানাঙ্ক যা একটি সোনালী অনুপাত বৈশিষ্ট্যযুক্ত না 24-কক্ষের শীর্ষকোষ গঠন করে। উইকিপিডিয়ায় একই স্কিম রয়েছে তবে এই 24 টি স্থানাঙ্কের অপেক্ষাকৃত স্কেল এবং অন্যান্য 96 টিতে ত্রুটি রয়েছে।

#TABLE NAMES                           vertices     edges      faces   cells
#600 cell (analogue of icosahedron)    v            e          f       g
#120 cell (analogue of dodecahedron)   u            x          y       z 
#24 cell                               o            p          q       r

#600-CELL

# 120 vertices of 600cell. First 24 are also vertices of 24-cell

v=[[2,0,0,0],[0,2,0,0],[0,0,2,0],[0,0,0,2],[-2,0,0,0],[0,-2,0,0],[0,0,-2,0],[0,0,0,-2]]+

(0..15).map{|j|[(-1)**(j/8),(-1)**(j/4),(-1)**(j/2),(-1)**j]}+

(0..95).map{|i|j=i/12
   a,b,c,d=1.618*(-1)**(j/4),(-1)**(j/2),0.618*(-1)**j,0
   h=[[a,b,c,d],[b,a,d,c],[c,d,a,b],[d,c,b,a]][i%12/3]
   (i%3).times{h[0],h[1],h[2]=h[1],h[2],h[0]}
h}

#720 edges of 600cell. Identified by minimum distance of 2/phi between them

e=[]
120.times{|i|120.times{|j|
  e<<[i,j]  if i<j && ((v[i][0]-v[j][0])**2+(v[i][1]-v[j][1])**2+(v[i][2]-v[j][2])**2+(v[i][3]-v[j][3])**2)**0.5<1.3  
}}

#1200 faces of 600cell. 
#If 2 edges share a common vertex and the other 2 vertices form an edge in the list, it is a valid triangle.

f=[]
720.times{|i|720.times{|j|
  f<< [e[i][0],e[i][1],e[j][1]] if i<j && e[i][0]==e[j][0] && e.index([e[i][1],e[j][1]])
}}

#600 cells of 600cell.
#If 2 triangles share a common edge and the other 2 vertices form an edge in the list, it is a valid tetrahedron.

g=[]
1200.times{|i|1200.times{|j|
  g<< [f[i][0],f[i][1],f[i][2],f[j][2]] if i<j && f[i][0]==f[j][0] && f[i][1]==f[j][1] && e.index([f[i][2],f[j][2]])

}}

#120 CELL (dual of 600 cell)

#600 vertices of 120cell, correspond to the centres of the cells of the 600cell
u=g.map{|i|s=[0,0,0,0];i.each{|j|4.times{|k|s[k]+=v[j][k]/4.0}};s}

#1200 edges of 120cell at centres of faces of 600-cell. Search for pairs of tetrahedra with common face
x=f.map{|i|s=[];600.times{|j|s<<j if i==(i & g[j])};s}

#720 pentagonal faces, surrounding edges of 600-cell. Search for sets of 5 tetrahedra with common edge
y=e.map{|i|s=[];600.times{|j|s<<j if i==(i & g[j])};s}

#120 dodecahedral cells surrounding vertices of 600-cell. Search for sets of 20 tetrahedra with common vertex
z=(0..119).map{|i|s=[];600.times{|j|s<<j if [i]==([i] & g[j])};s}


#24-CELL
#24 vertices, a subset of the 600cell
o=v[0..23]

#96 edges, length 2, found by minimum distances between vertices
p=[]
24.times{|i|24.times{|j|
  p<<[i,j]  if i<j && ((v[i][0]-v[j][0])**2+(v[i][1]-v[j][1])**2+(v[i][2]-v[j][2])**2+(v[i][3]-v[j][3])**2)**0.5<2.1  
}}

#96 triangles
#If 2 edges share a common vertex and the other 2 vertices form an edge in the list, it is a valid triangle.
q=[]
96.times{|i|96.times{|j|
  q<< [p[i][0],p[i][1],p[j][1]] if i<j && p[i][0]==p[j][0] && p.index([p[i][1],p[j][1]])
}}


#24 cells. Calculates the centre of the cell and the 6 vertices nearest it
r=(0..23).map{|i|a,b=(-1)**i,(-1)**(i/2)
    c=[[a,b,0,0],[a,0,b,0],[a,0,0,b],[0,a,b,0],[0,a,0,b],[0,0,a,b]][i/4]
    s=[]
    24.times{|j|t=v[j]
    s<<j if (c[0]-t[0])**2+(c[1]-t[1])**2+(c[2]-t[2])**2+(c[3]-t[3])**2<=2 
    }
s}

https://en.wikipedia.org/wiki/600-cell

http://mathworld.wolfram.com/600-Cell.html

https://en.wikipedia.org/wiki/120-cell

http://mathworld.wolfram.com/120-Cell.html

https://en.wikipedia.org/wiki/24-cell

http://mathworld.wolfram.com/24-Cell.html

ব্যবহার এবং আউটপুট উদাহরণ

cell24 = polytope[[3,4,3]]

puts "vertices"
cell24[0].each{|i|p i}
puts "edges"
cell24[1].each{|i|p i}
puts "faces"
cell24[2].each{|i|p i}
puts "cells"
cell24[3].each{|i|p i}

vertices
[2, 0, 0, 0]
[0, 2, 0, 0]
[0, 0, 2, 0]
[0, 0, 0, 2]
[-2, 0, 0, 0]
[0, -2, 0, 0]
[0, 0, -2, 0]
[0, 0, 0, -2]
[1, 1, 1, 1]
[1, 1, 1, -1]
[1, 1, -1, 1]
[1, 1, -1, -1]
[1, -1, 1, 1]
[1, -1, 1, -1]
[1, -1, -1, 1]
[1, -1, -1, -1]
[-1, 1, 1, 1]
[-1, 1, 1, -1]
[-1, 1, -1, 1]
[-1, 1, -1, -1]
[-1, -1, 1, 1]
[-1, -1, 1, -1]
[-1, -1, -1, 1]
[-1, -1, -1, -1]
edges
[0, 8]
[0, 9]
[0, 10]
[0, 11]
[0, 12]
[0, 13]
[0, 14]
[0, 15]
[1, 8]
[1, 9]
[1, 10]
[1, 11]
[1, 16]
[1, 17]
[1, 18]
[1, 19]
[2, 8]
[2, 9]
[2, 12]
[2, 13]
[2, 16]
[2, 17]
[2, 20]
[2, 21]
[3, 8]
[3, 10]
[3, 12]
[3, 14]
[3, 16]
[3, 18]
[3, 20]
[3, 22]
[4, 16]
[4, 17]
[4, 18]
[4, 19]
[4, 20]
[4, 21]
[4, 22]
[4, 23]
[5, 12]
[5, 13]
[5, 14]
[5, 15]
[5, 20]
[5, 21]
[5, 22]
[5, 23]
[6, 10]
[6, 11]
[6, 14]
[6, 15]
[6, 18]
[6, 19]
[6, 22]
[6, 23]
[7, 9]
[7, 11]
[7, 13]
[7, 15]
[7, 17]
[7, 19]
[7, 21]
[7, 23]
[8, 9]
[8, 10]
[8, 12]
[8, 16]
[9, 11]
[9, 13]
[9, 17]
[10, 11]
[10, 14]
[10, 18]
[11, 15]
[11, 19]
[12, 13]
[12, 14]
[12, 20]
[13, 15]
[13, 21]
[14, 15]
[14, 22]
[15, 23]
[16, 17]
[16, 18]
[16, 20]
[17, 19]
[17, 21]
[18, 19]
[18, 22]
[19, 23]
[20, 21]
[20, 22]
[21, 23]
[22, 23]
faces
[0, 8, 9]
[0, 8, 10]
[0, 8, 12]
[0, 9, 11]
[0, 9, 13]
[0, 10, 11]
[0, 10, 14]
[0, 11, 15]
[0, 12, 13]
[0, 12, 14]
[0, 13, 15]
[0, 14, 15]
[1, 8, 9]
[1, 8, 10]
[1, 8, 16]
[1, 9, 11]
[1, 9, 17]
[1, 10, 11]
[1, 10, 18]
[1, 11, 19]
[1, 16, 17]
[1, 16, 18]
[1, 17, 19]
[1, 18, 19]
[2, 8, 9]
[2, 8, 12]
[2, 8, 16]
[2, 9, 13]
[2, 9, 17]
[2, 12, 13]
[2, 12, 20]
[2, 13, 21]
[2, 16, 17]
[2, 16, 20]
[2, 17, 21]
[2, 20, 21]
[3, 8, 10]
[3, 8, 12]
[3, 8, 16]
[3, 10, 14]
[3, 10, 18]
[3, 12, 14]
[3, 12, 20]
[3, 14, 22]
[3, 16, 18]
[3, 16, 20]
[3, 18, 22]
[3, 20, 22]
[4, 16, 17]
[4, 16, 18]
[4, 16, 20]
[4, 17, 19]
[4, 17, 21]
[4, 18, 19]
[4, 18, 22]
[4, 19, 23]
[4, 20, 21]
[4, 20, 22]
[4, 21, 23]
[4, 22, 23]
[5, 12, 13]
[5, 12, 14]
[5, 12, 20]
[5, 13, 15]
[5, 13, 21]
[5, 14, 15]
[5, 14, 22]
[5, 15, 23]
[5, 20, 21]
[5, 20, 22]
[5, 21, 23]
[5, 22, 23]
[6, 10, 11]
[6, 10, 14]
[6, 10, 18]
[6, 11, 15]
[6, 11, 19]
[6, 14, 15]
[6, 14, 22]
[6, 15, 23]
[6, 18, 19]
[6, 18, 22]
[6, 19, 23]
[6, 22, 23]
[7, 9, 11]
[7, 9, 13]
[7, 9, 17]
[7, 11, 15]
[7, 11, 19]
[7, 13, 15]
[7, 13, 21]
[7, 15, 23]
[7, 17, 19]
[7, 17, 21]
[7, 19, 23]
[7, 21, 23]
cells
[0, 1, 8, 9, 10, 11]
[1, 4, 16, 17, 18, 19]
[0, 5, 12, 13, 14, 15]
[4, 5, 20, 21, 22, 23]
[0, 2, 8, 9, 12, 13]
[2, 4, 16, 17, 20, 21]
[0, 6, 10, 11, 14, 15]
[4, 6, 18, 19, 22, 23]
[0, 3, 8, 10, 12, 14]
[3, 4, 16, 18, 20, 22]
[0, 7, 9, 11, 13, 15]
[4, 7, 17, 19, 21, 23]
[1, 2, 8, 9, 16, 17]
[2, 5, 12, 13, 20, 21]
[1, 6, 10, 11, 18, 19]
[5, 6, 14, 15, 22, 23]
[1, 3, 8, 10, 16, 18]
[3, 5, 12, 14, 20, 22]
[1, 7, 9, 11, 17, 19]
[5, 7, 13, 15, 21, 23]
[2, 3, 8, 12, 16, 20]
[3, 6, 10, 14, 18, 22]
[2, 7, 9, 13, 17, 21]
[6, 7, 11, 15, 19, 23]

1
বাহ এটি একটি দুর্দান্ত উত্তর !! আমি খুব অবাক হয়েছি যে আপনি 200 ডলার লাইনে এটি করতে সক্ষম হয়েছিলেন। আমি কিউব, টেট্রহেড্রন, -০০ কোষ এবং আরও কয়েকজন চালিয়েছি এবং তারা দেখতে ভাল লাগছিল। আউটপুটটির অনেক কিছু যাচাই করা খুব কঠিন; প্রোগ্রামটির চেয়ে আউটপুট দীর্ঘতর হওয়া সহজ তবে এটির জন্য আমি আপনার শব্দটি গ্রহণ করব। আমি ওপেনজিএলে এটিকে লোড করার চেষ্টা করতে যাচ্ছি এবং প্লাটোনিক সলিউডগুলি দেখতে যা যা সমস্ত মুখ তালিকাভুক্ত হওয়ার কারণে সোজা হওয়া উচিত। আমি মনে করি সমতল স্থানে টেসলেশন যুক্ত করা সহজ হবে এবং আমিও এটি চেষ্টা করতে পারি।
টনি রুথ

@ টনিরথ কীটি সেরা অ্যালগরিদম সন্ধান করছে। কম লাইন = ত্রুটির জন্য কম ঘর। আমি প্রথম কাজটি করেছিলাম 3 অসীম মাত্রিক পরিবারগুলি ছাড়াও কি বিদ্যমান ছিল তা যাচাই করেছিলাম এবং যখন আমি উত্তর দেওয়ার সিদ্ধান্ত নিয়েছিলাম। উইল জিগির মন্তব্যগুলি কি গডসেন্ড ছিল (আমি উইকিপিডিয়া পদ্ধতিটি কঠিন দেখায় সে ধরণের সমাধান সম্পর্কে ভাবছিলাম) সুতরাং অ-পূর্ণসংখ্যার স্থানাঙ্কগুলি সর্বনিম্ন রাখা হয়। আমি অনুগ্রহের মেয়াদ শেষ হওয়ার আগে এটি সম্পন্ন করতে চেয়েছিলাম যাতে চেকিং ব্যাপকভাবে পুরোপুরি করা যায় নি, এবং আমি সেগুলির পরিকল্পনাও করি নি। আমাকে যে কোনও ত্রুটি সম্পর্কে বলুন - আমি 24 ঘন্টাটি সংশোধন করেছি কয়েক ঘন্টা আগে।
স্তরের নদী সেন্ট

@ টনিরথের মুখোমুখি কোনও নির্দিষ্ট ক্রমে নেই (তারা ঘড়ির কাঁটার দিক দিয়ে কোনও দিক দিয়ে মুখ ঘুরিয়ে না)। উচ্চ মাত্রার জন্য, কোনও মানক অর্ডার নেই। হাইপারকিউবে সামনের সংখ্যা অনুসারে তালিকাভুক্ত রয়েছে, সুতরাং ২ য় এবং ৩ য় শীর্ষটি ত্রিভুজের বিপরীতে রয়েছে (আপনি যদি ঘড়ির কাঁটা / অ্যান্টিલોকওয়াইজ অর্থে তাদের চান তবে আপনার 1 ম এবং 2 য় বা 3 য় এবং চতুর্থ ভার্টেক্সটি অদলবদল করতে হবে)) ডডেকাহেড্রনের মধ্যে মুখ থাকা উচিত ক্লকওয়াইজ / অ্যান্টলিকওয়্যার অর্ডার করলেও 120सेलটির কোনও এবং সমস্ত অর্ডারে মুখের শীর্ষগুলি থাকবে।
স্তরের নদী সেন্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.