9

यदि मेरे पास कोई बिंदु (x, y z) है, तो मैं उस बिंदु के लिए रैखिक अनुक्रमणिका कैसे प्राप्त करूं? मेरी क्रमांकन योजना (0,0,0) 0 होगी, (1, 0, 0) 1 है,। । ।, (0, 1, 0) अधिकतम-x-आयाम है, .... इसके अलावा, यदि मेरे पास रैखिक समन्वय है, तो, मैं (x, y, z) कैसे ढूंढूं? मुझे यह Google पर नहीं लगता है, सभी परिणाम अन्य अप्रासंगिक सामान से भरे हुए हैं। धन्यवाद!मैं एक 3 डी समन्वय के रैखिक सूचकांक की गणना कैसे करूं और इसके विपरीत?

+0

क्या समन्वय हमेशा पूर्णांक से बने होते हैं? क्या आपके पास नकारात्मक निर्देशांक हो सकते हैं? क्या आपके पास एक्स अक्ष के अलावा किसी भी अक्ष के लिए अधिकतम सीमा है? – Kevin

+0

क्या प्रत्येक समन्वय में समान संख्या में विभाजन होते हैं, या अलग होते हैं? अंतिम बिंदु '(एन, एन, एन) 'या' (एन 1, एन 2, एन 3)' द्वारा दर्शाया गया है? – ja72

उत्तर

23

एक नंबर पर 3 डी समन्वय को मैप करने के कुछ तरीके हैं। यहाँ एक रास्ता है।

कुछ फ़ंक्शन f (x, y, z) समन्वय (x, y, z) की रैखिक अनुक्रमणिका देता है। इसमें कुछ स्थिरांक ए, बी, सी, डी हैं जिन्हें हम प्राप्त करना चाहते हैं ताकि हम एक उपयोगी रूपांतरण समारोह लिख सकें।

f(x,y,z) = a*x + b*y + c*z + d 

आपने उल्लेख किया है कि (0,0,0) 0. तो करने के लिए नक्शे:

f(0,0,0) = a*0 + b*0 + c*0 + d = 0 
d = 0 
f(x,y,z) = a*x + b*y + c*z 

हल d है यही कारण है कि। आपने उल्लेख किया है कि (1,0,0) 1. तो करने के लिए नक्शे:

f(1,0,0) = a*1 + b*0 + c*0 = 1 
a = 1 
f(x,y,z) = x + b*y + c*z 

एक हल है यही कारण है कि। आइए मनमाने ढंग से निर्णय लें कि अगले अधिकतम संख्या (MAX_X, 0, 0) (0,1,0) है।

f(MAX_X, 0, 0) = MAX_X 
f(0, 1, 0) = 0 + b*1 + c*0 = MAX_X + 1 
b = MAX_X + 1 
f(x,y,z) = x + (MAX_X + 1)*y + c*z 

यह बी हल हो गया है। आइए मनमाने ढंग से निर्णय लें कि (MAX_X, MAX_Y, 0) के बाद अगला उच्चतम नंबर (0,0,1) है।

f(MAX_X, MAX_Y, 0) = MAX_X + MAX_Y * (MAX_X + 1) 
f(0,0,1) = 0 + (MAX_X + 1) * 0 + c*1 = MAX_X + MAX_Y * (MAX_X + 1) + 1 
c = MAX_X + MAX_Y * (MAX_X + 1) + 1 
c = (MAX_X + 1) + MAX_Y * (MAX_X + 1) 
c = (MAX_X + 1) * (MAX_Y + 1) 

अब है कि हम जानते हैं कि एक, ख, ग, और घ, हम अपने कार्य के रूप में निम्नानुसार लिख सकते हैं:

function linearIndexFromCoordinate(x,y,z, max_x, max_y){ 
    a = 1 
    b = max_x + 1 
    c = (max_x + 1) * (max_y + 1) 
    d = 0 
    return a*x + b*y + c*z + d 
} 

