2010-08-30 12 views
10

मैं विशेष मामले में भाग गया जहां मुझे (x0, y0) (x1, y1) के माध्यम से (x1, y1) के माध्यम से 2 डी ग्रिड में अल्ट्रा सममित रेखा या किरण का उत्पादन करने की आवश्यकता है:अल्ट्रा सममित रेखा एल्गोरिदम?

void drawSymmetricalLine(int x0, int y0, int x1, int y1) 
{ 
    // loop and handle each (x, y)... 
} 

वास्तविक समस्या उन बिंदुओं में निहित है जहां लोकप्रिय रेखा ड्राइंग एल्गोरिदम दोनों निर्देशांक (दूसरे को नीचे x के रूप में चिह्नित नहीं) खींचते हैं क्योंकि यह मोटा लगता है, जो मेरे मामले में वांछित है। प्रदर्शन भी महत्वपूर्ण नहीं है लेकिन सादगी है।

यहां मेरा मतलब है अल्ट्रा सममित रेखाओं के रूप में:

ox ooo 
oo  ooo 


o o 
o o 
    o o 
     o 

उत्तर

4

आप शायद Bresenham's line algorithm का उपयोग करें और यह थोड़ा तो संशोधित कर सकते हैं जब कदम परिवर्तन एक से दूसरे पंक्ति से ड्रॉ स्थिति बदलने के लिए आप दोनों से पहले रंग:

यहाँ मैं अति सममित लाइनों के रूप में मतलब है और वर्तमान एक्स-अक्ष के लिए वाई-अक्ष पर पिक्सल के बाद।

1

यदि प्रदर्शन पर सादगी को प्राथमिकता दी जाती है, तो एक रिकर्सिव एल्गोरिदम लिखें। प्रत्येक चरण गणना डीएक्स = एक्स 1-एक्स 0 और डीवाई = वाई 1-वाई 0 पर।

डीएक्स = 0 या डीवाई = 0 (जिस स्थिति में आपकी रेखा लंबवत या क्षैतिज है) रिकर्सन रोकें।

अन्यथा, डीएक्स और डीवाई की समानता के अनुसार, दो "मध्यम" अंत-बिंदुओं की गणना करें, और दो आधा रेखाओं को दोबारा खींचें।

0

Bresenham's line algorithm का उपयोग करें, जब आप एक बिंदु (x0 + dx, y0 + dy) पर एक बिंदु प्लॉट करते हैं, तो भी एक बिंदु (x1-dx, y1-dy) पर प्लॉट करें। इस तरह आप सुनिश्चित करते हैं कि यह दोनों तरफ से सममित है।

यह थोड़ा अक्षम है, लेकिन आपने कहा कि इससे कोई फर्क नहीं पड़ता।

2

लाइन को दो बार प्रस्तुत करें, एक बार पी 0 से पी 1 तक और फिर पी 1 से पी 0 तक।

+0

यह वही है जो मैं गेम में दृष्टि की सममित रेखा के लिए करता हूं। – Madmenyo

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