2011-10-14 9 views
5

मैं जीडीआई + का उपयोग कर कस्टम ड्राइंग कर रहा हूं।ग्राफिक्स के लिए वैकल्पिक .caleTransform

आम तौर पर अगर मैं फिट करने के लिए जो कुछ भी मैं खिड़की के लिए ड्राइंग हूँ चाहता हूँ, मुझे उचित अनुपात की गणना और मुझे लगता है कि अनुपात से सब कुछ ScaleTransform:

e.Graphics.ScaleTransform(ratio, ratio); 

ScaleTransform के साथ समस्या यह कलम स्ट्रोक सहित सब कुछ मापता है कि है और ब्रश।

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

उत्तर

1

आप GDI ग्राफिक्स वस्तु लपेट और सौभाग्य पैमाने कारक

interface IDrawing 
{ 
    void Scale(float sx, float sy); 
    void Translate(float dx, float dy); 
    void SetPen(Color col, float thickness); 
    void DrawLine(Point from, Point to); 
    // ... more methods 
} 

class GdiPlusDrawing : IDrawing 
{ 
    private float scale; 
    private Graphics graphics; 
    private Pen pen; 

    public GdiPlusDrawing(Graphics g) 
    { 
     float scale = 1.0f; 
    } 

    public void Scale(float s) 
    { 
     scale *= s; 
     graphics.ScaleTransform(s,s); 
    } 

    public void SetPen(Color color, float thickness) 
    { 
     // Use scale to compensate pen thickness. 
     float penThickness = thickness/scale; 
     pen = new Pen(color, penThickness); // Note, need to dispose. 
    } 

    // Implement rest of IDrawing 
} 
+2

ध्यान दें कि यदि आप केवल स्केलिंग से बचना चाहते हैं क्योंकि आप पतली (1 पिक्सेल) लाइनें चाहते हैं, तो आप पैमाने की परवाह किए बिना एक पिक्सेल लाइन को मजबूर करने के लिए -1 की मोटाई के साथ आकर्षित कर सकते हैं। –

1

मुझे लगता है कि ScaleTransform जीडीआई संदर्भ से संबंधित प्रत्येक संख्यात्मक मूल्य पर काम करता है, इसलिए आप इसे दुर्भाग्य से निर्देशांक के लिए उपयोग नहीं कर सकते हैं। डब्ल्यूपीएफ में GeometryTransform है लेकिन मुझे जीडीआई + में इसके समतुल्य के बारे में पता नहीं है।

आप कोड दोहराव के बारे में चिंतित हैं, तो आप हमेशा एक निश्चित पैमाने स्तर उनके अंक के लिए लागू के साथ आकार आकर्षित करने के लिए एक उपयोगिता विधि लिख सकते हैं।

आप किसी भी ऑब्जेक्ट को इसके विपरीत लागू करने से ScaleTransform मैन्युअल रूप से उलटाने का प्रयास कर सकते हैं, जिसे आप स्केल नहीं करना चाहते हैं; मुझे पता है कि कुछ ब्रश इस विधि का पर्दाफाश करते हैं।

2

पहले एक GraphicsPath उदाहरण में अपने सभी वस्तुओं डाल की कोशिश करो। इसमें ScaleTransform विधि नहीं है लेकिन आप वस्तुओं को GraphicsPath.Transform से बदल सकते हैं। आप Matrix.Scale के माध्यम से स्केलिंग मैट्रिक्स पास कर सकते हैं।

+0

है जैसे कि यह काम हो सकता है लेकिन एक GraphicsPath एक छवि आकर्षित नहीं कर सकते हैं और छवियों मुख्य बातों मैं छोटा नहीं करना चाहते से एक हैं लगता है। –

0

स्टोर कर सकते हैं, पेन एक स्थानीय ScaleTransform जिसके द्वारा उलटा rescaling वैश्विक बदलने के लिए क्षतिपूर्ति करने में किया जा सकता है। पेन। रीसेट ट्रान्सफॉर्म अगली से पहले प्रत्येक रिस्कलिंग का उपयोग करने के बाद, या वर्तमान पेन स्केलिंग (ग्राफिक्स संदर्भ से स्वतंत्र) लगभग कुछ भी नहीं (वास्तव में, एक पिक्सेल), चंद्रमा को शूट कर सकते हैं, या मिडवे पॉइंट कर सकते हैं।

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