চুনি
পটভূমি
নিয়মিত পলিটপের তিনটি পরিবার অসীম মাত্রায় বিস্তৃত:
সিমপ্লেক্সগুলি, যার মধ্যে টেট্রহেড্রন একটি সদস্য (আমি প্রায়শই তাদের এখানে হাইপারট্রেথিড্রা হিসাবে উল্লেখ করব, যদিও সিম্প্লেক্স শব্দটি আরও সঠিক।) তাদের স্ক্লাফি প্রতীকগুলি ফর্মের {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 এর একটি অ্যারের দ্বারা প্রতিনিধিত্ব 1
s এবং -1
(সমস্ত সম্ভাবনার অনুমতি দেওয়া হয়।) আমরা বারবার ইনডেক্স s থেকে 0
থেকে 2**n-1
সব ছেদচিহ্ন তালিকায়, এবং বিট মাধ্যমে iterating দ্বারা প্রতিটি প্রান্তবিন্দু জন্য একটি অ্যারের গড়ে তুলতে সূচক এবং যোগ -1
বা 1
অ্যারে (অন্তত উল্লেখযোগ্য বিট সবচেয়ে গুরুত্বপূর্ণ বিট।) সুতরাং বাইনারি 1101
4 ডি পয়েন্ট হয়ে যায় [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]