File: fraction.py

package info (click to toggle)
pysiogame 4.20.01-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 27,876 kB
  • sloc: python: 48,742; xml: 3,813; sh: 30; makefile: 11
file content (149 lines) | stat: -rw-r--r-- 5,611 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# -*- coding: utf-8 -*-

import pygame
from math import pi, cos, sin


class Fraction:
    def __init__(self, unit_size, scale, color1, color2, numbers, fract_type):
        self.size = unit_size * scale
        self.center = [self.size // 2, self.size // 2]

        self.color1 = color1
        self.color2 = color2
        self.numbers = numbers

        self.canvas = pygame.Surface([self.size, self.size - 1], flags=pygame.SRCALPHA)
        self.canvas.fill((0, 0, 0, 0))

        self.drawing_f = [self.draw_circles, self.draw_minicircles, self.draw_polygons, self.draw_petals]
        self.drawing_f[fract_type]()

    def get_canvas(self):
        return self.canvas

    def draw_circles(self):
        angle_step = 2 * pi / self.numbers[1]
        angle_start = -pi / 2
        angle_arc_start = -pi / 2
        r = self.size // 2 - self.size // 10
        m = (self.size - r * 2) // 2
        angle = angle_start
        angle_e = angle_arc_start + self.numbers[0] * 2 * pi / self.numbers[1]

        i = 0
        while angle < angle_e:  # maximum of 158 lines per pi
            x = (r - 2) * cos(angle) + self.center[0]
            y = (r - 2) * sin(angle) + self.center[1]
            pygame.draw.line(self.canvas, self.color1, [self.center[0], self.center[1]], [x, y], 3)
            i += 1
            angle = angle_start + 0.02 * (i)

        pygame.draw.ellipse(self.canvas, self.color2, (m, m, self.size - m*2, self.size - m*2), 1)
        #pygame.draw.ellipse(self.canvas, self.color2, (11, 11, self.size - 22, self.size - 22), 1)
        r = r - 1
        for i in range(self.numbers[1]):
            # angle for line
            angle = angle_start + angle_step * i
            # Calculate the x,y for the end point
            x = r * cos(angle) + self.center[0]
            y = r * sin(angle) + self.center[1]

            # Draw the line from the self.center to the calculated end point
            pygame.draw.line(self.canvas, self.color2, [self.center[0], self.center[1]], [x, y], 1)

    def draw_polygons(self):
        half = False
        self.numbers = self.numbers[:]
        if self.numbers[1] == 2:
            self.numbers[1] = 4
            half = True
        angle_step = 2 * pi / self.numbers[1]
        angle_start = -pi / 2
        r = self.size // 2 - self.size // 10
        angle = angle_start

        r = r - 1
        x = r * cos(angle) + self.center[0]
        y = r * sin(angle) + self.center[1]
        prev = [self.center[0], self.center[1]]

        lines = []
        multilines = []
        points = []
        points.append(prev)

        for i in range(self.numbers[1] + 1):
            # angle for line
            angle = angle_start + angle_step * i
            # Calculate the x,y for the end point
            if i > 0:
                x = r * cos(angle) + self.center[0]
            else:
                x = self.center[0]

            y = r * sin(angle) + self.center[1]
            # Draw the line from the self.center to the calculated end point

            if half is False or (half is True and i % 2 == 0):
                multilines.append([[self.center[0], self.center[1]], [x, y]])

            lines.append(prev)
            prev = [x, y]
            if (half is False and i < self.numbers[0] + 1) or (half is True and i < 3):
                points.append(prev)

        points.append(self.center)
        pygame.draw.polygon(self.canvas, self.color1, points, 0)

        lines.append([x, y])
        # pygame.draw.aalines(self.canvas, self.color2, True, lines, True)
        pygame.draw.lines(self.canvas, self.color2, True, lines, 1)
        for each in multilines:
            pygame.draw.line(self.canvas, self.color2, each[0], each[1], 1)

    def draw_minicircles(self):
        angle_step = 2 * pi / self.numbers[1]
        angle_start = -pi / 2
        r = self.size // 3.5
        # manually draw the arc - the 100% width of the arc does not impress

        for i in range(self.numbers[1]):
            # angle for line
            angle = angle_start + angle_step * i

            # Calculate the x,y for the end point
            x = r * cos(angle) + self.center[0]
            y = r * sin(angle) + self.center[1]
            if i < self.numbers[0]:
                pygame.draw.circle(self.canvas, self.color1, [int(x), int(y)], self.size // 7, 0)
            pygame.draw.circle(self.canvas, self.color2, [int(x), int(y)], self.size // 7, 1)
            # Draw the line from the self.center to the calculated end point

    def draw_petals(self):
        angle_step = 2 * pi / self.numbers[1]
        angle_start = -pi / 2
        r = self.size // 3 + self.size // 10

        multilines = []
        for i in range(self.numbers[1]):
            # angle for line
            angle = angle_start + angle_step * i

            # Calculate the x,y for the end point
            x = r * cos(angle) + self.center[0]
            y = r * sin(angle) + self.center[1]

            x2 = (r - self.size // 10) * cos(angle - 0.3) + self.center[0]
            y2 = (r - self.size // 10) * sin(angle - 0.3) + self.center[1]

            x3 = (r - self.size // 10) * cos(angle + 0.3) + self.center[0]
            y3 = (r - self.size // 10) * sin(angle + 0.3) + self.center[1]

            points = [self.center, [x2, y2], [x, y], [x3, y3]]

            if i < self.numbers[0]:
                pygame.draw.polygon(self.canvas, self.color1, points, 0)
            # Draw the line from the self.center to the calculated end point
            multilines.extend(points)
        pygame.draw.lines(self.canvas, self.color2, True, multilines, 1)