2015-11-29 16 views
5

Mục tiêu của tôi là tạo hình tròn ra khỏi các đường trong pygame, sử dụng các điểm cuối ngẫu nhiên xung quanh mép của hình tròn và điểm bắt đầu không đổi (giữa vòng tròn). Vì vậy, tôi quyết định rằng tôi sẽ cung cấp cho hàm pygame.draw.line: screen, aRandomColor, startingPosition và endingPosition làm đối số. Vị trí kết thúc là một bộ chứa giá trị x được tạo ngẫu nhiên và hàm trợ giúp sẽ tính giá trị y dựa trên bán kính của vòng tròn. Chức năng đầu tiên của tôi tính toán giá trị y như thế này:sai số phối hợp công thức khoảng cách python

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 

và dòng ngăn kéo:

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) 

Sau đó:

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

(các chức năng khác mà những cái gọi là như randPos aren' t vấn đề). Điều này vì một số lý do đã tạo ra lỗi mà tôi đã chẩn đoán là giá trị bên trong math.sqrt() là một số âm. Nhưng điều đó không thể xảy ra, vì mọi giá trị trong đó được nâng lên thành lũy thừa của 2, và đó là điều tôi đang bối rối. Vì vậy, tôi đã thay đổi giá trị bên trong math.sqrt() thành giá trị tuyệt đối của nó. Điều này làm chức năng không tăng bất kỳ lỗi nào, nhưng vòng tròn vẽ trông như thế này:

wacky inverted circloid

Tôi biết của pygame rằng giá trị tọa độ y của máy bay lộn ngược, nhưng mà nên tạo sự khác biệt?

+1

Những giao diện * đáng ngờ * như [hyperbolas] (https://en.wikipedia.org/wiki/Hyperbola) ... –

+0

Chúng là nghịch đảo của nhau trên trục x, đó là lý do tại sao chúng trông cong. – Vityou

+3

Giá trị bên trong 'sqrt' trong' math.sqrt (d ** 2 - (x1-x2) ** 2) 'thực sự có thể là số âm, nếu' abs (d) Galax

Trả lời

3

Một cách để nhận aa phân phối thống nhất của góc sẽ là để tạo ra một góc ngẫu nhiên theta giữa 02 * math.pi, và sử dụng lượng giác để tìm tọa độ của điểm cuối dòng:

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

tôi có thể làm:

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) 

nào ấn định sqrt của một vấn đề tiêu cực, và đặt một phân bố của các dòng bằng một trong hai tính x OR y, và thiết lập các giới hạn của họ với độ dài nhất định, để tránh s chiều dài của một số dòng.

+0

Đề xuất của tôi là thực tế là một lớp lót mặc dù. Dễ dàng hơn để thực hiện, cung cấp góc độ phân bố đồng nhất, và có hiệu suất tốt hơn nhiều - mỗi số ngẫu nhiên mất khoảng 6 lần miễn là mỗi chức năng trig tôi thêm vào. – Galax

+0

Không phải chức năng trig trong python sử dụng chuỗi taylor? – Vityou

+0

Tôi không chắc chắn, tôi nghi ngờ nó là hàm trig của Python rất nhanh.Tôi đã nhanh chóng sử dụng 'timeit' để lược tả hai phiên bản, hàm hai dòng của tôi tạo ra' end_pos' với các góc đồng nhất trong khoảng 1/10 thời gian của bạn. – Galax

Các vấn đề liên quan