kopia lustrzana https://github.com/villares/sketch-a-day
				
				
				
			
		
			
				
	
	
		
			61 wiersze
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			61 wiersze
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| def poly(p_list, closed=True):
 | |
|     beginShape()
 | |
|     for p in p_list:
 | |
|         if p[2] == 0:
 | |
|             vertex(p[0], p[1])
 | |
|         else:
 | |
|             vertex(*p)
 | |
|     if closed:
 | |
|         endShape(CLOSE)
 | |
|     else:
 | |
|         endShape()
 | |
| 
 | |
| def poly_arc_augmented(p_list, r_list):
 | |
|     a_list = []
 | |
|     for i1 in range(len(p_list)):
 | |
|         i2 = (i1 + 1) % len(p_list)
 | |
|         p1, p2, r1, r2 = p_list[i1], p_list[i2], r_list[i1], r_list[i2]
 | |
|         a = circ_circ_tangent(p1, p2, r1, r2)
 | |
|         a_list.append(a)
 | |
|         # ellipse(p1.x, p1.y, 2, 2)
 | |
| 
 | |
|     for i1 in range(len(a_list)):
 | |
|         i2 = (i1 + 1) % len(a_list)
 | |
|         p1, p2, r1, r2 = p_list[i1], p_list[i2], r_list[i1], r_list[i2]
 | |
|         #ellipse(p1.x, p1.y, r1 * 2, r1 * 2)
 | |
|         a1 = a_list[i1]
 | |
|         a2 = a_list[i2]
 | |
|         if a1 and a2:
 | |
|             start = a1 if a1 < a2 else a1 - TWO_PI
 | |
|             arc(p2.x, p2.y, r2 * 2, r2 * 2, start, a2)
 | |
|         else:
 | |
|             # println((a1, a2))
 | |
|             ellipse(p1.x, p1.y, r1 * 2, r1 * 2)
 | |
|             ellipse(p2.x, p2.y, r2 * 2, r2 * 2)
 | |
| 
 | |
| 
 | |
| def circ_circ_tangent(p1, p2, r1, r2):
 | |
|     d = dist(p1.x, p1.y, p2.x, p2.y)
 | |
|     ri = r1 - r2
 | |
|     line_angle = atan2(p1.x - p2.x, p2.y - p1.y)
 | |
|     if d > abs(ri):
 | |
|         theta = asin(ri / float(d))
 | |
| 
 | |
|         x1 = cos(line_angle - theta) * r1
 | |
|         y1 = sin(line_angle - theta) * r1
 | |
|         x2 = cos(line_angle - theta) * r2
 | |
|         y2 = sin(line_angle - theta) * r2
 | |
|         # line(p1.x - x1, p1.y - y1, p2.x - x2, p2.y - y2)
 | |
| 
 | |
|         x1 = -cos(line_angle + theta) * r1
 | |
|         y1 = -sin(line_angle + theta) * r1
 | |
|         x2 = -cos(line_angle + theta) * r2
 | |
|         y2 = -sin(line_angle + theta) * r2
 | |
|         line(p1.x - x1, p1.y - y1, p2.x - x2, p2.y - y2)
 | |
|         return (line_angle + theta)
 | |
|     else:
 | |
|         line(p1.x, p1.y, p2.x, p2.y)
 | |
|         return None
 |