आप समान तर्क द्वारा रैखिक सूचकांक से समन्वय प्राप्त कर सकते हैं। मेरे पास इसका एक अद्भुत प्रदर्शन है, जो इस पृष्ठ को शामिल करने के लिए बहुत छोटा है। तो मैं गणित व्याख्यान छोड़ दूंगा और आपको केवल अंतिम विधि दूंगा।

function coordinateFromLinearIndex(idx, max_x, max_y){ 
    x = idx % (max_x+1) 
    idx /= (max_x+1) 
    y = idx % (max_y+1) 
    idx /= (max_y+1) 
    z = idx 
    return (x,y,z) 
} 
+0

महान उत्तर! मुझे लगता है कि मैं 375 साल के लिए अपने अद्भुत सबूत पर बस पहेली करूंगा (लेकिन अब यह समझ में आता है)। बहुत बहुत धन्यवाद। – user1438116

+0

@ केविन हैलो! मुझे एहसास है कि यह सवाल लगभग 2 साल पुराना है, लेकिन मैं सोच रहा था: क्या आपके पास उस गणित व्याख्यान का लिंक हो सकता है जिसका आपने उल्लेख किया था? आपकी विधि बिल्कुल शानदार लगती है, इसलिए मैं इसके पीछे गणित के बारे में उत्सुक था। –

+0

आपको जवाब स्वीकार करने के बाद संपादन में कोड को नहीं बदला जाना चाहिए - यह एक टिप्पणी में किया जाना चाहिए। –

1

यदि आपके पास निर्देशांक पर कोई ऊपरी सीमा नहीं है, तो आप उन्हें उत्पत्ति और बाहर से संख्या दे सकते हैं। परत दर परत।

(0,0,0) -> 0 
(0,0,1) -> 1 
(0,1,0) -> 2 
(1,0,0) -> 3 
(0,0,2) -> 4 
    :  : 
(a,b,c) -> (a+b+c)·(a+b+c+1)·(a+b+c+2)/6 + (a+b)·(a+b+1)/2 + a 

उलटा कठिन है, क्योंकि आपको तीसरी डिग्री बहुपद को हल करना होगा।

m1 = InverseTetrahedralNumber(n) 
m2 = InverseTriangularNumber(n - Tetra(m1)) 
a = n - Tetra(m1) - Tri(m2) 
b = m2 - a 
c = m1 - m2 

InverseTetrahedralNumber(n) = { x ∈ ℕ | Tetra(n) ≤ x < Tetra(n+1) } 
Tetra(n) = n·(n+1)·(n+2)/6 
InverseTriangularNumber(n) = { x ∈ ℕ | Tri(n) ≤ x < Tri(n+1) } 
Tri(n) = n·(n+1)/2 

InverseTetrahedralNumber(n)large analytic solution से गणना जहां सकता है या तो, या some numeric method साथ की खोज की।


यहां बीजगणितीय समाधान (जावास्क्रिप्ट) में मेरा प्रयास है। मैं समीकरणों को सरल बनाने के लिए प्रतिस्थापन p = a+b+c, q = a+b, r = a का उपयोग कर रहा हूं।

function index(a,b,c) { 
    var r = a; 
    var q = r + b; 
    var p = q + c; 
    return (p*(p+1)*(p+2) + 3*q*(q+1) + 6*r)/6; 
} 

function solve(n) { 
    if (n <= 0) { 
     return [0,0,0]; 
    } 

    var sqrt = Math.sqrt; 
    var cbrt = function (x) { return Math.pow(x,1.0/3); }; 

    var X = sqrt(729*n*n - 3); 
    var Y = cbrt(81*n + 3*X); 
    var p = Math.floor((Y*(Y-3)+3)/(Y*3)); 
    if ((p+1)*(p+2)*(p+3) <= n*6) p++; 
    var pp = p*(p+1)*(p+2); 

    var Z = sqrt(72*n+9-12*pp); 
    var q = Math.floor((Z-3)/6); 
    if (pp + (q+1)*(q+2)*3 <= n*6) q++; 
    var qq = q*(q+1); 

    var r = Math.floor((6*n-pp-3*qq)/6); 
    if (pp + qq*3 + r*6 < n*6) r++; 

    return [r, q - r, p - q]; 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^