2015-11-29 13 views
5

मेरा लक्ष्य एक चक्र के किनारे के चारों ओर यादृच्छिक अंतराल और एक प्रारंभिक बिंदु (सर्कल के बीच) का उपयोग करके, पिगमेम में रेखाओं से बाहर सर्कल आकार बनाना है। तो मैंने फैसला किया कि मैं pygame.draw.line फ़ंक्शन देता हूं: स्क्रीन, aRandomColor, startPosition, और endingPosition तर्क के रूप में। समापन स्थिति एक टुपल है जिसमें यादृच्छिक रूप से जेनरेट किया गया x मान होता है, और एक सहायक फ़ंक्शन सर्कल के त्रिज्या के आधार पर y मान की गणना करेगा।पायथन दूरी सूत्र समन्वय विमान त्रुटि

import math 
import random 

def findY(pos1, pos2, distance, bothValues=False): 
    p1 =pos1 
    p2 = pos2 
    x1 = float(p1[0]) 
    y1 = float(p1[1]) 
    x2 = float(p2[0]) 
    d = float(distance) 

    y2 = y1 - math.sqrt(d**2 - (x1-x2)**2) 
    _y2 = y1 + math.sqrt(d**2 - (x1-x2)**2) 
    if bothValues==True: 
     return y2, _y2 
    else: 
     return y2 

और लाइन दराज:

width = 500 
height = 500 

def randLine(surface, color=rand, start=rand, end=rand,length=rand): 
    if start==rand: 
     start = randPos() 
    if end==rand: 
     end = randPos() 
    if color==rand: 
     color = randColor() 
    if length != rand: 

     end_x = float(random.randint(0,width)) 
     end_pos = (end_x, "y") 
     y2=findMissing(start_pos, end_pos,l,bothValues=True) 
     a = random.randint(0,1) 
     if a==0: 
      y2 = float(y2[0]) 
     else: 
      y2 = float(y2[1]) 
     lst = list(end_pos) 
     lst[1] = y2 
     end_pos = tuple(lst) 
    pygame.draw.line(surface, color, start_pos, end_pos) 

तब:

drawRandLine(screen,start=(200,200),lenght=100) 

(अन्य कार्यों है कि नहीं कर रहे उन लोगों randPos तरह तथाकथित 'मेरा पहला समारोह इस तरह y मान की गणना समस्या नहीं है)। किसी कारण से यह एक त्रुटि उत्पन्न हुई जिसे मैंने math.sqrt() के अंदर मान के रूप में निदान किया था, ऋणात्मक संख्या थी। लेकिन ऐसा नहीं हो सकता है, क्योंकि इसमें हर मूल्य 2 की शक्ति में उठाया जाता है, और यही वह है जो मैं उलझन में हूं। इसलिए मैंने math.sqrt() के भीतर मान को अपने पूर्ण मान में बदल दिया। यह बनाया समारोह किसी भी त्रुटि उठाना नहीं है, लेकिन वृत्त तैयार इस तरह देखा:

wacky inverted circloid

मुझे पता है कि pygame के विमान के y मूल्यों समन्वय उल्टा है, लेकिन यह एक फर्क करना चाहिए?

+1

वे देखें * संदिग्ध * जैसे [हाइपरबोलस] (https://en.wikipedia.org/wiki/Hyperbola) ... –

+0

वे एक्स अक्ष में एक दूसरे के विपरीत हैं, यही कारण है कि वे घुमावदार दिखते हैं। – Vityou

+3

'math.sqrt (d ** 2 - (x1-x2) ** 2 में' sqrt' के अंदर मान 'वास्तव में ऋणात्मक संख्या हो सकता है, यदि 'abs (d) Galax

उत्तर

3

कोणों से आ समान वितरण हो रही 0 और 2 * math.pi के बीच एक यादृच्छिक कोण theta उत्पन्न, और त्रिकोणमिति का उपयोग पंक्ति के अंत बिंदु के समन्वय को खोजने के लिए किया जाएगा करने का एक तरीका:

def drawRandLineTrig(start_pos, length): 
    theta = random.rand() * 2 * math.pi 
    end_pos = (start_pos[0] + length*math.cos(theta), start_pos[1] + length*math.sin(theta)) 
    # ... 
0

मैं कर सकता:

def randPos(origin=(0,0), xdis=width, ydis=height): 
    randx = random.randint(float(origin[0])-xdis,float(origin[0])+xdis) 
    randy = random.randint(float(origin[1])-ydis,float(origin[1])+ydis) 
    return (randx, randy) 

def drawRandLine(surface, color=random, start_pos=random, end_pos=random,l=random): 
    if start_pos==random: 
     start_pos = randPos() 
    if end_pos==random: 
     end_pos = randPos() 
    if color==random: 
     color = randColor() 
    if l != random: 
     b = random.randint(0,1) 
     l=float(l) 
     origin = start_pos 
     dis = l 
     if b==0: 
      end_x = float(random.randint((origin[0]-dis),(origin[0]+dis))) 
      end_pos = (end_x, "y") 
      y2=findMissing(start_pos, end_pos,l,bothValues=True) 
      a = random.randint(0,1) 
      if a==0: 
       y2 = float(y2[0]) 
      else: 
       y2 = float(y2[1]) 
      lst = list(end_pos) 
      lst[1] = y2 
      end_pos = tuple(lst) 
     else: 
      end_y = float(random.randint((origin[1]-dis),(origin[1]+dis))) 
      end_pos = ("x", end_y) 
      x2=findMissing(start_pos, end_pos,l,bothValues=True) 
      a = random.randint(0,1) 
      if a==0: 
       x2 = float(x2[0]) 
      else: 
       x2 = float(x2[1]) 
      lst = list(end_pos) 
      lst[0] = x2 
      end_pos = tuple(lst) 

    pygame.draw.line(surface, color, start_pos, end_pos) 

जो एक नकारात्मक समस्या का sqrt ठीक करता है, और गणना एक्स या वाई, और निर्दिष्ट लंबाई के लिए अपनी सीमाओं की स्थापना, रों से बचने के लिए या तो द्वारा लाइनों का एक समरूप वितरण स्थानों कुछ लाइनों की लंबाई लंबाई।

+0

मेरा सुझाव व्यावहारिक रूप से 1-लाइनर है हालांकि। कार्यान्वित करने के लिए आसान, समान रूप से वितरित कोण प्रदान करता है, और इसमें बेहतर प्रदर्शन होता है- उनमें से प्रत्येक यादृच्छिक संख्या लगभग 6 गुना लेती है जब तक कि प्रत्येक ट्रिग फ़ंक्शंस मैंने जोड़ा है। – Galax

+0

पायथन उपयोग taylor श्रृंखला में ट्रिगर कार्यों नहीं है? – Vityou

+0

मुझे यकीन नहीं है, मुझे शक है क्योंकि पाइथन के ट्रिग फ़ंक्शंस बहुत तेज हैं।मैंने दो संस्करणों को प्रोफाइल करने के लिए जल्दी से 'टाइमिट' का उपयोग किया, मेरे दो लाइन फ़ंक्शन 'end_pos' को आपके कोण के लगभग 1/10 में समान कोणों के साथ बनाता है। – Galax

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