2012-01-02 16 views
7

मेरे पास एक यूनिट दायां त्रिकोण है और प्रत्येक 3 कोष्ठक में एक मान है। मुझे त्रिभुज के अंदर एक बिंदु पर मूल्य खोजने के लिए इंटरपोलेट करने की आवश्यकता है। खोज के घंटे कुछ भी नहीं बदल गए हैं जो वास्तव में मुझे यह बताता है कि यह कैसे करें।त्रिकोण का इंटरपोलेशन

   result = 
       v1 * (1 - x) * (1 - y) + 
       v2 * x * (1 - y) + 
       v3 * x * y; 

V1, V2, और v3 त्रिकोण के 3 कोने में मान रहे हैं - यहाँ मेरी सबसे करीब का प्रयास है, जो वास्तव बहुत करीब नहीं लेकिन बहुत सही है। (x, y) त्रिकोण में बिंदु है जिसे आप मानने का प्रयास कर रहे हैं।

किसी भी प्रकार की विधि मुझे यहां मदद करेगी। यह आवश्यक रूप से एक इकाई/दाएं त्रिकोण होने की आवश्यकता नहीं है।

अद्यतन जानकारी: मेरे पास समान बिंदु वाले बिंदुओं और प्रत्येक बिंदु पर एक मान का ग्रिड है। मैं ग्रिड पर निकटतम 3 बिंदुओं से एक त्रिकोण बना देता हूं। यहां चित्रित करने के लिए एक तस्वीर है - enter image description here
इसलिए मुझे x के मान को खोजने के लिए 5, 3, और 7 के बीच अंतर करना होगा। बिंदु अन्य त्रिकोण के अंदर भी हो सकता है, जिसका अर्थ है कि आप 5, 7, और वर्ग के निचले बाएं कोने के मान के बीच अंतरण करेंगे।

कोड में मैंने दिखाया है, v1 = 5, v2 = 3, v3 = 7.
x "x" दिशा में आंशिक दूरी (सीमा [0-1]) है, और y fractional दूरी है "वाई" दिशा में।
चित्र के उदाहरण में, एक्स शायद के बारे में 0.75 होगा और y होगा के बारे में 0.2

यहाँ मेरी सबसे करीब का प्रयास कर रहे हैं -

 if (x > y) //if x > y then the point is in the upper right triangle 
      return 
       v1 * (1 - x) * (1 - y) + 
       v2 * x * (1 - y) + 
       v3 * x * y; 
     else //bottom left triangle 
      return 
       v1 * (1 - x) * (1 - y) + 
       v4 * (1 - x) * y + 
       v3 * x * y; 

और एक और प्रयास - -
enter image description here
का उपयोग कर बनाया
enter image description here
का उपयोग करके बनाया गया -

if (x > y) 
      return 
       (1 - x) * v1 + (x - y) * v2 + y * v3; 
     else 
      return 
       (1 - y) * v1 + (y - x) * v4 + x * v3; 

वे दोनों जो मुझे चाहिए उसके करीब हैं लेकिन स्पष्ट रूप से बिल्कुल सही नहीं है।

+0

तो शिखर है जो जो ? मुझे दिखाएं कि आपकी समन्वय प्रणाली कैसे काम करती है, जिस तरह से एक्स और वाई जाते हैं और जहां v1 v2 और v3 हैं। – Dan

+0

@ डैन ओके मैंने कुछ जानकारी अपडेट करने के लिए अपडेट किया है कि मैं गहराई से थोड़ा और क्या कर रहा हूं। – Frobot

+0

क्या आपके पास दिमाग में एक विशिष्ट व्याख्या विधि है? रैखिक/बिलीनेर/निकटतम पड़ोसी? – rsaxvc

उत्तर

2

मैं 3 साल पहले इस पूछा और अभी भी यह करने के लिए एक रास्ते पर काम कर रहा है उत्पन्न करता है लगता है। मुझे विश्वास है कि एक समतुल्य त्रिभुज का उपयोग करते समय यह असंभव है। बैरीसेंट्रिक निर्देशांक का उपयोग करके इसे करने का एक अच्छा तरीका है और फिर ऐसी तकनीक जोड़ना जो अधिकांश कलाकृतियों से छुटकारा पाता है। v1, v2, v3 त्रिभुज के तीन बिंदुओं पर मान हैं। एक्स, वाई वह बिंदु है जिसके लिए आप एक मूल्य खोजना चाहते हैं।

if (x > y) 
     { 
      b1 = -(x - 1); 
      b2 = (x - 1) - (y - 1); 
      b3 = 1 - b1 - b2; 
     } 
     else 
     { 
      b1 = -(y - 1); 
      b2 = -((x - 1) - (y - 1)); 
      b3 = 1 - b1 - b2; 
     } 

     float 
      abs = x - y; 
     if (abs < 0) abs *= -1; 
     if (abs < 0.25f) 
     { 
      abs = 0.25f - abs; 
      abs *= abs; 
      b1 -= abs; 
      b3 -= abs; 
     } 

     b1 *= b1; 
     b2 *= b2; 
     b3 *= b3; 
     float fd = 1/(b1 + b2 + b3); 
     b1 *= fd; 
     b2 *= fd; 
     b3 *= fd; 

     return 
       v1 * b1 + 
       v2 * b2 + 
       v3 * b3; 
+3

कहें, क्या आप तुलना के परिणाम की एक तस्वीर पोस्ट कर सकते हैं? – rsaxvc

1

ठीक है, इसलिए हम एक रैखिक इंटरपोलेशन करेंगे, यह मानते हुए कि ढाल x और y के संबंध में स्थिर है। d/dx = v2 - v1 और d/dy = v3 - v2, और f(0,0) = v1। हमारे पास एक साधारण दो आयामी अंतर समीकरण है।

