2012-05-23 24 views
5

पर अंतरंग CGGaths का संयोजन संयोजन मुझे एक ऐप में समस्या है जिस पर मैं काम कर रहा हूं। मान लें कि मेरे पास दो सीजीपैथ हैं जो काफी जटिल हैं और मैं उन्हें दोनों को CGMutablePath (जैसे उन्हें संयोजित) में जोड़ता हूं। खैर, जहां दो पथ छेड़छाड़ करेंगे, एक दूसरे के अंदर अंक होंगे। मैं उन बिंदुओं को खत्म करना चाहता हूं और अनिवार्य रूप से पथ के बाहरी या रूपरेखा को आकर्षित करना चाहता हूं। मुझे यह पता लगाने में कठिनाई हो रही है कि मैं इसके बारे में कैसे जाऊंगा।आईओएस

संपादित करें: यहाँ मैं क्या बात कर रहा हूँ का एक उदाहरण है। नीले और लाल बक्से CGPaths के साथ बिंदुओं का प्रतिनिधित्व करते हैं। लाल बक्से वे बिंदु हैं जो दोनों पथों के भीतर हैं। मैं किसी भी तरह से लाल बिंदुओं को खत्म करना चाहता हूं और पथ की रूपरेखा को फिर से तैयार करना चाहता हूं। बहुभुज समस्या में

enter image description here

+0

