मैं एक निजी परियोजना के रूप में प्रसिद्ध हेनलेन उपन्यास The Moon is a Harsh Mistress से लुना फ्री स्टेट ध्वज उत्पन्न करने के लिए एक पायथन कार्यक्रम लिख रहा हूं। मैं हेराल्ड्री नियमों को क्रोधित कर रहा हूं और वेब से गणितीय सूत्रों से मेल खाता हूं, लेकिन मेरे bendsinister
दिनचर्या में कुछ स्पष्ट रूप से गलत है, क्योंकि असम्बद्ध होने पर दावा विफल रहता है। मोड़ भयावह क्षेत्रफल ध्वज के कुल क्षेत्र 1/3 होना चाहिए, और यह नहीं है। मैंने जो किया है केवल एकमात्र वास्तव में डोजी चीज ट्राइपोज़ाइड की ऊंचाई के लिए सूत्र पर अनुमान लगाना है, लेकिन मुझे लगता है कि त्रुटियां कहीं भी हो सकती हैं। मैंने अधिकांश कोड को छीन लिया है, जिससे समस्या को दिखाने के लिए केवल जरूरी है। उम्मीद है कि कोई भी गणितीय रूप से चुनौतीपूर्ण त्रुटि को खोज सकता है!खराब गणित या खराब प्रोग्रामिंग, शायद दोनों?
#!/usr/bin/python
'generate bend sinister according to rules of heraldry'
import sys, os, random, math, Image, ImageDraw
FLAG = Image.new('RGB', (900, 600), 'black')
CANVAS = ImageDraw.Draw(FLAG)
DEBUGGING = True
def bendsinister(image = FLAG, draw = CANVAS):
'''a bend sinister covers 1/3 of the field, sinister chief to dexter base
(some sources on the web say 1/5 of the field, but we'll use 1/3)
the "field" in this case being the area of the flag, so we need to
find a trapezoid which is 1/6 the total area (width * height).
we need to return only the width of the diagonal, which is double
the height of the calculated trapezoid
'''
x, y = image.size
b = math.sqrt((x ** 2) + (y ** 2))
A = float(x * y)
debug('%d * %d = %d' % (x, y, A))
H = triangle_height(A/2, b) # height of triangular half of flag
width = trapezoid_height(b, H, A/6) * 2
if command == 'bendsinister':
show_bendsinister(x, y, width, image, draw)
return width
def show_bendsinister(x, y, width, image = FLAG, draw = CANVAS):
'for debugging formula'
dexter_base, sinister_chief = (0, y), (x, 0)
draw.line((dexter_base, sinister_chief), 'blue', int(width))
image.show()
debug(image.getcolors(2)) # should be twice as many black pixels as blue
def triangle_height(a, b):
'a=bh/2'
h = float(a)/(float(b)/2)
debug('triangle height: %.2f' % h)
return h
def trapezoid_height(b, H, a):
'''calculate trapezoid height (h) given the area (a) of the trapezoid and
base b, the longer base, when it is known that the trapezoid is a section
of a triangle of height H, such that the top, t, equals b when h=0 and
t=0 when h=H. h is therefore inversely proportional to t with the formula
t=(1-(h/H))*b, found simply by looking for what fit the two extremes.
the area of a trapezoid is simply the height times the average length of
the two bases, b and t, i.e.: a=h*((b+t)/2). the formula reduces
then to (2*a)/b=(2*h)+(h**2)/H, which is the quadratic equation
(1/H)*(h**2)+(2*h)-((2*a)/b)=0; solve for h using the quadratic formula
'''
try:
h = (-2 + math.sqrt(4 - 4 * (1.0/H) * -((2 * a)/b)))/(2 * (1.0/H))
debug('trapezoid height with plus: %.2f' % h)
except: # must be imaginary, so try minus instead
h = (-2 - math.sqrt(4 - 4 * (1.0/H) * -((2 * a)/b)))/(2 * (1.0/H))
debug('trapezoid height with minus: %.2f' % h)
t = (1 - (float(h)/H)) * b
debug('t=%d, a=%d, check=%d' % (t, round(a), round(h * ((b + t)/2))))
#assert round(a) == round(h * ((b + t)/2))
return h
def debug(message):
if DEBUGGING:
print >>sys.stderr, message
if __name__ == '__main__':
command = os.path.splitext(os.path.basename(sys.argv[0]))[0]
print eval(command)(*sys.argv[1:]) or ''
यहाँ, डिबगिंग आउटपुट है दिखा रहा अब तक 1/3 क्षेत्र से बंद कर रहा हूँ:
[email protected]:~/rentacoder/jcomeau/tanstaafl$ ./bendsinister.py 900 * 600 = 540000 triangle height: 499.23 trapezoid height with plus: 77.23 t=914, a=90000, check=77077 [(154427, (0, 0, 255)), (385573, (0, 0, 0))] 154.462354191
यहाँ, उत्पादन की एक छवि है कुछ अतिरिक्त लाइनों के साथ: लाल रेखा दो त्रिभुजों को विभाजित करती है, या तो ट्रैपेज़ॉयड की गणना के लिए उपयोग किया जा सकता है। मैं ऊपर बाईं ओर से शुरू एक का उपयोग कर रहा हूँ। हरे रंग की रेखा उस त्रिभुज की ऊंचाई है, कार्यक्रम में चर एच।
समाप्त लिपि और ध्वज (माइकल एंडरसन द्वारा प्रदान किए गए सुधार का उपयोग करके) के लिए http://unternet.net/tanstaafl/ देखें। आप सब का सहायता के लिए धन्यवाद!
शायद यह [कोड समीक्षा] (http://codereview.stackexchange.com/) के लिए बेहतर है? –
@ टिम, आप ऐसा क्यों सोचते हैं? यह एक प्रोग्रामिंग समस्या है जिसे मैं हल करने की कोशिश कर रहा हूं, ऐसा कुछ नहीं जो काम करता है और मैं सुधार करने की कोशिश कर रहा हूं। –
अभी तक उत्तर की कमी और नज़दीकी वोट (मेरे द्वारा नहीं) के आधार पर बस एक झटका है। –