d{f(x,y)} = (v2 - v1)*dx 
f(x,y) = (v2 - v1)*x + g(y) 
d{f(x,y)} = g'(y) = (v3 - v2)*dy 
g(y) = (v3 - v2)*y + C 
f(x,y) = (v2 - v1)*x + (v3 - v2)*y + C 
f(0,0) = v1 = (v2 - v1)*0 + (v3 - v2)*0 + C = C 
f(x,y) = (v2 - v1)*x + (v3 - v2)*y + v1 

या v1 V2 और V3

f(x,y) = (1 - x)*v1 + (x - y)*v2 + y*v3 

के मामले में आप इसे नीचे में v4 के साथ ऊपर के रूप में, चार कोने के लिए एक वर्ग में क्या करना चाहते हैं पर x = 0 y = 1 छोड़ दिया , यहाँ शर्तें हैं: d/dx = (v2 - v1) (1 - y) + (v3 - v4) y, d/dy = (v3 - v2) x + (v4 - v1) (1 - x), f(0,0) = v1

d/dx = (v2 - v1) (1 - y) + (v3 - v4) y 
f(x,y) = (v2 - v1) (1 - y) x + (v3 - v4) y x + g(y) 
d/dy = (v3 - v2) x + (v4 - v1) (1 - x) = -(v2 - v1) x + (v3 - v4) x + g'(y) 
v3 - v2 + (v4 - v1)/x + v4 - v1 = -v2 + v1 + v3 - v4 + g'(y)/x 
(v4 - v1)/x + 2*(v4 - v1) = g'(y)/x 
g'(y) = (v4 - v1) + 2 x (v4 - v1) 
g(y) = (v4 - v1) (1 + 2 x) y + C 
f(x,y) = (v2 - v1) (1 - y) x + (v3 - v4) y x + (v4 - v1) (1 + 2 x) y + C 
f(0,0) = (v2 - v1) (1 - 0) 0 + (v3 - v4) 0 0 + (v4 - v1) (1 + 2 0) 0 + C = v1 
f(x,y) = (v2 - v1) (1 - y) x + (v3 - v4) y x + (v4 - v1) (1 + 2 x) y + v1 
+0

तो यह मानते हुए कि यह सही मूल्य प्राप्त करेगा, मुझे उन बिंदुओं के लिए भी खाता होना होगा जो ऊपरी दाएं त्रिकोण में नहीं होंगे, और इसके बजाय वर्ग के निचले बाएं भाग में होंगे। तो मुझे भी v4 की आवश्यकता है।मैंने कोशिश की - 'अगर (x> y) // यदि बिंदु ऊपरी दाएं त्रिकोण में है वापसी (1 - x) * v1 + (x-y) * v2 + y * v3; अन्य // यदि बिंदु निचले बाएं त्रिकोण में है वापसी (1 - x) * v1 + (x - y) * v4 + y * v3; ' लेकिन यह – Frobot

+0

काम नहीं कर रहा है किस प्रकार का ढाल/है/यह है कि आप उत्पन्न करने की कोशिश कर रहे हैं? यदि आप इसे वर्ग के आधार पर करना चाहते हैं तो यह थोड़ा अधिक जटिल है क्योंकि 'd/dx = (v2 - v1) (1 - y) + (v3 - v4) y' और' d/dy = (v3 - v2) एक्स + (v4 - v1) (1 - x) '। यह अभी भी संभव है। – Dan

+0

यह सुनिश्चित नहीं है कि आप क्या पूछ रहे हैं, लेकिन यह एक चिकना शोर समारोह है जिसे मैं बना रहा हूं। मैंने इसे पूर्ण वर्ग का उपयोग करके काम किया है और बिर्लिनर इंटरपोलेशन कर रहा है, जो कि पर्लिन शोर के समान है, लेकिन मैं इसे वर्गों के बजाय त्रिभुज का उपयोग करके काम करने की कोशिश कर रहा हूं। – Frobot

0

यहाँ निकटतम-पड़ोसी के लिए कुछ स्यूडोकोड है:

if(dist(p, p1) <= dist(p, p2) && dist(p, p1) <= dist(p, p3)) 
    return val(p1) 
if(dist(p, p2) <= dist(p, p3) && dist(p, p2) <= dist(p, p1)) 
    return val(p2) 
if(dist(p, p3) <= dist(p, p1) && dist(p, p3) <= dist(p, p2)) 
    return val(p3) 

मैं यह भी एक voronoi आरेख

+0

मुझे रैखिक इंटरपोलेशन के कुछ रूप की आवश्यकता है क्योंकि निकटतम पड़ोसी सिर्फ – Frobot

+0

रंगों के बड़े वर्गों का उत्पादन नहीं करेगा। स्क्वायर स्थानों पर नमूना बिंदुओं का उपयोग करते समय यह केवल वर्ग उत्पन्न करेगा, और आपने त्रिकोण निर्दिष्ट किए हैं। – rsaxvc

+0

क्षमा करें मेरा मतलब है कि यह बड़े ठोस रंगीन त्रिकोण बना देगा * – Frobot

3

आप barycentric निर्देशांक का उपयोग करना चाहिए। CodePlea - Interpolating in a Triangle

असल में, वजन इस तरह देख खत्म हो जाएगा:: वहाँ एक बहुत ही गहन लेख है कि यहाँ भी वैकल्पिक समाधान पर चर्चा करता है और यही कारण है barycentric निर्देशांक सबसे अच्छा कर रहे हैं

enter image description here

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