मेरे पास एक कम्प्यूटेशनल ज्यामिति समस्या है जो मुझे लगता है कि अपेक्षाकृत सरल समाधान होना चाहिए, लेकिन मैं इसे काफी समझ नहीं सकता।लाइन सेगमेंट के संग्रह के गैर-उत्तल ढक्कन का निर्धारण
मुझे कई रेखा खंडों द्वारा परिभाषित क्षेत्र की गैर-उत्तल रूपरेखा निर्धारित करने की आवश्यकता है।
मुझे विभिन्न गैर-संवहनी हल एल्गोरिदम (उदा। अल्फा आकार) के बारे में पता है, लेकिन मुझे पूरी तरह से सामान्य एल्गोरिदम की आवश्यकता नहीं है, क्योंकि रेखा खंड अधिकांश मामलों में एक अद्वितीय समाधान को परिभाषित करते हैं।
जैसा कि @ जीन-फ्रैंकोइसकोर्बेट ने इंगित किया है, ऐसे मामले हैं जहां कई समाधान हैं। मुझे स्पष्ट रूप से मेरी परिभाषा के बारे में और सोचने की जरूरत है।
हालांकि, मैं जो करने की कोशिश कर रहा हूं वह रिवर्स-इंजीनियर है और एक मालिकाना फ़ाइल प्रारूप का उपयोग करें ताकि मैं अपने और दूसरों द्वारा एकत्र किए गए डेटा पर मूल विश्लेषण चला सकूं। फ़ाइल प्रारूप काफी सरल है, लेकिन सीमा को परिभाषित करने के लिए उपयोग किए जाने वाले एल्गोरिदम का निर्धारण करना काफी कठिन है।
किनारे के कई मामलों में डालकर जिसके परिणामस्वरूप एक गैर-अद्वितीय समाधान होता है, सॉफ़्टवेयर प्रश्न के बिना या तो चेतावनी के बिना दुर्घटनाग्रस्त हो जाता है या चुपचाप फ़ाइल को पढ़ने में विफल रहता है।
इसलिए, जब कई समाधान होते हैं, या तो स्वीकार्य समाधानों में से एक उत्पन्न करते हैं या यह निर्धारित करने में सक्षम होते हैं कि कई समाधान स्वीकार्य होंगे।
समस्या परिभाषा:
बहुभुज की रूपरेखा क्षेत्रों में से किसी को कभी पार नहीं करना चाहिए और सेगमेंट 'अंतिम बिंदुओं के सभी शामिल होने लाइनों के गठन किया जाना चाहिए। सभी खंडों को बहुभुज की सीमा के अंदर या पूरी तरह से झूठ बोलना चाहिए। आउटलाइन में एक से अधिक अंतराल का उपयोग नहीं किया जा सकता है (पॉलीगॉन को बंद करने की आवश्यकता वाले सॉफ़्टवेयर पुस्तकालयों के अंत में पहला बिंदु जोड़कर पॉलीगॉन को "बंद करना" को अनदेखा करना।)।
ऐसे मामलों में जहां इस मानदंड को पूरा करने वाले कई समाधान हैं, तो इनमें से कोई भी समाधान स्वीकार्य होगा। (यह निर्धारित करने के लिए जब समाधान में गैर-अद्वितीय है सक्षम होने के लिए अच्छा होगा, लेकिन इस सख्ती से आवश्यक नहीं है।)
उदाहरण:
एक उदाहरण के रूप में, मैं इन पंक्तियों के साथ कुछ है :
और मैं निम्नलिखित क्षेत्र चित्रित करने के लिए करना चाहते हैं:
यह भी न काटने वाली वर्गों के लिए काम करना चाहिए। जैसे
मुझे लगता है कि (?) नहीं है या तो मामले में एक अनूठा समाधान, मापदंड रूपरेखा पहले के अधीन है। (संपादित करें: सामान्य रूप से एक अनूठा समाधान नहीं है, क्योंकि @ जीन-फ्रैंकोइसकोर्बेट ने बताया। हालांकि, मुझे अभी भी एक एल्गोरिदम में दिलचस्पी है जो या तो स्वीकार्य समाधानों में से एक उत्पन्न करेगा।)
परीक्षण मामलों
एक टेस्ट केस के लिए, यहाँ कोड उपरोक्त आंकड़े उत्पन्न करने के लिए है। मैं यहां अजगर का उपयोग कर रहा हूं, लेकिन सवाल भाषा-अज्ञेयवादी है।
import matplotlib.pyplot as plt
def main():
test1()
test2()
plt.show()
def test1():
"""Intersecting segments."""
segments = [[(1, 1), (1, 3)],
[(3.7, 1), (2, 4)],
[(2, 0), (3.7, 3)],
[(4, 0), (4, 4)],
[(4.3, 1), (4.3, 3)],
[(0, 2), (6, 3)]]
desired_outline = [segments[0][0], segments[5][0], segments[0][1],
segments[1][1], segments[2][1], segments[3][1],
segments[4][1], segments[5][1], segments[4][0],
segments[3][0], segments[1][0], segments[2][0],
segments[0][0]]
plot(segments, desired_outline)
def test2():
"""Non-intersecting segments."""
segments = [[(0, 1), (0, 3)],
[(1, 0), (1, 4)],
[(2, 1), (2, 3)],
[(3, 0), (3, 4)]]
desired_outline = [segments[0][0], segments[0][1], segments[1][1],
segments[2][1], segments[3][1], segments[3][0],
segments[2][0], segments[1][0], segments[0][0]]
plot(segments, desired_outline)
def plot(segments, desired_outline):
fig, ax = plt.subplots()
plot_segments(ax, segments)
ax.set_title('Segments')
fig, ax = plt.subplots()
ax.fill(*zip(*desired_outline), facecolor='gray')
plot_segments(ax, segments)
ax.set_title('Desired Outline')
def plot_segments(ax, segments):
for segment in segments:
ax.plot(*zip(*segment), marker='o', linestyle='-')
xmin, xmax, ymin, ymax = ax.axis()
ax.axis([xmin - 0.5, xmax + 0.5, ymin - 0.5, ymax + 0.5])
if __name__ == '__main__':
main()
कोई विचार?
मुझे लगता है कि सॉफ्टवेयर है जिसका नतीजा रहा पुन: पेश करने की कोशिश कर रहा हूँ प्रणाली की "आंतरिक" समन्वय किसी प्रकार में एक रेडियल स्वीप एल्गोरिथ्म का उपयोग करता है (जैसे एक x-prime
और y-prime
बढ़ाया के साथ समन्वय प्रणाली और साथ घुमाया शुरुआत कर रहा हूँ अंक के प्रसार से परिभाषित मूल अक्ष। इससे समस्या अधिक "परिपत्र" बन जाती है।) हालांकि, यह समाधान उत्पन्न करता है जहां कई मामलों में रूपरेखा रेखा खंडों को छेड़छाड़ करती है। यह पता लगाने के लिए काफी आसान है और वहां से बलपूर्वक मजबूर है, लेकिन निश्चित रूप से एक बेहतर तरीका है?
जब आप कहते हैं कि "बार विशिष्ट रूप से समाधान को परिभाषित करते हैं" क्या आपका मतलब है कि सलाखों को अंतिम बहुभुज के अंदर सभी झूठ बोलना चाहिए? –
हां! मुझे उस जानकारी में जोड़ा जाना चाहिए था। धन्यवाद! –
मार्क डी बर्ग और सीजीएएल लाइब्रेरी द्वारा "कम्प्यूटेशनल जियोमेट्री" पुस्तक देखें, मुझे लगता है कि आपको एक कुशल एल्गोरिदम मिलेगा। – mitch