मैं एक आयत एक अवतल बहुभुज काटती है, तो खोजने की कोशिश कर रहा हूँ। इस एल्गोरिथ्म को पूरा करता है?

वोट
7

मैं एक आयत एक अवतल बहुभुज काटती है, तो खोजने की कोशिश कर रहा हूँ। मैं इस एल्गोरिथ्म पाया:

double determinant(Vector2D vec1, Vector2D vec2){
    return vec1.x*vec2.y-vec1.y*vec2.x;
}

//one edge is a-b, the other is c-d
Vector2D edgeIntersection(Vector2D a, Vector2D b, Vector2D c, Vector2D d){
    double det=determinant(b-a,c-d);
    double t=determinant(c-a,c-d)/det;
    double u=determinant(b-a,c-a)/det;
    if ((t<0)||(u<0)||(t>1)||(u>1))return NO_INTERSECTION;
    return a*(1-t)+t*b;
}

यदि मैं यह 4 बार * (मेरे बहुभुज के सभी किनारे) (ठीक है, नीचे बाईं ओर ऊपर, नीचे सही करने के लिए शीर्ष, सही करने के लिए नीचे करने के लिए शीर्ष) प्रदर्शन इस प्रभावी ढंग से और सही ढंग से मुझे बताओ होगा अगर आयत का हिस्सा या सभी अवतल है बहुभुज के अंदर? यदि नहीं क्या याद आ रही होगी?

धन्यवाद

11/08/2010 को 23:05
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
2

मुझे लगता है कि निम्नलिखित काम करना चाहिए:

(1) for each e1 in rectangle_edges, e2 in polygon_edges
    (1.1) if edgeIntersection(e1,e2) != NO_INTERSECTION
        (1.1.1) return true
(2) if (max_polygon_x < max_rectangle_x) and (min_polygon_x > min_rectangle_x) and (max_polygon_y < max_rectangle_y) and (min_polygon_y > min_rectangle_y)
    (2.1) return true
(2) return false

संपादित करें : चाहे बहुभुज आयत के अंदर है के लिए चेक जोड़ा गया।

11/08/2010 को 23:12
का स्रोत उपयोगकर्ता

वोट
13

एबी और सीडी - कोड दो खंडों के चौराहे बिंदु को खोजने के लिए प्रयास करता है।

वहाँ समझाने के लिए कि यह कैसे यह कर रहा है, आप कैसे इन आपरेशनों की व्याख्या के आधार पर कई अलग अलग तरीके हैं।

मान लीजिए कि बिंदु A निर्देशांक करते हैं (Xa, फिर), बी - (XB, वाई बी) और इतने पर। हम कहते हैं

dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc

दो रेखीय समीकरण निम्नलिखित प्रणाली

| dxAB dxCD |   | t |   | xc-xa |
|           | * |   | = |       |
| dyAB dyCD |   | u |   | yc-ya |

अगर के लिए हल tऔर u, आप प्रतिच्छेदन बिंदु रेखा एबी (मूल्य पर की आनुपातिक स्थिति दे देंगे t) और लाइन सीडी (मूल्य पर u)। इन मूल्यों की रेंज में झूठ होगा [0, 1]अगर बिंदु (खंड युक्त लाइन पर) खंड के बाहर स्थित बिंदु इसी खंड के लिए और कहा कि सीमा के बाहर अंतर्गत आता है, तो।

हम अच्छी तरह से ज्ञात का उपयोग कर सकते रेखीय समीकरण की इस प्रणाली हल करने के लिए क्रेमर के शासन । ऐसी स्थिति में हमने की निर्धारक की आवश्यकता होगी

| dxAB dxCD |
|           |
| dyAB dyCD |

जो वास्तव में determinant(b - a, c - d)अपने कोड से। (वास्तव में, क्या मैं यहाँ है determinant(b - a, d - c), लेकिन यह इस स्पष्टीकरण के प्रयोजनों के लिए वास्तव में महत्वपूर्ण नहीं है। कोड आप किसी कारण से तैनात सी और डी, नीचे पुनश्च नोट दिखाई स्वैप)।

और हम भी की निर्धारक की आवश्यकता होगी

| xc-xa dxCD |
|            |
| yc-ya dyCD |

जो वास्तव में determinant(c-a,c-d)अपने कोड से, और के निर्धारक

| dxAB xc-xa |
|            |
| dyAB yc-ya |

जो वास्तव में है determinant(b-a,c-a)

क्रेमर के शासन के अनुसार इन निर्धारकों डिवाइडिंग हम में से मूल्यों दे देंगे tऔर uहै, जो वास्तव में क्या कोड आप पोस्ट में किया जाता है।

कोड तो के मूल्यों का परीक्षण के लिए आगे बढ़ता tहै और uयदि खंडों वास्तव में एक दूसरे को काटना जाँच, दोनों चाहे यानी करने के लिए tऔर uके हैं [0, 1]सीमा होती है। और अगर वे करते हैं, यह वास्तविक प्रतिच्छेदन बिंदु मूल्यांकन द्वारा गणना करता है a*t+b*(1-t)(समतुल्य रूप में, यह मूल्यांकन कर सकता है c*u+d*(1-u))। (फिर से, नीचे पुनश्च टिप्पणी देखें)।

पुनश्च मूल कोड अंक डी और सी में "बदली" कर रहे हैं एक भावना है कि कोड करता है c - d, जहां मैं क्या d - cमेरी व्याख्या में। लेकिन इस एक के संकेत के साथ सावधान के रूप में रूप में लंबे समय एल्गोरिथ्म के सामान्य विचार के लिए कोई फर्क नहीं पड़ता,।

सी और डी बिंदु के इस अदला-बदली भी कारण है a*(1-t)+t*bअभिव्यक्ति जब प्रतिच्छेदन बिंदु का मूल्यांकन किया जाता है। आम तौर पर, मेरी व्याख्या के रूप में, की तरह कुछ देखने की उम्मीद one'd a*t+b*(1-t)वहाँ। (मैं हालांकि इस बारे में मेरे शक है। मैं देखने की अपेक्षा करेंगे a*t+b*(1-t)यहां तक कि अपने संस्करण में वहाँ। एक बग हो सकता है।)

पी पी एस लेखक कोड के लिए जाँच करने के लिए भूल गए हैं det == 0(या बहुत करीब 0), जिस स्थिति में होगा जब खंडों समानांतर हैं।

11/08/2010 को 23:30
का स्रोत उपयोगकर्ता

वोट
0

जहाँ तक मेरा एक नज़र के बाद बता सकते हैं, यह निर्धारित करने के लिए करता है, तो 2 रेखा खंड एक दूसरे को काटना कोशिश करता है, और अगर वे करते हैं, क्या चौराहे बिंदु के निर्देशांक हैं।

नहीं, यह काफी अच्छा निर्धारित करें कि आपका आयत और अपने बहुभुज एक दूसरे को काटना, क्योंकि आप अभी भी इस मामले में जहां या तो बहुभुज आयत, या दूसरी तरह के आसपास के अंदर पूरी तरह से है याद आती है चाहता हूँ नहीं है।

11/08/2010 को 23:56
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more