2015-06-01 8 views
5

ड्रॉ करता है मैं इस तरह के पायग पर लाइनों (कुछ प्रारंभ और अंत बिंदु दिए गए) को आकर्षित करता था: pygame.draw.line(window, color_L1, X0, X1, 2), जहां 2 लाइन की मोटाई को परिभाषित कर रहा था।पायगैम एंटी-एलाइज्ड मोटी लाइन

चूंकि एंटी-एलियासिंग .draw द्वारा समर्थित नहीं है, इसलिए मैं .gfxdraw और pygame.gfxdraw.line(window, X0[0], X0[1], X1[0], X1[1], color_L1) पर स्थानांतरित हो गया।

हालांकि, यह मुझे लाइन की मोटाई को परिभाषित करने की अनुमति नहीं देता है। मैं मोटाई और एंटी-एलियासिंग एक साथ कैसे हो सकता है?

+1

अपनी लाइन के अंत-बिंदुओं और चौड़ाई के आधार पर उचित ऑफ़सेट लाइनों को परिभाषित करें और वसा रेखा का प्रतिनिधित्व करने वाले बहुभुज को परिभाषित करने के लिए उनका उपयोग करें। फिर इसे आकर्षित करने के लिए 'pygame.gfxdraw.aapolygon()' का उपयोग करें। – martineau

+0

मेरी लाइन प्रत्येक चरण पर घूम रही है इसलिए मुझे बहुभुज के रूप में इसके सिरों को परिभाषित करने के लिए निश्चित नहीं है, + -1 इस मामले में काम नहीं करेगा। –

+1

जिस तरह से मैंने सुझाव दिया है वसा लाइनों को रेखांकित करना एक अपमानजनक बहुभुज को ऑफसेट करने का मामला है। आमतौर पर गणित की एक उचित राशि शामिल होती है। देखें [_ एल्गोरिदम inflating/deflating (ऑफसेटिंग, बफरिंग) polygons_] (http://stackoverflow.com/questions/1109536/an-algorithm-for-inflating-deflating-offsetting-buffering-polygons)। – martineau

उत्तर

5

कई परीक्षणों और त्रुटियों के बाद, इष्टतम तरीके से करना यह होगा निम्नलिखित:

1) सबसे पहले, हम आकार X0_ {दिया के केंद्र को परिभाषित एक्स, वाई} शुरू करें और एक्स 1_ {एक्स, वाई} लाइन के अंत बिंदु।

center_L1 = (X0 + X1)/2. 

2) फिर लाइन के ढलान (कोण) को ढूंढें।

length = 10 # Line size 
thickness = 2 
angle = math.atan2(X0[1] - X1[1], X0[0] - X1[0]) 

3) ढलान और आकार पैरामीटर का उपयोग करके आप बॉक्स के अंत के निम्नलिखित निर्देशांक की गणना कर सकते हैं।

UL = (center_L1[0] + (length/2.) * cos(angle) - (thickness/2.) * sin(angle), 
     center_L1[1] + (thickness/2.) * cos(angle) + (length/2.) * sin(angle)) 
UR = (center_L1[0] - (length/2.) * cos(angle) - (thickness/2.) * sin(angle), 
     center_L1[1] + (thickness/2.) * cos(angle) - (length/2.) * sin(angle)) 
BL = (center_L1[0] + (length/2.) * cos(angle) + (thickness/2.) * sin(angle), 
     center_L1[1] - (thickness/2.) * cos(angle) + (length/2.) * sin(angle)) 
BR = (center_L1[0] - (length/2.) * cos(angle) + (thickness/2.) * sin(angle), 
     center_L1[1] - (thickness/2.) * cos(angle) - (length/2.) * sin(angle)) 

4) गणना निर्देशांक का उपयोग करना हम एक विरोधी aliased बहुभुज (धन्यवाद @martineau) और फिर के रूप में gfxdraw वेबसाइट पर सुझाव इसे भरने आकर्षित।

pygame.gfxdraw.aapolygon(window, (UL, UR, BR, BL), color_L1) 
pygame.gfxdraw.filled_polygon(window, (UL, UR, BR, BL), color_L1) 
1

मैं एक भरे आयत का सुझाव दूंगा, जैसा कि यहां दिखाया गया है: https://www.pygame.org/docs/ref/gfxdraw.html#pygame.gfxdraw.rectangle

आपका कोड कुछ ऐसा दिखाई देगा:

thickLine = pygame.gfxdraw.rectangle(surface, rect, color) 

और फिर सतह को भरने के लिए याद है। यह की तर्ज पर है:

thickLine.fill() 
+0

बहुत बहुत धन्यवाद! मैंने कोशिश की कि साथ ही 'बॉक्स', लेकिन मुझे नहीं पता कि मैं कैसे शुरुआत और अंत को परिभाषित कर सकता हूं कि मेरे पास केवल शुरुआत और रेखा के अंत का निर्देशांक है। –

+0

समस्या इस तथ्य पर निहित है कि मेरी रेखा घूर्णन कर रही है, इसलिए एक सरल + -1 पर्याप्त नहीं है, क्योंकि आप एक स्थिर पक्ष के साथ समाप्त हो सकते हैं जो दूसरे छोर के घूर्णन का पालन नहीं करता है। –

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