2012-04-27 99 views
31

एसवीजी (और कैनवास, क्वार्ट्ज, पोस्टस्क्रिप्ट, ...) में स्ट्रोक चौड़ाई प्रतिरक्षा कैसे करें, रूपांतरण मैट्रिक्स पथ समन्वय और रेखा चौड़ाई दोनों को प्रभावित करता है। क्या समायोजन करने का कोई तरीका है ताकि रेखा चौड़ाई प्रभावित न हो? उदाहरण के लिए, एक्स और वाई के लिए स्केल अलग है, जो स्क्वायर को एक आयताकार बनाता है, जो ठीक है, लेकिन यह लाइनों को दोनों तरफ व्यापक बनाता है।वर्तमान परिवर्तन मैट्रिक्स

<g transform="rotate(30) scale(5,1) "> 
     <rect x="10" y="10" width="20" height="20" 
      stroke="blue" fill="none" stroke-width="2"/> 
    </g> 

rectangle width scaled pen

मैं देख सकता हूँ कि कई मामलों में उपयोगी होगा, लेकिन वहाँ एक तरह से यह से बाहर निकलना है? मुझे लगता है कि मैं एक अलग पेन टीएम रखना चाहता हूं या कलम को एक अंडाकार होने में सक्षम होना चाहता हूं कि सीटीएम एक सर्कल में परिवर्तित हो जाता है, लेकिन मुझे ऐसा कुछ नहीं दिख रहा है।

मुझे लगता है कि मुझे अपने सीटीएम के बारे में एसवीजी नहीं कहना है और इसके बजाय निर्देशांक स्वयं को बदलना है, जिसका अर्थ है rect जैसे प्राइमेटिव्स को उनके path समकक्षों में परिवर्तित करना।

+1

डुप्लिकेट: http://stackoverflow.com/questions/10160262/draw-a-line-that-doesnt-get-thicker-when-image-stretches –

उत्तर

38

संपादित करें:

वहाँ एक विशेषता है कि आप अपने रेक्ट को जोड़ सकते हैं वास्तव में इस व्यवहार प्राप्त करने के लिए है:

vector-effect="non-scaling-stroke" 

यह गलत था:

यह अगर काम करेंगे आप ट्रांसफॉर्म को सीधे आकार में लागू करें, न कि समूह में। इसमें बेशक, यदि आप कई वस्तुओं को समूहबद्ध करना चाहते हैं और उन्हें एक साथ स्केल करना चाहते हैं, तो वह दृष्टिकोण काम नहीं करेगा।

<rect x="10" y="10" width="20" height="20" 
      stroke="blue" fill="none" stroke-width="2" 
      transform="rotate(30) scale(5,1)"/> 

यह आपके एसवीजी दर्शक पर भी निर्भर हो सकता है; इंकस्केप आपकी फ़ाइल को जिस तरीके से आप चाहते हैं (स्ट्रोक चौड़ाई पैमाने पर प्रभावित नहीं होती है) लेकिन क्रोम इसे दिखाता है जैसा आपने दिखाया है।

+0

दिलचस्प है, लेकिन मुझे लगता है कि क्रोम सही है। एसवीजी (1.1) स्पेक का कहना है कि ट्रांसफॉर्म एट्रिब्यूट पहले लागू होता है और xan

+0

हां, मुझे लगता है कि आप सही हैं - और इसका मतलब है मेरा जवाब काम नहीं करेगा, क्योंकि मैंने इसे इंकस्केप में परीक्षण किया था और क्रोम नहीं। –

+4

ठीक है, मुझे एक बेहतर उत्तर मिला [यहां] (http://www.w3.org/TR/SVGTiny12/painting.html#NonScalingStroke)। –

6

पोस्टस्क्रिप्ट में, पथ का वर्णन करने और स्ट्रोक करने से अलग घटनाएं होती हैं, इसलिए अलग-अलग "पेन" टीएम होना पूरी तरह से संभव है।

%!PS 
%A Funky Shape 

matrix currentmatrix %save normal matrix for stroke pen 
306 396 translate 
72 72 scale 
1 1 5 { pop 
    360 5 div rotate 
    1 0 translate 
    0 0 moveto 
    1 1 5 { pop 
     360 5 div rotate 
     1 0 translate 
     1 0 lineto 
     -1 0 translate 
    } for 
    -1 0 translate 
    closepath 
} for 
setmatrix 
[ 1 -3 4 2 0 0 ] concat %put some skew in the pen 
10 rotate  %makes it look more "organic" 
stroke 
showpage