क्या आपका मतलब है कि आप पथ के संघ की गणना करना चाहते हैं? या फिर आप रास्तों में से [सममित अंतर] (http://en.wikipedia.org/wiki/Symmetric_difference) करना चाहते हैं? –

+0

@robmayoff मैं अपने प्रश्न संपादित किया है उम्मीद है कि स्पष्ट करने के लिए मैं क्या करने की कोशिश कर रहा हूँ। – daveMac

+0

@ डेवमैक: आप संदर्भित कर सकते हैं: - http://stackoverflow.com/questions/23497703/union-uibezierpaths-rather-than-apend-path/41179791#41179791 – Shrawan

उत्तर

1

क्लासिक बिंदु। प्रत्येक बहुभुज कि वापसी 1 अन्य बहुभुज संदर्भित में सभी निकालें:

int pnpoly(int npol, float *xp, float *yp, float x, float y) 
{ 
    int i, j, c = 0; 
    for (i = 0, j = npol-1; i < npol; j = i++) { 
    if ((((yp[i] <= y) && (y < yp[j])) || 
     ((yp[j] <= y) && (y < yp[i]))) && 
     (x < (xp[j] - xp[i]) * (y - yp[i])/(yp[j] - yp[i]) + xp[i])) 
     c = !c; 
    } 
    return c; 
} 

हटा अंकों के साथ दो रास्तों को संयुक्त करें। पूरी प्रक्रिया के लिए

छद्म कोड:

define starPoly with 10 points 
define simplePoly with 7 points 

for each point in starPoly 
    if (pnpoly(7, simplePoly.Xs[], simplePoly.Ys[], point.x, point.y) == 0) 
     clipedStarPoly += point; 

for each point in simplePoly 
    if (pnpoly(10, starPoly.Xs[], starPoly.Ys[], point.x, point.y) == 0) 
     clipedSimplePoly += point; 

for each point in clipedStarPoly 
    solutionPoly += point; 

for each point in clipedSimplePoly 
    solutionPoly += point; 

solutionPoly += solutionPoly.point[0] 

आपको नहीं लगता कि आप काटा polys आप बस बिंदु परीक्षण से बाहर सीधे समाधान पाली निर्माण कर सकते हैं के अंतिम बिंदुओं के साथ खेलने के लिए होगा रहे हैं तो।

आप, पाली की परीक्षा में बिंदु के लिए अनुरेखण रे का उपयोग इस page

+0

इस बारे में थोड़ा स्पष्टीकरण कैसे है कि इसका उपयोग कैसे किया जाए, इसका उपयोग कहां करें, और यह क्या कर रहा है। – daveMac

+0

हे डेव, क्या वह पर्याप्त स्पष्टीकरण है? – gjpc

+0

मुझे लगता है कि मैं बहुत अच्छी तरह समझता हूं। मुझे पता है कि सिर्फ छद्म कोड है लेकिन मुझे लगता है कि यह वास्तव में CGPaths का उपयोग करके एक कार्य उदाहरण देखने में मदद करेगा। – daveMac

1

उपयोग CGPathAddPath में देखने का प्रयास कर सकते हैं। उपयोग करने के लिए सुपर आसान है।

3

जो आप वर्णन कर रहे हैं वह पथ के अंदरूनी हिस्सों का संघ है।

यदि आपके पथ में वक्र हैं, तो यह एक कठिन समस्या है।

हालांकि, आपका उदाहरण केवल सीधी रेखा खंड दिखाता है, इसलिए मैं आपको केवल उन पथों की परवाह करता हूं जिनमें सीधे सीधी रेखा खंड होते हैं।

उस स्थिति में, आप बहुभुज संघ समारोह चाहते हैं। इस तरह के एल्गोरिदम क्षेत्र में काफी बुनियादी है जिसे "कम्प्यूटेशनल ज्यामिति" कहा जाता है। मैं बहुभुज संघ के किसी भी उद्देश्य-सी-विशिष्ट कार्यान्वयन के बारे में नहीं जानता। आप एक शुद्ध सी पुस्तकालय खोजने में सक्षम हो सकते हैं, लेकिन सी ++ लाइब्रेरी को ढूंढना बहुत आसान है। यदि आप अपना फ़ाइल एक्सटेंशन .m से .mm पर बदलते हैं तो आप C++ का उपयोग कर सकते हैं। यहाँ कुछ सी ++ पुस्तकालयों कि बहुभुज की संघ की गणना कर सकते हैं:

ध्यान दें कि सभी मामलों में, आपको निकालने के लिए CGPathApply का उपयोग करना होगा आपके पथ के शिखर, यदि आपके पास पहले से ही किसी अन्य प्रारूप में नहीं है।

0

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

हम दोनों बहुभुजों को ए और बी होने पर विचार करेंगे। इससे कोई फर्क नहीं पड़ता कि कौन सा है। बहुभुज के आसपास

  • ले जाएँ एक किसी भी बिंदु है कि बहुभुज बी
  • अंदर नहीं है बहुभुज के लिए इस बिंदु जोड़े की तलाश में।
  • बहुभुज के आसपास जारी रखें, परीक्षण और बदले में प्रत्येक बिंदु जोड़ने।
  • जब आप पॉलीगॉन बी के अंदर एक बिंदु खोजते हैं, तो उसके और पिछले बिंदु के बीच की रेखा देखें।
  • बहुभुज बी पर जो लाइन इस लाइन के साथ काटती है जानकारी प्राप्त करें।
  • इन दो पंक्तियों के बीच चौराहे के बिंदु का निर्धारण करें और इसे बहुभुज में जोड़ें।
  • पॉलीगॉन बी से संबंधित अंतरंग रेखा को परिभाषित करने वाले दो बिंदुओं में से कौन सा पॉलीगॉन ए के अंदर नहीं है और इसे नए बहुभुज में जोड़ें।
  • निर्धारित करें कि बहुभुज बी के आसपास कौन सी दिशा आपको जाने की आवश्यकता है ताकि अगला बिंदु छेड़छाड़ की रेखा के दूसरे छोर पर एक न हो और इसे जोड़ सके।
  • 3 से दोहराएँ, बहुभुज के बजाय बहुभुज बी का उपयोग कर एक
  • जारी रखें जब तक आप बिंदु से शुरू कर दिया, आवश्यक के रूप में बहुभुज के बीच अदला-बदली तक पहुंच को छोड़कर।

ध्यान दें कि यह समाधान सीधे तरफा बहुभुज के लिए ही स्वीकार्य है। जहां एक बेज़ियर पथ का संबंध है, यह चौराहे के अंक की गणना करने के एक बहुत अधिक मुश्किल हो जाता है, सीधी रेखा घटकों के साथ तेज कोनों के साथ चिकनी कोनों, या घटता के संयोजन की जटिलताओं का उल्लेख नहीं।